关于如何从LSTM获取c和h的资源很多。它的两个返回值都设置为true,并且我将h和c存储在变量中,如下面的代码所示。这是在训练网络后进行推断的过程中。我模型的编码器一半应该将h和c吐出,其长度为hidden_dim,但是您会在下面看到的并非如此:
self.enc1 = LSTM(hidden_dim, return_sequences=True, return_state=True, name='enc1')
self.emb_A = Embedding(output_dim = emb_dim, input_dim = vocabulary, input_length = None, mask_zero=True, name='embA')
...
inference_encInput = Input(shape=(None,), dtype="int32", name="input_seq")
temp = self.emb_A(inference_encInput)
temp, h, c = self.enc1(temp)
encoder_states = [h, c]
enc_model = Model(inputs = inference_encInput, outputs = encoder_states)
...
predicted_states = enc_model.predict(indices_arr)
print("encoder states are "+str(predicted_states))
该打印语句的结果是:
encoder states are [array([[-0.3114952 , -0.19627409],
[ 0.16007528, 0.72028404],
[-0.7607165 , 0.5128824 ]], dtype=float32), array([[-0.8645954 , -0.90217674],
[ 0.31057465, 0.9236232 ],
[-0.99791354, 0.99934816]], dtype=float32)]
我的隐藏维度仅为2,因为我只是在极其简单的训练数据上进行基本测试。二维向量的数量始终与我要编码的序列的长度相同,在这种情况下为3,这表明我可能以某种方式获得了状态序列?但是,h和c只是最终的隐藏状态和单元状态。我也不认为仅接受最后一个是正确的,还必须进行其他操作。我不知道我在做什么错,特别是因为在每个时间步都正确获取了解码器的状态:
new states for decoder are [array([[ 0.19158483, -0.16113694]], dtype=float32), array([[ 0.19398187, -0.37419504]], dtype=float32)]
答案 0 :(得分:0)
如果有人看到过这篇文章,我就知道了。我将model.predict()作为列表传递,类似于model.predict([1 15 14 2]),但它认为这是我要预测的事物的列表。对于lstm,我们希望在所有四个时间步中发送以进行预测,因此它必须是列表的列表,如model.predict([[1 15 14 2]])中所示。