- 资源课程参考链接如下
- B站《Pytorch深度学习实践》完结合集 刘二大人
循环神经网络(基础篇)
以前在使用全连接神经网络时,这样的网络又称Dense/Deep 神经网络
其输出是样本的不同特征
现在引入另一个案例
每隔一个小时采集当前天的温度,气压,雨/晴的信息
而这样的数据在现实生活应用中是没有作用的,毕竟天气预报不能等到当天报23333333
那么我们改一改,即我们每一天都包含若干特征,输入包含若干天。通过前面的若干天的数据,预测出后一天的晴雨状况,perfect!(考虑对数据每四天进行分组,前三天的数据作为输入,第四天作为label,训练网络)
而如果考虑全连接神经网络例如讲前三天的特征数据进行拼接放入全连接神经网络进行运算
其计算量将会是个巨大的挑战
考虑这样一个问题
在CNN中,有这样一个网络层
inchannel 128
outchannel 64
kernel_size 5
若不计输入x的大小,则其计算次数等于55inchanneloutchannel = 5512864=204800
约为20w
而如果是一个全连接网络
如果是图像处理后还剩4096个元素,经过降维到1024
则其计算量为
4096*1024=4194304
约为400w
虽然卷积层复杂可是权重占比不高,而在神经网络的结构中,全连接神经网络往往占据着很大的比重
而卷积神经网络之所以占比重较小,主要是因为其权重共享的概念,即在处理图像数据时整个图像的卷积核是共享的(滑动)
故引申出RNN用于处理特定序列(时间,空间)数据,且引入权重共享的概念
再次应用上述例子
对于x1,x2,x3由其存在时间上的顺序关系,即后者依赖前者
什么是RNN
- RNN Cell
对于时刻t的数据xt(n维),经过RNNCell得到ht(m维)
故RNNCell其本质就是一个线性层,而其区别于其他线性层的是RNN的权重是共享的 - RNN
通常我们这样绘制RNN网络因为其权重共享,实质上我们只是运用了一个RNNCell而便于观察,我们可将其展开成如下所示
注意X={x1,x2…xn}为我们不用时刻输入的序列,而RNN Cell本质上是一个,这里的每一个单独的RNN Cell我们都可以认为是不同时刻的同一个Cell 由于其依赖关系,t-1时刻的输出(ht-1)需要作为t时刻的输入(xt+ht-1)
RNNCell结构图如下
分析一下维度 hidden_size -> h input_size = In
ht-1 h*1
whh[h,h]ht-1[h,1] + bhh[h,1] = x[h,1]
wih[h,In]xt[In1] + bih[h,1] = y[h,1]
tanh(x + y) = ht[h,1]
注意这里的whh bhh为hi共享的权重
wih bih即为xi共享的权重
构造RNN
两种方式
- 使用RNNCell 自己构造循环
cell = torch.nn.RNNCell(input_size=input_size,hidden_size=hidden_size)
#确定输入维度,隐藏维度即可确定cell
使用
举个例子
之所以把batchSize放到第二个,是因为训练的时候每次都是先拿出一批当前的时刻的数据作为输入
import torch
#parameter
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('outputs size',hidden.shape)
print(hidden)
-第二种方式 torch.nn.RNN