数据扩充的重点是什么?

问题描述

下面的代码基于FrançoisCollet。他用它来证明当训练集较小(2000张图像)时,数据扩充可以提高验证集中的分类能力(这是真的!)。

我的问题是:

如果 model.fit_generator 方法使用 steps_per_epoch = 2000 // batch_size 。我们每个时代使用2000张图片吗?

如果是。如果我使用的样本大小与原始样本大小相等,那么数据扩充的重点是什么?

batch_size = 32

# Train data augmentation
train_datagen = ImageDataGenerator(
        rescale = 1./255,shear_range = 0.2,zoom_range = 0.2,horizontal_flip = True)

train_generator = train_datagen.flow_from_directory(
        train_dir,target_size = (150,150),batch_size = batch_size,class_mode = 'binary')


# Train data generation
validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_directory(
        validation_dir,batch_size = 20,class_mode = 'binary')


# training and validation
history = model.fit_generator(train_generator,steps_per_epoch = 2000 // batch_size,epochs = 100,validation_data = validation_generator,validation_steps = 500 // batch_size)

解决方法

您发布的代码已经过时,但是仅用于解释目的。

诚然,我们有2000张图片。我们全部使用了它们,但是在那个时期执行的步骤数为2000//batch_size,因为您是在一批大小batch_size之后更新网络的权重的。因此,您执行2000//batch_size个步骤。

同时,将扩展视为运行时的丰富。当我们使用扩充时,您不会创建物理存储在驱动器中的新示例,而是将批处理加载到内存中时。这意味着,在包含batch_size个元素的批处理中,其中一些已被修改(增强)并馈送到您的网络中。每种增强都有相关的概率,即图像受特定增强的概率为N %(甚至可以手动设置)。

但这意味着随着训练的进行,随着历元数的增加,您的网络将看到比最初的2000图像更多的图像。

,

在您提供的代码段中,steps_per_epoch = 2000 // batch_size本质上意味着该模型将在一个时期内看到完整的2000张图像,但是在这2000张图像中,很多将被替换为基于a的增强对等图像。您可以提供或通过随机选择图像的特定概率。

例如考虑到您正在构建Dog-vs-Cats分类器,并且数据集仅由向右狗和向左猫的图像组成。在这种情况下,如果您不应用增强(horizo​​ntal_flipping),则模型可能会得知all the left facing animals are cats会给定左脸狗的图像,从而导致错误的结果。 此处的增强(特别是horizo​​ntal_flipping)将随机翻转猫和狗的图像,从而使模型能够达到更好的解决方案,从而使其更加健壮!

扩增发生在原位,没有生成新图像。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...