【问题标题】:LSTM calculation with Vanilla Numpy使用 Vanilla Numpy 进行 LSTM 计算
【发布时间】:2018-04-10 17:23:15
【问题描述】:

我将 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.matmulnp.dot 之间的区别。可能小数点计算方法有些不同。即便如此,我认为结果差异太大。最大的差异约为 10%。我想将 Numpy 计算与 tensorflow 计算相匹配。如果有人能给我一些提示或指出正确的实现方式,我将不胜感激。

Keras 实现和我自己实现的 Numpy 代码:

【问题讨论】:

  • 如果您多次运行这些实现中的任何一个,我希望您在每次运行时都会得到不同的答案,因为随机初始化。对每个模型进行尝试,看看从一次运行到下一次运行的典型差异是什么。我的猜测是,在这种情况下,这些数字看起来非常合理。
  • @DavidParks 你是对的。但我每次得到的结果都略有不同,这就是我问的原因。

标签: tensorflow keras lstm


【解决方案1】:

对于 Keras LSTM 层,recurrent_activation 的默认值是 'hard_sigmoid'。但是,您的 NumPy 实现中使用了原始的 sigmoid 函数。

因此,您可以将 recurrent_activation 参数更改为 'sigmoid'

model.add(LSTM(5, input_shape=(8, 3), recurrent_activation='sigmoid'))

或在 NumPy 代码中使用“硬”sigmoid 函数。

def hard_sigmoid(x):
    return np.clip(0.2 * x + 0.5, 0, 1)

【讨论】:

  • 太棒了!我发现在 Keras 实现中,recurrent_activation 的初始值是hard_sigmoid。我能够解决这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2021-10-04
  • 2014-10-22
  • 2017-12-13
  • 2015-11-23
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多