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

时间:2019-08-22 13:58:59

标签: python-3.x keras nlp lstm seq2seq

我正在研究一种序列,该序列使用Keras中具有LSTM层的编码器解码器体系结构来生成文本。
我的代码是Keras LSTM seq2seq教程的修改版本: https://keras.io/examples/lstm_seq2seq/
训练完模型后,我想建立一个推理模式,在其中可以仅使用已保留模型的隐藏状态对序列进行解码,而不必每次都重新训练整个模型。 我正在寻找一种方法将这些隐藏的LSTM状态保存到文件中,然后重新加载它们以建立我的推理模型。

模型训练部分的一部分如下:

encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)

稍后,我将需要隐藏的单元格状态和编码器输出(encoder_outputs,state_h和state_c)以相同的方式设置推理模型(如本教程中所述):

encoder_model = Model(inputs=encoder_inputs,outputs=[encoder_outputs, state_h, state_c])

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

到目前为止我尝试过的是

  • 将Tensors的state_h和state_c直接保存到文件中,但是从Tensor重塑为numpy数组对我不起作用

  • 保存整个Keras模型,以推理模式加载它,并通过以下方式提取隐藏的细胞状态

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

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

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: []

我到目前为止所尝试的任何帮助或对新方法的想法都将不胜感激。干杯!

1 个答案:

答案 0 :(得分:0)

解决了该问题:由于断开了LSTM堆叠层的不正确实例而导致的Graph断开连接错误,应该是newmodel.layers [6] .output