【问题标题】:Keras: Loading model built with CuDNNLSTM on host without GPUKeras:在没有 GPU 的主机上加载使用 CuDNNLSTM 构建的模型
【发布时间】:2019-11-03 20:32:32
【问题描述】:

我训练了一个使用 CuDNNLSTM 单元的 keras 模型,现在希望将模型加载到缺少 GPU 的主机设备上。但是,因为CuDNNLSTM 单元需要 GPU,所以加载过程会爆炸,抛出:

没有注册 OpKernel 以支持具有这些属性的 Op 'CudnnRNN'。

是否有一些后门可以让我在没有 GPU 的主机上加载模型?任何建议都会非常有帮助!

【问题讨论】:

  • 也许你可以用 LSTM 替换它并加载权重并运行推理?
  • @kvish 有没有办法在加载模型之前改变 myModel.save() 的结果?我只是将模型解析为 h5 对象还是有更好的 API?
  • 您可以将模型解析为 json。它不会节省重量,只会节省架构。您可以使用 save_weights() 函数单独保存权重,然后使用 load_weights() 加载权重。这个FAQ 很好地概述了可用的选项。也许您可以将 LSTM 架构解析为 json,然后加载 json,然后加载权重?

标签: tensorflow keras


【解决方案1】:

注意:我使用的是 Keras 2.2.4 和 TensorFlow 1.12.0。 我能够通过以下步骤解决该问题:

1) 使用 CudnnLSTM 训练模型并保存模型 (model_GPU.json) 和权重 (*.h5)。

2)为LSTM定义相同的模型更改CudnnLSTM,这必须在没有GPU的系统/计算机中完成,然后您可以保存模型(model_CPU.json)。

2*) 在 LSTM 单元中设置activation='tanh',recurrent_activation='sigmoid'。因为这些是 CudnnLSTM 中的默认值。

3) 然后您可以加载带有使用 CudnnLSTM 训练的权重的 model_CPU.json。

具体来说,我使用了以下

CPU:

from keras.layers import LSTM

Bidirectional(LSTM(hidden_units_LSTM, return_sequences=True,activation='tanh',recurrent_activation='sigmoid'))(output)

GPU:

from keras.layers import CuDNNLSTM

Bidirectional(CuDNNLSTM(hidden_units_LSTM, return_sequences=True))(output)

【讨论】:

  • 阿门,我最终也做了同样的事情,但从未回过头来发布答案。感谢您写出步骤!
猜你喜欢
  • 2021-08-30
  • 2018-04-10
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多