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

时间:2019-06-28 05:03:45

标签: python tensorflow keras deep-learning keras-layer

我在Keras的Github中以issue的形式发布了这个问题,但认为它可能会在这里吸引更多的受众。


系统信息

  • 我是否编写了自定义代码(与使用示例目录相对):对Keras官方教程的最小改动
  • OS平台和发行版(例如Linux Ubuntu 16.04): Ubuntu 18.04.2 LTS
  • TensorFlow后端(是/否):
  • TensorFlow版本: 1.13.1
  • Keras版本: 2.2.4
  • Python版本: 3.6.5
  • CUDA / cuDNN版本: 10.1
  • GPU模型和内存: Tesla K80 11G

描述当前行为
我正在执行Seq2Seq tutorial中的代码。我所做的唯一且唯一的更改是将 LSTM 层替换为 CuDNNLSTM 。发生的事情是该模型为我提供的任何输入预测了固定的输出。当我运行原始代码时,会得到明智的结果。

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

重现该问题的代码
取自here。只需用CuDNNLSTM替换LSTM。


任何见解都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

所以这里有两个问题。
使用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. Similar Question 2Similar Question 2
  4. NMT-keras