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

Ore*_*ija 5 python deep-learning keras tensorflow keras-layer

我已经在Keras的Github中将这个问题发布为问题,但认为它可能会在这里引起更多的读者。


系统信息

  • 我是否编写了自定义代码(与使用示例目录相对): 最小化对Keras官方教程的更改
  • 操作系统平台和发行版(例如,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 教程中的代码。我所做的唯一且唯一的更改是将LSTM层替换为CuDNNLSTM。发生的事情是该模型为我提供的任何输入预测了固定的输出。当我运行原始代码时,我得到了明智的结果。

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

代码来重现问题
来自这里。只需用CuDNNLSTM替换LSTM。


任何见解都将不胜感激。

ASH*_*Hu2 4

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

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

在 CuDNNLSTM 中,time_major参数设置为false。由于这个原因,网络过度拟合。您可以在这里查看。
对于像 eng-hin 或 eng-marathi 这样的小数据集,您可以清楚地看到val-loss30 个时期后的增长。network loss当您的网络不断减少和val_loss增加时,再运行更多网络是没有意义的。的情况LSTM也相同。

这里你需要param tuning小数据集。

以下是一些可以提供帮助的链接:

  1. 恩格马尔
  2. Pytorch翻译教程
  3. 类似问题2类似问题2
  4. NMT-keras