首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何保存和重新加载Keras编解码模型的隐藏状态以进行推理

如何保存和重新加载Keras编解码模型的隐藏状态以进行推理
EN

Stack Overflow用户
提问于 2019-08-22 13:58:59
回答 1查看 955关注 0票数 0

我正在研究一个序列,使用在Keras中使用LSTM层的编码器解码器架构来对文本生成进行序列排序。

我的代码是Keras seq2seq教程:seq2seq/的修改版本。

在对模型进行训练之后,我想建立一个推理模式,在这种模式下,我可以只使用所接受模型的隐藏状态来解码序列,而无需每次对整个模型进行再训练。我正在寻找一种方法将这些隐藏的LSTM状态保存到一个文件中,然后重新加载它们来建立我的推理模型。

模型培训部分的一部分如下所示:

代码语言:javascript
运行
复制
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)

稍后,我将需要隐藏的单元格状态和编码器输出(encoder_outputs、state_h和state_c)以同样的方式建立推理模型(如本教程):

代码语言:javascript
运行
复制
encoder_model = Model(inputs=encoder_inputs,outputs=[encoder_outputs, state_h, state_c])

当有一个程序的时候重用变量很好,但是我想把我的代码分成训练和推理。然后,我需要找到一种将隐藏的单元格状态保存到文件中的方法。

到目前为止我尝试的是

  • 将state_h和state_c直接保存到文件中,这是张量,但是从张量到numpy数组的整形并不适用于我。
  • 保存整个Keras模型,将其加载到推理模式,并通过
代码语言:javascript
运行
复制
from tensorflow.keras.models import load_model
model.save("current_model.h5")
newmodel = load_model('./current_model.h5', custom_objects={'AttentionLayer': AttentionLayer})

encoder_outputs_2, state_h_2, state_c_2 = newmodel.layers[7].output

以这种方式重新分配变量确实有效,但没有将它们输入推理模型:这给了我错误信息。

代码语言:javascript
运行
复制
ValueError: Graph disconnected: cannot obtain value for tensor     Tensor("input_1_2:0", shape=(?, 30), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []

任何帮助,我已经尝试了到目前为止,或想法的新方法,将不胜感激。干杯!

EN

回答 1

Stack Overflow用户

发布于 2019-08-30 14:42:07

解决了这个问题:由于引用了堆叠的LSTM层的不正确实例而发生的图断开错误,应该是新模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57611085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档