LSTM 没有在 LSTM 层之后添加额外的非时间数据来学习 - Keras

数据挖掘 深度学习 nlp 喀拉斯 rnn lstm
2022-03-09 14:19:04

我想将三个不同的输入发送到我的 LSTM 中——“单词”序列、额外的时间信息以及额外的非时间信息。

继 Adam Sypniewski 对这个问题的出色回答(为时间序列模型 LSTM 添加功能)之后,我使用了这个架构:

word_input = Input(shape=(sequence_length,))
temporal_metadata = Input(shape=(sequence_length, 1))
nontemporal_metadata = Input(shape=(nontemporal_num_features,))

embedding = Embedding(input_dim=vocab_size, output_dim=100)(word_input)
temporal_info = concatenate(inputs=[embedding, temporal_metadata])
rnn = LSTM(50, dropout = .5, recurrent_dropout=.5)(temporal_info)
all_info = concatenate(inputs=[rnn, nontemporal_metadata])
dense_1 = Dense(10, activation='relu')(all_info)
dropout_1 = Dropout(.5)(dense_1)
dense_2 = Dense(1, activation='sigmoid')(dropout_1)

model = Model([word_input, temporal_metadata, nontemporal_metadata], dense_2)
model.compile(loss='binary_crossentropy', optimizer='adam'
model.fit(x=[my_words, my_temporal, my_nontemporal], y = my_y, 
     epochs = 30, 
     validation =([my_words_test, my_temporal_test, my_nontemporal_test], y_test))

这不会学习,并获得 0.5 的 AUC

但是,如果我不添加非临时数据并将上面的代码更改为

word_input = Input(shape=(sequence_length,))
temporal_metadata = Input(shape=(sequence_length, 1))

embedding = Embedding(input_dim=vocab_size, output_dim=100)(word_input)
temporal_info = concatenate(inputs=[embedding, temporal_metadata])
rnn = LSTM(50, dropout = .5, recurrent_dropout=.5)(temporal_info)
dense_1 = Dense(10, activation='relu')(rnn)
dropout_1 = Dropout(.5)(dense_1)
dense_2 = Dense(1, activation='sigmoid')(dropout_1)

model = Model([word_input, temporal_metadata], dense_2)
model.compile(loss='binary_crossentropy', optimizer='adam'
model.fit(x=[my_words, my_temporal], y = my_y, 
     epochs = 30, 
     validation =([my_words_test, my_temporal_test], y_test))

它工作得很好。任何人都可以帮我找出第一个代码示例中导致模型无法学习的问题所在。谢谢!

1个回答

如果有人偶然发现这一点-似乎我的非时间数据维度太高太稀疏了。在仅过滤非时间数据中最常见/最重要的变量后,模型就学习了。