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有两个隐藏状态,h
和c
。你可以阅读更多关于这个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 如何处理单元格和隐藏状态(RNN、LSTM)的初始值以进行推理?