MLP初始化Keras中的LSTM单元状态

时间:2018-07-19 10:22:57

标签: tensorflow keras deep-learning

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

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

我尝试在keras中使用一种架构来实现相同的目的。请找到代码here

但是MLP的权重并未更新。我知道这在tensorflow中更直接了,在这里我们可以明确提到要随着损失而更新的参数,但是有人可以通过keras API来帮助我吗?

1 个答案:

答案 0 :(得分: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无法处理初始状态传递。另外,作为一点说明。