RNN结构
这是一张不直观易懂的RNN结构示意图。但也是大家见得最多结构示意图。
RNN模型解释
RNN一文就讲解清楚的博客,看这里:https://zhuanlan.zhihu.com/p/408998328
RNN为什么梯度消失和梯度爆炸,看这里:https://zhuanlan.zhihu.com/p/564069442?utm_id=0
疑惑梳理
RNN模型是怎么构成的?
先别去想象那些时间传递的概念,现在你只知道单个单个的RNN神经元,我们用单个的RNN神经元排列成矩阵。
若矩阵3列50行,则可以想象为有三串RNN,每串 RNN神经元单元个数50个
这就是3层RNN,每层50个隐藏层的RNN结构。一般理解为存在一个隐藏单元就有一个RNN神经元单元
RNN层是什么?层与层之间传递吗?
层就是指一串RNN神经元单元,且单个神经元之间没有传递关系。
层与层之间,层对应相同位置的神经元之间才会有会有传递关系。
RNN如何发挥传递作用的?
RNN的传递作用是时间刻度上的,比如上面的结构,我们有3层RNN,每层50个隐藏层的RNN结构。
在训练时,每个单个RNN元素单元将当前的状态传递给下一个时间步同一位置的RNN神经元单元。在模型结构上,根本不存在RNN元素单元状态平行的传递给同一层其他结构的情况。
这里有个很重要的理解!!!很多博客都没讲清楚这一点。
同一层的RNN单个神经元是独立的神经元,没有传递关系。
RNN神经元的输入来自上一层的,一个RNN神经元有两个输出,一个去了下一层,一个去了下一个状态。如图:
在上面图中,你将单个神经元位置的时间线放出来就是这个结构。是不是有种峰回路转的感觉。
RNN,CNN神经元都是一个时间步对应输出一个不同的状态?他们有什么区别?
CNN的每个神经元元素状态只与当前输入有关,参数更新只与当前反向传播有关。
RNN的每个神经元元素状态不仅与当前输入有关还与这个元素之前的状态有关,参数更新也受之前状态和反向传播共同影响
50个隐藏层的RNN模型,如何训练60个数据长度的数据?
你忘了吗?
如下图,五个隐藏层训练了六个数据单元。
pytorch模型搭建
'''
模型搭建
'''
print("正在模型搭建 RnnModel--RNN(60, 50, 3) !!!")
class RnnModel(nn.Module):
def __init__(self):
super(RnnModel, self).__init__()
'''
参数解释:(输入维度,隐藏层维度,网络层数)
'''
self.rnn = nn.RNN(60, 50, 3, nonlinearity='tanh')
self.linear = nn.Linear(50, 2)
def forward(self, x):
r_out, h_state = self.rnn(x)
output = self.linear(r_out[:,-1,:]) # 将 RNN 层的输出 r_out 在最后一个时间步上的输出(隐藏状态)传递给线性层
return output