【23-24 秋学期】NNDL 作业11 LSTM

本文介绍了如何在Numpy和nn.LSTMCell/nn.LSTM框架下推导LSTM网络中的参数梯度,并探讨了梯度消失问题。通过编程实现和实验,作者分享了对LSTM循环单元的理解和遇到的问题.
摘要由CSDN通过智能技术生成

习题6-4  推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果

习题6-3P  编程实现下图LSTM运行过程

1. 使用Numpy实现LSTM算子

代码:

比较简单,容易理解,但是这个int()不能随便用,因为这个他不会四舍五入。

import numpy as np


def Sigmod(x):
    return 1 / (1 + np.exp(-x))


def guizheng(x):
    if x > 0.9:
        x = 1
    if x < 0.1:
        x = 0
    return x


LE = np.array([[1, 0, 0],
               [3, 1, 0],
               [2, 0, 0],
               [4, 1, 0],
               [2, 0, 0],
               [1, 0, 1],
               [3, -1, 0],
               [6, 1, 0],
               [1, 0, 1]])
input_w = np.array([1, 0, 0, 0])
input_gate = np.array([0, 100, 0, -10])
forget_gate = np.array([0, 100, 0, 10])
output_gate = np.array([0, 0, 100, -10])
# print(Sigmod(np.dot([1, 0, 0, 0], input_gate)))
h = 0
ht = []
c = []
ht.append(h)
i = 0
for x in LE:
    x = np.append(x, [1])
    # 输入计算
    ig = guizheng(Sigmod(np.dot(x, input_gate))) * x[0]  # 不再增加多的门了,就用x[0]代替了
    # 记忆参数
    fg = guizheng(Sigmod(np.dot(x, forget_gate)))
    print(ig, fg, ht[i])
    # 记忆单元
    fg = fg * (ig + ht[i])
    ht.append(int(fg))
    # 输出计算
    og = guizheng(Sigmod(np.dot(x, output_gate))) * fg
    c.append(int(og))
    i = i + 1

hr = []
for i in range(len(c)):
    hr.append(ht[i])
print("记忆单元:", hr)
print("输出结果:", c)

结果:

结果中列出了一些相关数据,跟方便观察。

0 1 0
3 1 0
0 1 3
4 1 3
0 1 7
0 1 7
0 0 7
6 1 0
0 1 6
记忆单元: [0, 0, 3, 3, 7, 7, 7, 0, 6]
输出结果: [0, 0, 0, 0, 0, 7, 0, 0, 6]

2. 使用nn.LSTMCell实现

3. 使用nn.LSTM实现

对于以上两题,我没有很好的思路,在参考了其他同学写的代码之后,感觉貌似也没有完全实现本体中所要求的效果,究其原因是因为本题中的例子中的,主要参考的是同学的例子,这里就不列出来了。

在学习他人的例子中,我感觉到我的numpy的代码似乎也有一点问题,缺少某一些步骤,但是我也还没发现具体是哪里出了问题,因为他们的那些加入了和rnn以及rnncell中的tanh函数就得出了正确的结论,但是我的加上还是出了问题,所以还是有很大的问题的。

心得体会:

本次实验主要进行了对LSTM的深入了解,通过与课堂上的知识的串通,感觉好理解了一点,但是代码实现上还是有很大的问题,尤其是对于这个循环单元还需要在学习学习。

参考:

【23-24 秋学期】NNDL 作业11 LSTM-CSDN博客

NNDL 作业11 LSTM:避免梯度消失分析+numpy代码+nn.LSTMCell+nn.LSTM实现-CSDN博客

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值