MLP初始化Keras中的LSTM细胞状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MLP初始化Keras中的LSTM细胞状态相关的知识,希望对你有一定的参考价值。

我们可以使用MLP的输出作为LSTM网络中的单元状态,并通过反向传播训练MLP吗?

这类似于CNN和LSTM的图像字幕,其中CNN的输出被平坦化并用作初始隐藏/小区状态并训练堆叠网络,其中甚至通过反向传播更新CNN部分。

我尝试在keras中实现相同的架构。请找到代码here

但MLP的权重没有更新。我理解这在tensorflow中更直接,我们可以明确地提到哪些参数随损失更新,但任何人都可以帮我使用keras API吗?

答案

我们可以。只需将输出作为the initial hidden state传递。请记住,LSTM有两个隐藏状态,hc。你可以阅读更多关于这个here的信息。请注意,您也不必创建多个keras模型,但可以简单地连接所有层:

# define mlp 
mlp_inp = Input(batch_shape=(batch_size, hidden_state_dim))
mlp_dense = Dense(hidden_state_dim, activation='relu')(mlp_inp)

## Define LSTM model
lstm_inp = Input(batch_shape=(batch_size, seq_len, inp_size))
lstm_layer = LSTM(lstm_dim)(lstm_inp, initial_state=[mlp_dense,mlp_dense])
lstm_out = Dense(10,activation='softmax')(lstm_layer)

model = Model([mlp_inp, lstm_inp], lstm_out)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=  ['accuracy'])

但是,由于上述有两种状态的事实,您可能需要分别考虑每个初始状态的两个MLP层。

# define mlp 
mlp_inp = Input(batch_shape=(batch_size, hidden_state_dim))
mlp_dense_h = Dense(hidden_state_dim, activation='relu')(mlp_inp)
mlp_dense_c = Dense(hidden_state_dim, activation='relu')(mlp_inp)

## Define LSTM model
lstm_inp = Input(batch_shape=(batch_size, seq_len, inp_size))
lstm_layer = LSTM(lstm_dim)(lstm_inp, initial_state=[mlp_dense_h,mlp_dense_c])
lstm_out = Dense(10,activation='softmax')(lstm_layer)

model = Model([mlp_inp, lstm_inp], lstm_out)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=  ['accuracy'])

另外,请注意,当您保存此模型时,请使用save_weights而不是save,因为save_model无法处理初始状态传递。另外,作为一个小小的说明。

以上是关于MLP初始化Keras中的LSTM细胞状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在Keras训练LSTM的初始状态?

Keras 如何处理单元格和隐藏状态(RNN、LSTM)的初始值以进行推理?

Keras 中的 LSTM 实现是如何工作的

Keras 的 LSTM 中的时间步长是多少?

在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底在配置啥?

利用Keras搭建LSTM循环神经网络