CuDNNLSTM(而不是 LSTM)层的意外结果

Unexpected results with CuDNNLSTM (instead of LSTM) layer

我已将此问题作为 issue 发布在 Keras 的 Github 中,但我认为它可能会在这里吸引更广泛的受众。


系统信息

描述当前行为
我正在执行来自 Seq2Seq tutorial 的代码。我所做的唯一更改是将 LSTM 层替换为 CuDNNLSTM。发生的事情是模型预测我给它的任何输入的固定输出。当我 运行 原始代码时,我得到了合理的结果。

描述预期行为
请参阅上一节。

重现问题的代码
摘自 here。只需将 LSTM 替换为 CuDNNLSTM。


非常感谢任何见解。

所以这里有两个问题。
使用 CuDNNLSTMparameter tuning.
基本上,网络在您的数据集上过度拟合,导致每个输入的输出只有一个句子。这既不是 CuDNNLSTM 的错,也不是 LSTM 的错。

首先,
CuDNN 与常规 LSTM 有一些不同的数学,使其与 Cuda 兼容并且 运行 更快。对于您使用的相同代码,LSTM 在 eng-hindi 文件上 运行 需要 11 秒,而每个时期 CuDNNLSTM 需要 1 秒。

在 CuDNNLSTM 中 time_major 参数设置为 false。由于这个原因,网络过拟合。你可以查看一下here.
你可以清楚地看到像 eng-hin 或 eng-marathi 这样的小数据集,val-loss 在 30 个时期后增加。在您的 network loss 减少而 val_loss 增加的情况下,运行 网络更多是没有意义的。 LSTM的情况也是一样。

此处您需要 param tuning 用于小型数据集。

这里有一些链接可以提供帮助:

  1. Eng-Mar
  2. Pytorch translation tutorial
  3. and
  4. NMT-keras