将嵌入式功能与其他功能结合起来作为RNN的输入

时间:2019-05-10 19:05:45

标签: python tensorflow keras lstm

我正在尝试从论文Fine-Grained Emotion Detection in Health-Related Online Posts中重现神经网络模型。模型结构如下:

enter image description here

如本文所述,嵌入式功能是通过CNN集成传递的。然后,将结果合并到其他功能中,并作为输入输入LSTM网络。

现在,我的代码是这样的,但是由于我无法将2D输入(feat_input)合并为3D输入(l_dropout1),因此它无法正常工作。

feat_input = Input(shape=(feat_len,), dtype='float32',name='feat_input')
main_input = Input(shape=(max_doc_length,), dtype='int32',name='main_input')

embedded_sequences = Embedding(input_dim=max_vocab_size+1, output_dim=embedding_dim, input_length=max_doc_length)(main_input)
l_conv1d1 = Conv1D(filters=hidden_dim, kernel_size=5, activation='relu')(embedded_sequences)
l_mp1d1 = MaxPooling1D()(l_conv1d1)
l_conv1d2 = Conv1D(filters=hidden_dim, kernel_size=3, activation='relu')(l_mp1d1)
l_mp1d2 = MaxPooling1D()(l_conv1d2)
l_dropout1 = Dropout(dropout)(l_mp1d2)     

# Reshape in order to concatenate (2D)   
l_merged = concatenate([l_dropout1, feat_input], axis=-1)

# Reshape in order to run LSTM (3D)
l_lstm = (Bidirectional(LSTM(hidden_dim, return_sequences=False)))(l_merged)
l_dropout2 = Dropout(dropout)(l_lstm)
out = Dense(n_classes, activation='softmax')(l_dropout2)

注意l_dropout1的形状为(None, 123, 128)feat_input的形状为(None, 12)

我现在遇到的丑陋解决方案是重塑l_dropout1,合并并再次将结果重塑为3D输入。这里的缺点是我必须知道l_dropout1的形状并手工编码(鉴于我的任务的性质,这是不可行的)。目前,我通过手动检查发现l_dropout1的形状。

有没有关于合并这些层并将其馈送到LSTM网络的更好方法的建议?

0 个答案:

没有答案