我正在尝试在 Keras 中使用 LSTM 构建 seq2seq 模型。目前正在研究英语到法语对数据集 - 10k 对(原始数据集有 147k 对)。在尝试预测给定输入序列模型的输出时完成训练后,无论输入序列如何,都预测相同的输出。还为编码器和解码器使用单独的嵌入层。我观察到的是,预测的词只不过是数据集中最常见的词,它们按频率的降序显示。例如:“我认识你”、“我们可以走吗?”、“摆脱它”——对于所有这些输入序列,输出是——“je suis en train”(所有三个输出相同)。
任何人都可以帮助我,这可能是模型表现得这样的原因。我错过了一些基本的东西吗?
我尝试使用batchsize = 32,epoch = 50,maxinp = 8,maxout = 8,embeddingsize = 100。
encoder_inputs = Input(shape=(None, GLOVE_EMBEDDING_SIZE), name='encoder_inputs')
encoder_lstm1 = LSTM(units=HIDDEN_UNITS, return_state=True, name="encoder_lstm1" , stateful=False, dropout=0.2)
encoder_outputs, encoder_state_h, encoder_state_c = encoder_lstm1(encoder_inputs)
encoder_states = [encoder_state_h, encoder_state_c]
decoder_inputs = Input(shape=(None, GLOVE_EMBEDDING_SIZE), name='decoder_inputs')
decoder_lstm = LSTM(units=HIDDEN_UNITS, return_sequences=True, return_state=True, stateful=False,
name='decoder_lstm', dropout=0.2)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(self.num_decoder_tokens, activation='softmax', name='decoder_dense')
decoder_outputs = decoder_dense(decoder_outputs)
self.model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
print(self.model.summary())
self.model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
Xtrain, Xtest, Ytrain, Ytest = train_test_split(input_texts_word2em, self.target_texts, test_size=0.2, random_state=42)
train_gen = generate_batch(Xtrain, Ytrain, self)
test_gen = generate_batch(Xtest, Ytest, self)
train_num_batches = len(Xtrain) // BATCH_SIZE
test_num_batches = len(Xtest) // BATCH_SIZE
self.model.fit_generator(generator=train_gen, steps_per_epoch=train_num_batches,
epochs=NUM_EPOCHS,
verbose=1, validation_data=test_gen, validation_steps=test_num_batches ) #, callbacks=[checkpoint])
self.encoder_model = Model(encoder_inputs, encoder_states)
decoder_state_inputs = [Input(shape=(HIDDEN_UNITS,)), Input(shape=(HIDDEN_UNITS,))]
decoder_outputs, state_h, state_c = decoder_lstm(decoder_inputs, initial_state=decoder_state_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
self.decoder_model = Model([decoder_inputs] + decoder_state_inputs, [decoder_outputs] + decoder_states)
更新::我在 147k 数据集上运行了 5 个 epoch,每个输入的结果都不同。谢谢您的帮助。
但是,现在我正在使用另一个数据集运行相同的模型,其中输入和输出序列在清理(删除停用词和其他内容)后分别包含平均单词数为 170 和 100。这个数据集有大约 30k 条记录,如果我运行 50 个 epoch,每个测试句子的结果都是相同的。那么我的下一个选择是什么让我尝试。我期待不同的输入至少有不同的输出(即使它是错误的),但相同的输出会增加更多的挫败感,无论模型是否学习不正确。有答案吗??