如何测试使用教师强迫训练的模型

时间:2019-06-27 13:06:18

标签: nlp lstm recurrent-neural-network seq2seq

我用keras训练seq2seq模型(keras.models.Model)。模型的X和y为[X_encoder,X_decoder]和y,即编码器和解码器输入和标签的列表(注意,解码器输入X_decoder为'y',其位置比实际y。基本上是老师强迫)。

所以我的问题现在是经过培训的,当涉及到没有任何标签的实际预测时,如何为输入提供“ X_decoder”?还是我需要其他训练?

这是模型定义的摘要,如果有帮助的话:)

# Encoder
encoder_inputs = Input(batch_shape=(batch_size, max_len,), dtype='int32')
encoder_embedding = embedding_layer(encoder_inputs)
encoder_LSTM = CuDNNLSTM(hidden_dim, return_state=True, stateful=True)
encoder_outputs, state_h, state_c = encoder_LSTM(encoder_embedding)

# Decoder
decoder_inputs = Input(shape=(max_len,), dtype='int32')
decoder_embedding = embedding_layer(decoder_inputs)
decoder_LSTM = CuDNNLSTM(hidden_dim, return_state=True, return_sequences=True)
decoder_outputs, _, _ = decoder_LSTM(decoder_embedding, initial_state=[state_h, state_c])

# Output
outputs = TimeDistributed(Dense(vocab_size, activation='softmax'))(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], outputs)

# model fitting:
model.fit([X_encoder, X_decoder], y, steps_per_epoch=int(number_of_train_samples/batch_size),
epochs=epochs)

1 个答案:

答案 0 :(得分:2)

通常,当您训练seq2seq模型时,decoder_inputs的第一个标记是特殊的<start>标记。因此,当您尝试生成句子时,您会这样做

first_token = decoder(encoder_state, [<start>])
second_token = decoder(encoder_state, [<start>, first_token])
third_token = decoder(encoder_state, [<start>, first_token, second_token])
...

您执行此递归,直到您的解码器生成另一个特殊令牌-<end>;。然后你停下来。

这是您模型的非常原始的pythonic解码器。它效率低下,因为它会一遍又一遍地读取输入,而不是记住RNN状态-但它可以工作。

input_seq = # some array of token indices
result = np.array([[START_TOKEN]])
next_token = -1
for i in range(100500):
    next_token = model.predict([input_seq, result])[0][-1].argmax()
    if next_token == END_TOKEN:
        break
    result = np.concatenate([result, [[next_token]]], axis=1)
output_seq = result[0][1:] # omit the first INPUT_TOKEN

一种更有效的解决方案是将RNN状态与每个令牌一起输出,并使用它来生成下一个令牌。