在keras API中为LSTM单元提供输入

时间:2019-07-15 09:57:27

标签: keras lstm lstm-stateful

我正在阅读有关深度学习中的LSTM。 Ng教授的LSTM课程为每个LSTM单元提供了三个输入。

输入是来自先前单元格的单元格状态,即“ c”上标(t-1)和LSTM单元格“ a”超级脚本(t-1)和输入x超级脚本(t)的输出。

LSTM单元的输出是当前单元状态,即“ c”上标(t)和LSTM单元“ a”上脚本的输出(t)。

我们如何在上述输入中为keras中的LSTM单元传递初始化参数?

感谢您的帮助。简单的例子会有所帮助。

1 个答案:

答案 0 :(得分:0)

默认情况下,您不必为keras中的LSTM层指定初始状态。

如果要指定初始状态,可以像LSTM(units)(input, initial_state)这样进行,其中initial_state是张量[hidden_state, cell_State]的列表。 hidden_statecell_state分别用您的符号“ a”上标(t-1)和“ c”上标(t-1)表示。每个事件都有一个隐藏的状态和一个单元格状态,因此在训练时,每个形状应为(batch_size, units)

下面是在tf.keras中执行此操作的最小工作示例(在keras中应相同,但尚未测试代码)

from tensorflow import keras 
import numpy as np

n_features=3
n_timelag=10
n_pred=1
batch_size=32
lstm_size=30

# make initial state
single_hidden_state=np.random.random(lstm_size)
single_cell_state=np.random.random(lstm_size)
# clone for each batch
hidden_state=np.tile(single_hidden_state,(batch_size,1))
cell_state=np.tile(single_cell_state,(batch_size,1))
# numpy to tensorflow constant
initial_state=[keras.backend.constant(hidden_state),keras.backend.constant(cell_state)]

# create training data
X=np.random.random((batch_size,n_timelag,n_features))
Y=np.random.random((batch_size,n_pred))

# create network
inp=keras.Input((n_timelag,n_features))
lstm_l1=keras.layers.LSTM(lstm_size)(inp, initial_state=initial_state)
pred = keras.layers.Dense(n_pred)(lstm_l1)

# create model
model = keras.models.Model(inputs=inp, outputs=pred)
model.compile(loss='mse', optimizer='adam')

# train model
model.fit(X,Y)

有关如何在keras中处理LSTM初始状态和序列的更多信息,请参见this link