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

How to pass initial hidden state to the lstm layer?

我想将自定义初始状态传递给 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])

以上代码returns值错误:,

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 自动用零初始化另一个?

LSTM 有两个状态,但您只传递一个输入。因此有几个选项

选项 1:使用 GRU

而不是 LSTM

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

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

而不是单个 imp_vec,创建 imp_vec_1imp_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])