我们是否可以将MLP的输出用作LSTM网络中的单元状态,并通过反向传播来训练MLP?
这类似于使用CNN和LSTM的图像字幕,其中CNN的输出被展平并用作初始隐藏/单元状态,并训练堆叠的网络,其中甚至通过反向传播来更新CNN部分。
我尝试在keras中使用一种架构来实现相同的目的。请找到代码here。
但是MLP的权重并未更新。我知道这在tensorflow中更直接了,在这里我们可以明确提到要随着损失而更新的参数,但是有人可以通过keras API来帮助我吗?
答案 0 :(得分:0)
是的,我们可以。只需将输出作为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
无法处理初始状态传递。另外,作为一点说明。