《PyTorch深度学习实践》学习笔记:循环神经网络(基础篇)


1. DNN

在这里插入图片描述
深度神经网络是稠密网络,Dense连接就是指全连接。有很多线性层对输入数据进行空间上的变换,又叫DNN。输入x1,x2,…,x8是数据样本的不同特征。

考虑这样一个场景:比如预测天天气,就需要知道之前几天的数据,每一天的数据都包含若个特征(温度、气压、雨天),如果你已知今天的温度、气压等特征去预测有没有雨,这是没有用的,需提前预测,需要之前若干天的数据作为输入。

假设现在取前3天,每一天有3个特征(温度、气压、雨天),如何预测第4天是否有雨?

第一种方法:把x1,x2,x3拼成有9个维度的长向量,然后去训练最后一天是否有雨。用全连接稠密网络进行预测,如果输入序列很长,而且每一个序列维度很高的话,对网络训练有很大挑战,因为稠密网络(全连接网络)实际上权重是最多的。
在这里插入图片描述
全连接网络的权重是最多的。
对比CNN网络和DNN网络的权重数量:
在这里插入图片描述
对于卷积层:比如输入通道是128个,输出通道是64个,如果用5x5的卷积,权重数就是 2564188=204800,卷积层的输入输出只与通道数和卷积核的大小有关,全连接层和变换之后的数据大小有关,比如3阶张量经过一系列的卷积变换还剩下4096个元素,4096我们很少直接降成1维或者10维,而是先降成1024维,全连接层的权重为4096*1024=4194304,所以相比起来,卷积层的权重并不多,而全连接层的权重较多。全连接层是在网络的全部参数中占大头的。

CNN在做卷积的时候,它的卷积核是共享的。所以它的权重数量比较少,它并不是图像上的每一个像素要和下一层的featureMap建立连接,权重数量就少。处理视频的时候,每一帧就少一张图像,我们需要把一组图像做成一个集合,如果用全连接网络的话,使用到的权重的数量就是一个天文数字,极大可能难以处理。

RNN是用来专门处理带有序列的数据,也会使用权重共享来减少权重的数量。它把x1,x2,x3看成是一个序列,不仅考虑x1,x2之间的连接关系,还考虑x1,x2的时间上的先后顺序(x2依赖于x1,x3依赖于x2),下一天的天气状况部分依赖于前一天的天气状况,RNN主要处理这种具有序列连接的数据。
在这里插入图片描述
数据是有先后顺序进行连接的,也就是当天数据会依赖之前数据。
哪些数据具有序列:股市、金融数据、自然语言(我爱北京天安门)
在这里插入图片描述

2. CNN

在这里插入图片描述

3. RNN

3.1 RNN的结构分析

RNN是循环神经网络。RNN其实是对线性层的复用。

RNN Cell本质是一个线性层(linear),把一个维度映射到另一个维度(比如把输入的3维向量xt变成输出5维向量ht)。 这个线性层与普通的线性层的区别是这个线性层是共享的。
在这里插入图片描述
右侧的结构是对左侧结构的展开。h0是一种先验知识,如果我们知道输出的维度,我们可以选择将其每一个维度都设置为0。也可以使用CNN+Fc的网络去生成先验知识,实现图像到文本的转换。

RNN相当于一个形成层,所以我们可以简单的用代码进行描述:

linear = Linear()
h = 0
for x in X:
    h = linear(x,h)
相当于
h1 = linear(x1,h0)
h2 = linear(x2,h1)
h3 = linear(x3,h2)
......

RNN的具体计算过程:
在这里插入图片描述
在这里插入图片描述
输入xt先做线性变换,ht-1也是,xt的维度是input_size,ht-1的维度是hidden_size,输出ht的维度是hidden_size。我们需要先把xt的维度变成hidden_size,所以Wih应该是一个 hidden_sizeinput_size的矩阵,Wihxt得到一个 hidden_size的矩阵(就是维度为hidden_size的向量),bih是偏置。输入权重矩阵Whh是一个hidden_size*hidden_size的矩阵。

Whhht-1+bhh和Wihxt+bih都是维度为hidden_size的向量,然后两个向量相加,就把信息融合起来了,融合之后用tanh做激活,循环神经网络的激活函数用的是tanh(为什么呢?因为tanh的取值在-1到+1之间),算出结果得到这一层的隐藏层输出ht。

补充:Tanh的诞生比Sigmoid晚一些,sigmoid函数我们提到过有一个缺点就是输出不以0为中心,使得收敛变慢的问题。而Tanh则就是解决了这个问题。Tanh就是双曲正切函数。等于双曲余弦除双曲正弦。函数表达式和图像见下图。这个函数是一个奇函数。
在这里插入图片描述
完整的定义RNN:将RNN cell以循环的形式一个一个送进去,然后依次算出隐藏层的过程,我们称之为循环神经网络。

3.2 RNN的使用分析

构造RNN的方式:

  1. 自己写处理序列的循环
  2. 直接使用RNN

3.2.1 RNN_cell的实现

在这里插入图片描述
主要是确定输入的维度和隐层的维度。
在这里插入图片描述
如上图,RNN本质上还是一个线性层,要弄清楚纬度。代码如下:

# pytorch实现
cell = torch.nn.RNNcell(input_size=input_size,hidden_size=hidden_size)
hidden = cell(input,hidden) # h1 = cell(x1,h0)

举例使用RNN Cell
在这里插入图片描述
输入有三个特征,每个特征是4维的。隐藏是一个2维的向量。
在这里插入图片描述

  • batchSize表示批量大小
  • seqLen=3表示每一个样本都有x1,x2,x3这些特征
  • inputSize=4表示每一个特征都是4维的
  • hiddenSize=2表示每一个隐藏层是2维的
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以发现,RNN相比之前的网络,多了一个序列的维度。
import torch

batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2

cell = torch.nn.RNNCell(input_size=input_size,hidden_size=hidden_size)

# (seq,batch,features)
dataset = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(batch_size,hidden_size)

for idx,input in enumerate(dataset):
    print("="*20,idx,"="*20)
    print("Input size:",input.shape)

    hidden = cell(input,hidden)
    print("Output size:",hidden.shape)
    print(hidden)

在这里插入图片描述

3.2.2 RNN的实现

使用RNN:
在这里插入图片描述
直接使用torch.nn.RNN()需要知道input_size、hidden_size和num_layers(RNN有多少层,默认为1)。cell(inputs,hidden)中 inputs指包含整个输入序列(x1,x2,x3,…xN),hidden指h0。
在这里插入图片描述
用RNN不用自己写循环,它自动循环,所以输入的时候要把所有的序列都送进去,然后给定h0,然后我们就会得到所有的隐层输出以及最后一层的输出。
在这里插入图片描述
在这里插入图片描述
当RNN有多层,同样颜色的RNNCell是同一个,所以上图是有3个线性层(一个RNNCell是一个线性层)。这样就能解释为什么隐藏层h的维度需要numLayers参数,因为每一层都需要。

输出:
在这里插入图片描述
输出与输入的区别就在于input_size变成了hidden_size
在这里插入图片描述

import torch

input_size = 4
hidden_size = 2
seq_len = 3
batch_size = 1
num_layers = 1

cell = torch.nn.RNN(hidden_size=hidden_size,input_size=input_size,num_layers=num_layers)

#(seq_len,batchsize,inputsize)
inputs = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(num_layers,batch_size,hidden_size)

out,hidden = cell(inputs,hidden)

print("output size:",out.shape)
print("output:",out)
print("Hidden size:",hidden.shape)
print("hidden:",hidden)

输出:
在这里插入图片描述
初次之外,还有一个batch_first参数可以设置:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值