Keras 中多个输出头的数据增强

数据挖掘 深度学习 喀拉斯 数据 预处理 数据增强
2022-03-09 05:28:29

我有一个基于迁移学习的两个输出分类问题。因此,我已将数据格式化X_train(number of samples, height, width, channels)numpy 数组、y_train1numpy(number of samples,)数组和y_train2numpy(number of samples,)数组。

由于我没有使用目录结构进行培训,因此我使用的是ImageDataGenerator.flow(). 但是,我无法弄清楚如何传递两个标签数组,因为(2, number of samples)当我将标签作为[y_train1, y_train2]列表发送时,它会使用标签。

我能够在没有 Keras 数据增强的情况下训练网络(对于两个输出)。但是,我无法应用数据增强。

我正在尝试执行以下操作:

datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True, rescale=1./255, class_mode="multi-label")

model.fit(datagen.flow(X_train, [y_train1, y_train2], batch_size=batch_size), batch_size=batch_size, epochs=nb_epochs, steps_per_epoch=spe, validation_data=(X_val, [y_val1, y_val2]))

此外,ImageDataGenerator.flow没有class_mode不同ImageDataGenerator.flow_from_dataframe的 .

任何建议/帮助将不胜感激!

参考:

  1. 数据增强多输出(没有答案。我刚刚赞成)
  2. 从 Keras 获取多个输出(不解释数据增强)
1个回答

请参考https://gist.github.com/swghosh/f728fbba5a26af93a5f58a6db979e33e提供的源代码,它可以帮助您编写自定义生成器(基础 ImageDataGenerator)以训练端到端多输出模型。在提供的示例中,正在训练 GoogLeNet,它由两个辅助分类器组成,因此在完整模型中包含 3 个输出。

的输出ImageDataGenerator.flow_from_directory()已通过 yield 语句传递到 Python 函数中,这样目标可以根据要求重复三次。

def three_way(gen):
    for x, y in gen:
        yield x, [y, y, y]

此外,请确保将值传递给 steps_per_epoch 参数以防万一,model.fit()model.fit_generator()确保训练循环不会无限期地运行。(这是因为 Python 生成器对象不会从 Sequence 类继承,并且 Keras 无法隐式推断批次/步骤的数量)

此外,您可以考虑使用结合了 Random* 层和预处理层的 tf.data API 构建的图像数据管道,与旧的 ImageDataGenerator 相比,这是一种更现代的 tf.keras 方法。如果您过渡,应该有一堆性能和可用性优势。如果您正在寻找示例,请告诉我。

如果您想实现多输出多标签分类模型,请查看此示例。https://www.pyimagesearch.com/2018/06/04/keras-multiple-outputs-and-multiple-losses/

我仍然建议使用 tf.data.Dataset 而不是原始张量,这对于不适合内存的大型数据集更可行,而且 tf.data API 提供了额外的灵活性。