在seq-to-seq模型中以推理模式进行训练

时间:2020-02-09 08:47:29

标签: python keras deep-learning sequence-to-sequence encoder-decoder

这显然是我编写的带有嵌入的seq2seq模型的代码

    encoder_inputs = Input(shape=(MAX_LEN, ), dtype='int32',)
    encoder_embedding = embed_layer(encoder_inputs)
    encoder_LSTM = LSTM(HIDDEN_DIM, return_state=True)
    encoder_outputs, state_h, state_c = encoder_LSTM(encoder_embedding)
    encoder_states = [state_h, state_c]
    decoder_inputs = Input(shape=(MAX_LEN, ))
    decoder_embedding = embed_layer(decoder_inputs)
    decoder_LSTM = LSTM(HIDDEN_DIM, return_state=True, return_sequences=True)
    decoder_outputs, _, _ = decoder_LSTM(
        decoder_embedding, initial_state=encoder_states)
    outputs = TimeDistributed(
        Dense(VOCAB_SIZE, activation='softmax'))(decoder_outputs)
    model = Model([encoder_inputs, decoder_inputs], outputs)

    # defining inference model
    encoder_model = Model(encoder_inputs, encoder_states)
    decoder_state_input_h = Input(shape=(None,))
    decoder_state_input_c = Input(shape=(None,))
    decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
    decoder_outputs, state_h, state_c = decoder_LSTM(
        decoder_embedding, initial_state=decoder_states_inputs)
    decoder_states = [state_h, state_c]
    outputs = TimeDistributed(
        Dense(VOCAB_SIZE, activation='softmax'))(decoder_outputs)
    decoder_model = Model(
        [decoder_inputs] + decoder_states_inputs, [outputs] + decoder_states)
    return model, encoder_model, decoder_model

我们正在使用推理模式进行预测,尤其是编码器和解码器模型的预测,但是我不确定编码器和解码器的训练在哪里进行?

编辑1

代码基于:https://keras.io/examples/lstm_seq2seq/, 并添加了嵌入层和时间分布密集层。
有关问题的更多信息:github repo

1 个答案:

答案 0 :(得分:1)

同时训练编码器和解码器,或者更精确地训练由两者组成的模型,这反过来又训练两者(这不是需要花哨的训练周期的GAN)

如果您在提供的链接中仔细查看,则会有一节训练模型。

# Run training
model.compile(optimizer='rmsprop', loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

编辑:来自评论

如果您仔细观察,则拟合后要定义的“新”模型包含在上一步中已经训练的图层。即模型(encoder_inputs,encoder_states)在初始训练期间都使用了encoder_inputs和encoder_states,您只是重新包装它们。

相关问题