pytorch(十)循环神经网络

卷积神经网络与循环神经网络的区别

卷积神经网络

卷积神经网络主要用语处理图像、语音等空间数据,它的特点是局部连接和权值共享,减少了参数的数量。CNN通常包括卷积层、池化层和全连接层,卷积层用于提取输入数据的特诊,池化层用语降维和压缩特征,全连接层将特征映射到更加高维度的空间中。

卷积神经网络在处理空间数据的时候,其输入通常是一个二维或者三维的张亮,每一个元素对应一个输出。CNN通过卷积操作获取特征,这些特征往往是局部相关的,即每个特征都与输入数据的一个局部区域相关联(相邻的特征往往具有相似性)。

循环神经网络

循环神经网络主要用于处理序列数据,比如自然语言处理、语音识别和时间序列预测(具有时间依赖的数据),它的特点是具有时间轴,能够保留和处理序列中的历史信息。RNN包括循环层,能够接收前一层的信息并且与当前的输入结合,生成当前的输出序列。

循环神经网络处理的数据往往是序列数据,即输入的数据是一个序列,每一个时间步都有一个对应的输出,RNN通过循环层保留和传递历史信息,从而建立时间上的依赖关系。

循环神经网络也使用到了权值共享的想法,RNN在不同的时间位置共享参数(CNN在不同的空间位置共享参数)

RNN cell结构

RNN cell的结构在本质上类似于传统的神经网络模型(输入层、隐藏层、输出层),但是RNN于传统的NN最大的区别在于:隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出,其结构如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在多对多的情况下,需要为序列中的每个点做出决定,比如说视频分类,需要为视频中的每一个帧进行分类,这个时候我们可以加上另一个权重矩阵 W T W_T WT,是的我们可以输出 Y Y Y,然后处理得到标签 L n L_n Ln进行预测,然后我们也可以在每一个时间步上应用损失函数来训练模型:每一个时间步的损失加在一起就是最终损失,然后就可以进行反向传播

而对于多对一的情况,我们可以最终产生一个标签,比如说我们想对整个视频序列做一个分类,那么我们可以连接我们的模型,在序列的最后做一个预测。

在这里插入图片描述

num_layers:

在这里插入图片描述

例子 seq2seq

需要把 hello 序列经过训练变成 ohlol 序列,x=[x1,x2,x3,x4,x5]

在这里插入图片描述

将序列数据转变成向量,一般转换为独热向量

在这里插入图片描述

import torch

batch_size=1
input_size=4
hidden_size=4

idx2char=['e','h','l','o']
# 字典转变
x_data=[1,0,2,2,3]
y_data=[3,1,2,3,2]

one_hot_looup=[[1,0,0,0],
              [0,1,0,0],
              [0,0,1,0],
              [0,0,0,1]]

x_one_hot=[one_hot_looup[x] for x in x_data]
inputs=torch.Tensor(x_one_hot).view(-1,batch_size,input_size)
labels=torch.LongTensor(y_data).view(-1,1)

class Model(torch.nn.Module):
    def __init__(self,input_size,hidden_size,batch_size):
        super(Model,self).__init__()
        self.batch_size=batch_size
        self.input_size=input_size
        self.hidden_size=hidden_size
        
        self.rnncell=torch.nn.RNNCell(input_size=self.input_size,hidden_size=self.hidden_size)
        
    def forward(self,input,hidden):
        hidden=self.rnncell(input,hidden)
        return hidden
    
    # h0
    def init_hidden(self):
        return torch.zeros(self.batch_size,self.hidden_size)
    
net=Model(input_size,hidden_size,batch_size)
criterion=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(net.parameters(),lr=0.1)

for epoch in range(15):
    loss=0
    optimizer.zero_grad()
    hidden=net.init_hidden()
    print('Predicted string:',end='')
    for input,label in zip(inputs,labels):
        hidden=net(input,hidden)
        loss+=criterion(hidden,label)
        _,idx=hidden.max(dim=1)
        print(idx2char[idx.item()],end='')
        
    loss.backward()
    optimizer.step()
    print(',Epoch [%d/15] loss=%.4f'%(epoch+1,loss.item()))

在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-12 08:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-12 08:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-12 08:06:01       82 阅读
  4. Python语言-面向对象

    2024-03-12 08:06:01       91 阅读

热门阅读

  1. Python学习笔记之列表

    2024-03-12 08:06:01       48 阅读
  2. 20240311按键输入实验

    2024-03-12 08:06:01       41 阅读
  3. 使用协程库httpx并发请求

    2024-03-12 08:06:01       44 阅读
  4. 测试推拉视频

    2024-03-12 08:06:01       40 阅读
  5. 前端前置知识pnpm

    2024-03-12 08:06:01       43 阅读
  6. 分布式ID(7):Zookeeper实现分布式ID生成

    2024-03-12 08:06:01       44 阅读
  7. vue的axios是干什么的

    2024-03-12 08:06:01       45 阅读
  8. 迷宫可行路径数

    2024-03-12 08:06:01       49 阅读