习题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博客