tensorflow - cudnnLSTM 不会恢复为 cudnnCompatibleLSTM
问题描述
我正在尝试使用 TF 1.9 / 1.10 在 GPU 机器(AWS p3x2,Volta)上训练一个基本网络。不是 Keras——只有 TF。
根据 [相当有限的] 文档,我的目标是使用 cudnnLSTM 单元进行训练,保存检查点,然后恢复以在 CPU 上进行推理。根据这个目标,我认为 cudnnCompatibleLSTM 是可行的方法,因为它应该从 GPU 特定的 LSTM 实现中吸收权重。
无论我尝试什么,我都会收到以下错误:
NotFoundError (see above for traceback): Key caseTesting/testbed/rnn/multi_rnn_cell/cell_0/cudnn_compatible_lstm_cell/bias not found in checkpoint [[Node: caseTesting/testbed/save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT],
_device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_ caseTesting/testbed/save/Const_0_0, caseTesting/testbed/save/RestoreV2/tensor_names, caseTesting/testbed/save/RestoreV2/shape_and_slices)]]
另一个相关问题是 cudnnCompatibleLSTM 和 cudnnLSTM 在数学上并不相同。对于初始化的单元格,我得到不同的结果。[由一些 tf.constant() 作为初始化程序初始化,不保存/恢复]。似乎 cudnnLSTM 确实依赖于随机种子 [dropout 为零],这意味着正在进行一些独特的张量/张量初始化,将其与 cudnnCompatibleLSTM 分开。
有人有线索吗?
解决方案
一些答案:
假设您已阅读有关 cudnnLSTM + cudnnCompatibleLSTM 的文档 [很遗憾,它主要是代码中的文档]
- 构建两个图形替代方案,每个一个
- 不要给实际的 LSTM 单元命名[无范围]
with tf.variable_scope("cudnn_lstm"):
为 cudnnCompatible 块添加范围- 要保存检查点,请使用不限于可训练的保护程序(仔细控制保护程序构造的位置可以做到这一点,实际上,如果你真的需要它)
- 恢复:似乎您必须使用古老的方法进行恢复,而不是使用元文件。
关于 cudnnLSTM 和标准 LSTM 的数学不等式,没什么好说的。尚不确定如何将遗忘门初始化为 1.0,尽管我确信这可以通过一些黑客攻击来完成。
推荐阅读
- c# - 具有 iqueryable 的动态 linq 查询未正确评估
- powershell - 是否可以在 -Path 和 -DestinationPath 中使用 PSDrive 来使用 Compress-Archive?
- java - Veracode CWE ID 404 不正确的资源关闭或释放
- excel - 使用获取数据功能将 Google 工作表连接到 Excel 时被要求登录
- xamarin - webview加载html表单本地下载文件夹适用于IOS不适用于Xamarin表单中的Android
- python - Seaborn boxplot 和 regplot 转移
- amazon-rds - RDS 到光帆数据库迁移
- java - 尽管配置完整,但无法使用 Spring Security 将文件上传到 Spring MVC
- python - 使用两个现有列创建两个新列
- android - 当我回到 libgdx 中的上一个屏幕时如何运行我的代码?