我正在尝试从论文Fine-Grained Emotion Detection in Health-Related Online Posts中重现神经网络模型。模型结构如下:
如本文所述,嵌入式功能是通过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网络的更好方法的建议?