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

问题描述 投票:0回答:1

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

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

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

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

tensorflow keras deep-learning
1个回答
0
投票

我们可以。只需将输出作为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无法处理初始状态传递。另外,作为一个小小的说明。

© www.soinside.com 2019 - 2024. All rights reserved.