把RNN封装成一个函数

2017-11-26 20:31

         RNN(反馈式神经网络),即前面构建的那几个网络。由于它们都是反复使用相同的方法构建的神经网络,既费力又费时,鉴于每次构建的基本步骤都一样,于是我把构建的操作函数化,只要提供相应的参数,让计算机自动生成合适的神经网络。
        代码在最后,封装成的函数命名为“RNN”, 共有5个参数:

        RNN( X , Y , M , ALPHA , L)
        X指定输入层,目前只支持一位数组,默认为[0];
        Y指定理想值,一维数组,默认为[0];
        M指定训练次数,默认为0;
        ALPHA指定学习率(步长),默认为0.5;
        L是网络层数即每层的单元数,是一维数组,默认为[0],比如L=[10,5,4,3,2],指定隐含层有5层,每层的神经元数量分别为10、5、4、3、2,加上输入输出(X和Y),这样神经网络就有7层。
        w、b的取值均为随机数。
        使用tanh函数为激活函数,运行结果表明,tanh的确比sigma函数效果更好:
                激活函数:f(x)=tanh(x);它的导数:f'(x)=1-tanh(x)*tanh(x)
                激活函数:sigma(x)=1/(1+e^(-x));它的导数:sigma'(x)=sigma(x)*(1-sigma(x))

现在,尝试比较一下现在函数化的神经网络和之前构建的网络,假设输入层x=[10,20,30];y=0.23:
使用之前的四层神经网络,RNN()配置成和它一样的结构,运行结果如下:

图片
(上面为原四层神经网络,下面为RNN())
可以看出,使用了tanh函数的RNN()要比之前使用sigma函数的网络训练结果更好,收敛更快。但运行时间比后者略长。
训练50次后:

图片
(上面为原四层神经网络,下面为RNN())
它俩都是相同的网络结构,只是激活函数不同,可见运行结果是有很大差别的,通过i进一步测试表明,偏置b取得小一点比较好,在上面的测试中,当b<0.5时,会取得不错的效果,alpha值适宜取0.1~10。
代码如下:

(因为文本在qq日志中不容易显示出python语法缩进的特点,于是改用图片显示
图片

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nn.RNN是PyTorch中的一个循环神经网络模块。在反向传播过程中,它的更新方法与其他神经网络模块相似,但有一些特殊的考虑因素。 首先,我们需要定义一个损失函数来度量模型输出与目标值之间的差异。常见的损失函数包括均方误差(MSE)和交叉熵损失(Cross-Entropy Loss)等。 然后,我们需要计算损失函数对于模型参数的导数,以便进行梯度下降更新。在PyTorch中,这可以通过调用`loss.backward()`来实现。 在反向传播过程中,RNN模块的主要考虑因素是序列的依赖关系。由于RNN是一种具有记忆能力的网络,它会将前一个时间步的隐藏状态作为输入传递给当前时间步。因此,在反向传播过程中,需要从后向前逐个时间步计算梯度。 具体来说,反向传播过程可以分为以下几个步骤: 1. 将模型参数的梯度初始化为零。 2. 对于每个时间步,计算当前时间步的损失函数对于模型输出的梯度。 3. 根据当前时间步的梯度,计算当前时间步的损失函数对于模型参数的梯度,并将其累加到之前的梯度中。 4. 将当前时间步的梯度传递到前一个时间步,并重复步骤2和步骤3,直到计算完所有时间步的梯度。 5. 根据累计的梯度更新模型参数。 需要注意的是,PyTorch中的`nn.RNN`模块已经封装了反向传播的实现,我们只需定义好损失函数并调用`loss.backward()`即可完反向传播过程。同时,PyTorch还提供了各种优化器(如SGD、Adam等)来帮助我们更新模型参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值