如何将初始隐藏状态传递给lstm层?

时间:2020-01-13 14:46:04

标签: python python-3.x tensorflow lstm tensorflow2.0

我想将自定义初始状态传递给lstm输出,但是我只有一个隐藏状态,因此如何传递零初始状态。

from tensorflow.keras import layers

x = layers.Input((None,))
x = layers.Embedding(....)(x)
x = layers.Flatten()(x)
imp_vec = Dense()(x)

现在我要使用imp_vec作为隐藏的初始状态,并将其传递给解码器lstm

out, states = layers.LSTM(...., return_state=True)(inputs, initial_state=[imp_vec])

上面的代码返回值错误:

ValueError: An `initial_state` was passed that is not compatible with `cell.state_size`. Received `state_spec`=ListWrapper([InputSpec(shape=(None, 200), ndim=2)]); however `cell.state_size` is [10, 10]

我发现lstm需要两个状态作为初始状态(即hidden_​​state,cell_state),对吗?但是我只有一个隐藏状态向量才能将其传递给模型,所以如何只初始化hidden_​​state并使lstm自动初始化另一个为零的东西?

1 个答案:

答案 0 :(得分:4)

LSTM具有两种状态,但是您只传递了一个输​​入。因此,有两种选择

选项1:使用LSTM代替GRU

GRU只有一种状态,initial_state=imp_vec可以正常工作。

选项2:创建两个不同的状态

创建imp_vecimp_vec_1而不是单个imp_vec_2,并将其传递为

layers.LSTM(..)(..., initial_state=[imp_vec_1, imp_vec_2])

请记住,LSTM层依次h_statec_state

选项3:将c_state设为零

如果您不想传递c_state,只需传递一组零即可。

zero_out = layers.Lambda(lambda x: tf.zeros_like(x))(imp_vec)
layers.LSTM(..)(..., initial_state=[imp_vec, zero_out])