【问题标题】:Training in inference mode in seq-to-seq model在 seq-to-seq 模型中以推理模式进行训练
【发布时间】:2020-05-24 20:32:47
【问题描述】:

这显然是我编写的带有嵌入的 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

【问题讨论】:

  • 你说'显然是我写的带有嵌入的 seq2seq 模型的代码'——你是真的写的还是从某个地方复制的?请分享参考资料、您的数据和问题的背景。

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


【解决方案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)

编辑:来自 cmets

如果您仔细观察,您在拟合后定义的“新”模型由在上一步中已训练的层组成。即 Model(encoder_inputs, encoder_states) 在初始训练期间使用了 encoder_inputs 和 encoder_states,你只是重新打包它们。

【讨论】:

  • 是的,你说得对,但这是针对训练模式的,但是对于推理模式,我们正在创建一个新的编码器和解码器模型``` # 定义采样模型 encoder_model = Model(encoder_inputs, encoder_states ) 解码器模型 = 模型([解码器输入] + 解码器状态输入,[解码器输出] + 解码器状态)```
  • 我不明白你的问题。您要么在“训练模式”下训练模型,要么在“推理”模式下进行推理。你不要把这两个混在一起。
  • 如果您想用一些具有可训练参数的附加层来增强您已经训练过的模型,那么您需要重新训练包含这些附加层的模型。
  • 是的,明白了,所以在推理模式下我们不是在训练(不更新权重)?对吗?
  • 是的,没错。但从技术上讲,不存在训练或推理模式之类的东西。重要的是你调用的是什么方法。 fit 用于训练,predict 用于推理。如果您拨打predict,则表示没有培训。
猜你喜欢
  • 2020-02-16
  • 2018-11-29
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多