Tensorflow 用Vanilla Numpy计算LSTM
我将LSTM结果与Keras/Tensorflow计算和Numpy计算进行了比较。但是,结果略有不同:Tensorflow 用Vanilla Numpy计算LSTM,tensorflow,keras,lstm,Tensorflow,Keras,Lstm,我将LSTM结果与Keras/Tensorflow计算和Numpy计算进行了比较。但是,结果略有不同: Numpy: [[ 0.16315128 -0.04277606 0.26504123 0.08014129 0.38561829]] Keras: [[ 0.16836338 -0.04930305 0.25080156 0.08938988 0.3537751 ]] Keras的LSTM实现不使用tf.contrib.rnn,但Keras直接管理参数,并使用tf.matmul进行计算。我
Numpy: [[ 0.16315128 -0.04277606 0.26504123 0.08014129 0.38561829]]
Keras: [[ 0.16836338 -0.04930305 0.25080156 0.08938988 0.3537751 ]]
Keras的LSTM实现不使用tf.contrib.rnn
,但Keras直接管理参数,并使用tf.matmul
进行计算。我找到了Keras的相应实现,并尝试使用Numpy进行相同的计算,但值稍有不同,如上图所示
我已经检查了好几次这个公式,看起来都一样。唯一的区别是tf.matmul
或np.dot
之间的差异。小数点的计算方法可能有些不同。即便如此,我认为结果还是太不一样了。最大的差别是大约10%。我想把Numpy计算和tensorflow计算相匹配。如果有人能给我一些提示或给我指出正确的实现,我将非常感激
Keras实施和Numpy代码由我自己实施:
- 凯拉斯:
- 努比:
LSTM
层,反复激活的默认值为'hard\u sigmoid'
。但是,在NumPy实现中使用了原始的sigmoid函数
因此,您可以将重复激活
参数更改为'sigmoid'
model.add(LSTM(5,输入形状=(8,3),重复激活=(sigmoid'))
或者在NumPy代码中使用“硬”sigmoid函数
def hard_sigmoid(x):
返回np.剪辑(0.2*x+0.5,0,1)
如果您多次运行这两种实现中的任何一种,由于随机初始化,我希望您在每次运行时得到不同的答案。对每个模型进行测试,看看从一次运行到下一次运行的典型差异是什么。我的猜测是,在这种情况下,这些数字看起来完全合理。@DavidParks你是对的。但每次我得到的结果都略有不同,这就是我为什么问的原因。太好了!我发现,在Keras实现中,反复激活的初始值是hard\u sigmoid
。我能解决这个问题。非常感谢。