模型内或模型外的 Keras 数据增强层

问题描述 投票:0回答:2

keras 中的预处理层到底是如何工作的,特别是在作为模型本身的一部分的情况下?这与在模型外部应用预处理然后输入训练结果进行比较。

我试图了解在 keras 模型中运行数据增强。假设我有 1000 张图像用于训练。在模型之外,我可以应用 10 倍增强并获得 10000 个结果图像用于训练。

但我不明白当你使用预处理层进行增强时会发生什么。这个(或者如果您使用很多)层是否会在训练之前获取每个图像并应用转换?这是否意味着用于训练(和我假设的验证)的图像总数是纪元数*原始图像数?

一种选择比另一种更好吗?这是否取决于增强之前最初拥有的图像数量?

python tensorflow keras data-augmentation
2个回答
3
投票

预处理层的好处是模型是真正的端到端,即原始数据进来,预测出来。它使您的模型可移植,因为预处理过程包含在 SavedModel 中。

但是,它将在 GPU 上运行所有内容。通常,在 GPU 优化模型时,在后台使用 CPU 工作线程加载数据是有意义的。

或者,您可以在模型外部和数据集内部使用预处理层。这样做的好处是,您可以轻松创建包含各层的仅推理模型,从而在推理时为您提供可移植性,但在训练期间仍然可以加速。

有关更多信息,请参阅 Keras 指南


0
投票

我也有同样的问题。基本上有两种推荐的应用增强方法:

  1. 到模型管道。在这里,初始层将是增强层,后面的层将是神经网络。
    model = tf.keras.Sequential([
        tf.keras.layers.Input(shape=(512,512,3)),
        tf.keras.layers.Rescaling(scale=1/255.0),
        tf.keras.layers.RandomFlip(),
        tf.keras.layers.RandomRotation(factor=0.5),
        tf.keras.layers.Conv2D(256, kernel_size=(5, 5), padding='valid', activation='relu'),
        tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
        tf.keras.layers.Dropout(rate=0.2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])

在此方法中,图像数量保持与之前相同。增强会改变图像样式,但每个层每个图像仅运行一次。我找不到任何具体的文档,但创建一个仅包含增强的模型证明是一样的。

augmentation_layer = tf.keras.models.Sequential([tf.keras.layers.RandomRotation(factor=0.5)])

nrows = 4
ncols = 4

fig = plt.gcf()
for images, labels in training_set.as_numpy_iterator():
    augmented_images = augmentation_layer(images)
    break
    
for i, image in enumerate(augmented_images):
    sp = plt.subplot(nrows, ncols, i+1)
    plt.imshow(image/255.0)
    plt.suptitle('Augmented Images') 

for i, image in enumerate(images):
    sp = plt.subplot(nrows, ncols, i+1)
    plt.imshow(image/255.0)
    plt.suptitle('Actual Images')     

PS:

training_set
是从
_PrefetchDataset
创建的
tf.keras.utils.image_dataset_from_directory
。您可能需要编辑代码才能使其与您的数据集一起使用。

结果表明,对于每个实际图像,仅应用一次变换。

如果您有大量数据并且不需要增加数据集大小,则此方法非常有用。但是,如果您希望创建额外的数据,那么选项 2 更好:

  1. 先应用增强,然后将其添加到模型中。在这种情况下,您需要使用循环在同一图像上多次运行增强。您可以继续将增强图像添加回源数据集。
© www.soinside.com 2019 - 2024. All rights reserved.