CuDNNLSTM(而不是 LSTM)层的意外结果
Unexpected results with CuDNNLSTM (instead of LSTM) layer
我已将此问题作为 issue 发布在 Keras 的 Github 中,但我认为它可能会在这里吸引更广泛的受众。
系统信息
- 我是否编写了自定义代码(而不是使用示例目录):对官方 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。只需将 LSTM 替换为 CuDNNLSTM。
非常感谢任何见解。
所以这里有两个问题。
使用 CuDNNLSTM
和 parameter 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
用于小型数据集。
这里有一些链接可以提供帮助:
我已将此问题作为 issue 发布在 Keras 的 Github 中,但我认为它可能会在这里吸引更广泛的受众。
系统信息
- 我是否编写了自定义代码(而不是使用示例目录):对官方 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。只需将 LSTM 替换为 CuDNNLSTM。
非常感谢任何见解。
所以这里有两个问题。
使用 CuDNNLSTM
和 parameter 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
用于小型数据集。
这里有一些链接可以提供帮助: