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

Python 如何将初始隐藏状态传递给lstm层?,python,python-3.x,tensorflow,lstm,tensorflow2.0,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(....,

我想将自定义初始状态传递给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需要两种状态作为初始状态(即隐藏状态、单元状态),对吗?但是我只有一个隐藏的状态向量来传递给模型,那么我如何才能只初始化隐藏的状态并使lstm自动初始化另一个状态为零呢?

lstm有两个状态,但你只传递一个输入。因此有两种选择

选项1:使用
GRU
GRU只有一个状态,
initial_state=imp_vec
可以正常工作

选项2:创建两个不同的状态 创建
imp_vec_1
imp_vec_2
并将其作为

layers.LSTM(..)(..., initial_state=[imp_vec_1, imp_vec_2])
请记住,
LSTM
层按该顺序执行
h_状态
c_状态

选项3:使
c_状态
0 如果不想传递
c_状态
,只需传递一组零即可

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

@thushv86谢谢,我只是有一个疑问,在
tf.zero\u like(x)
x
指的是什么?它应该是什么形状?@user_12,所以这是一个技巧,可以得到一个充满零的状态,它的形状与
imp_vec
完全相同。因为
h
c
状态的大小相同。这是一个很好的方法,因为即使批处理维度是
None
,它也允许这样做?所以,如果我们使用
tf.zero_像(x)
这不是平坦层的相同形状吗?你是说
imp\u vec
zero\u out
都有相同的形状吗?是的,形状完全相同。LSTM具有两种状态的精确形状隐藏状态(
h
)是第一种状态,单元状态(
c
)是第二种状态。