Tensorflow 用Vanilla Numpy计算LSTM

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进行计算。我

我将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
进行计算。我找到了Keras的相应实现,并尝试使用Numpy进行相同的计算,但值稍有不同,如上图所示

我已经检查了好几次这个公式,看起来都一样。唯一的区别是
tf.matmul
np.dot
之间的差异。小数点的计算方法可能有些不同。即便如此,我认为结果还是太不一样了。最大的差别是大约10%。我想把Numpy计算和tensorflow计算相匹配。如果有人能给我一些提示或给我指出正确的实现,我将非常感激

Keras实施和Numpy代码由我自己实施:

  • 凯拉斯:
  • 努比:

对于Keras
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
。我能解决这个问题。非常感谢。