如果在使用功能 API 构建的多输入/输出 Keras 模型中使用生成器应该返回啥?

Posted

技术标签:

【中文标题】如果在使用功能 API 构建的多输入/输出 Keras 模型中使用生成器应该返回啥?【英文标题】:What should the generator return if it is used in a multi-input/output Keras model built with functional API?如果在使用功能 API 构建的多输入/输出 Keras 模型中使用生成器应该返回什么? 【发布时间】:2020-11-06 04:42:07 【问题描述】:

在this article 之后,我正在尝试实现生成式 RNN。在上述文章中,训练和验证数据作为满载 np.arrays 传递。但我正在尝试使用model.fit_generator 方法并提供生成器。

我知道如果它是一个简单的模型,生成器应该返回:

def generator():
    ...
    yield (samples, targets)

但这是一个生成模型,这意味着涉及两个模型:

encoder_inputs = Input(shape=(None,))
x = Embedding(num_encoder_tokens, embedding_dim)(encoder_inputs)
x.set_weights([embedding_matrix])
x.trainable = False
x, state_h, state_c = LSTM(embedding_dim, return_state=True)(x)
encoder_states = [state_h, state_c]

decoder_inputs = Input(shape=(None,))
x = Embedding(num_decoder_tokens, embedding_dim)(decoder_inputs)
x.set_weights([embedding_matrix])
x.trainable = False
x = LSTM(embedding_dim, return_sequences=True)(x, initial_state=encoder_states)
decoder_outputs = Dense(num_decoder_tokens, activation='softmax')(x)

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

如前所述,我正在尝试使用生成器:

model.fit_generator(generator(),
                   steps_per_epoch=500,
                   epochs=20,
                   validation_data=generator(),
                   validation_steps=val_steps)

但是generator() 应该返回什么?我有点困惑,因为有两个输入集合和一个目标。

【问题讨论】:

【参考方案1】:

由于您的模型有两个输入和一个输出,因此生成器应该返回一个包含两个元素的元组,其中第一个元素是一个 列表,其中包含两个数组,对应于两个输入层,第二个元素element是对应输出层的数组:

def generator():
    ...
    yield [input_samples1, input_samples2], targets

通常,在具有M 输入和N 输出的模型中,生成器应返回两个列表的元组,其中第一个具有M 数组,第二个具有N 数组:

def generator():
        ...
        yield [in1, in2, ..., inM], [out1, out2, ..., outN]

如果不是使用 Python 生成器,而是使用 Sequence 类的实例来生成数据,则格式相同,唯一的区别是您将在 __getitem__ 方法中使用 return 而不是 yield .

【讨论】:

谢谢。一旦我得到验证,我会接受这个。现在,我的电脑正忙于其他事情。 感谢您的回答,它成功了。我刚刚了解到您还可以使用“命名”层和字典。将其添加到您的答案中以使其完整会很棒。

以上是关于如果在使用功能 API 构建的多输入/输出 Keras 模型中使用生成器应该返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 IE9 不支持 File API 和文件输入的多属性?

Keras功能API的语法

深度学习笔记34_函数式API之多输出模型构建

使用 scikit 学习的多类多输出回归

反向传播神经网络的多输入

深度学习笔记35_函数式API之Inception/Resnet网络构建