我正在研究一种序列,该序列使用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: []
我到目前为止所尝试的任何帮助或对新方法的想法都将不胜感激。干杯!
答案 0 :(得分:0)
解决了该问题:由于断开了LSTM堆叠层的不正确实例而导致的Graph断开连接错误,应该是newmodel.layers [6] .output