理解RNN以及模型搭建代码

本文详细解释了RNN模型的构成,包括单个神经元和多层RNN的工作原理,以及梯度消失和梯度爆炸问题。通过实例演示了如何使用PyTorch搭建一个50个隐藏层的RNN模型,并对比了RNN与CNN在神经元状态处理上的区别。
摘要由CSDN通过智能技术生成

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单个神经元有两个输入两个输出,两个输入:一个来自上一个状态 t,一个来自上一层,两个输出:一个去了下一层,一个去了下一个状态 t。如图:

在上面图中,你将单个神经元位置的时间线放出来就是这个结构。是不是有种峰回路转,柳暗花明的感觉。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值