keras - seq2seq模型为所有测试输入预测相同的输出

时间:2018-04-03 20:31:27

标签: python keras lstm seq2seq

我正在尝试使用Keras中的LSTM构建seq2seq模型。目前正在研究英语到法语对数据集-10k对(orig数据集有147k对)。在完成训练之后,在尝试预测给定输入序列的输出时,模型预测相同的输出,而与输入序列无关。还为编码器和解码器使用单独的嵌入层。 我观察到的是预测的单词只是数据集中最常用的单词,它们以频率的降序显示。 例如: '我知道你','我们可以去吗?','突然出现' - 对于所有这些输入seq,输出是''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)

更新:: 我已经在具有5个纪元的147k数据集上运行,结果因每次输入而异。谢谢您的帮助。

然而现在我正在运行与另一个数据集相同的模型,其中输入和输出序列在清理后分别包含平均无字数为170和100(删除停用词和内容)。 这个数据集有大约30k的记录,如果我甚至运行50个时期,每个测试句的结果都是相同的。那么我的下一个选择是什么呢?我期待不同输入的至少不同的输出(即使它是错误的)但是相同的输出增加了更多的挫败感,无论模型是否正常学习。 任何答案?

0 个答案:

没有答案