【问题标题】:What does ImageDataGenerator returns, and how to do data augmentation?ImageDataGenerator 返回什么,以及如何进行数据扩充?
【发布时间】:2020-06-05 22:10:01
【问题描述】:

我正在尝试使用 4900 个图像(480*640*3)数据集拟合 CNN 模型(AlexNet 架构),并且我想做数据增强,我已经完成了一个使用 ImageDataGenerator 方法的自定义生成器,因为图像也在不同的路径和标签上,所以我做了一个类,它采用所有路径并将图像路径及其标签保存在两个列表中,然后加载 32 个图像和标签的批次并适合图像数据生成器:

这是在适合时从模型调用的自定义生成器的方法,也是我适合 ImageDataGenerator 的地方

def __getitem__(self,index) :
      batch_x=self.img_filenames[index * self.batch_size : (index+1) * self.batch_size]
      batch_y=self.labels[index * self.batch_size: (index+1) * self.batch_size] 
      gen=ImageDataGenerator(rescale=1./255,
                         rotation_range=90,
                         brightness_range=(0.1,0.9),
                         horizontal_flip=True)
      X=[plt.imread(filename) for filename in batch_x]
      X,Y = next(gen.flow(x= np.array(X), y= np.array(batch_y), batch_size=self.batch_size))
      return X,Y

我有一些问题:

ImageDataGenerator 应该返回什么,如果我传递 32(batch_size) 个不同的图像,它会返回 32 个修改后的图像,每个 1 个,或者每个 32 个图像,如果我只传递 1 个批量大小为的图像32,它从那个返回 32 个修改后的图像?我几乎可以肯定每个人都是 1,但我想确认一下。

其次,如果我想要 40k 图像,如果我在超过 samples//batch_size 时再次将索引更改为 0,并更改 len 方法乘以 2 或任何我想要的,它假设由于图像是随机生成的,我将有 4900 张新图像或者我想要的数量不是吗?

主要问题是,当它达到 0.5 准确度时它停止增加,我尝试了 3 个 epoch 并且它是相同的,它增加到 3 或 4 个批次然后停止,所以这就是我怀疑的原因。

谢谢。

【问题讨论】:

    标签: python keras conv-neural-network


    【解决方案1】:

    让我试着回答 1. 如果您将批量大小 32 传递给 ImageDataGenerator,仅使用 horizontal_flip=True,它会水平翻转所有 32 张图像,并通过这 32 +32(原始 + 翻转)进行训练。
    如果你设置了horizontal_flipvertical_flip,那么将通过32+32+32张图片进行训练。 对于brightness_range,它为对应于一张原始图像的每个亮度等级生成一张图像。这意味着如果您的亮度等级为0.1-0.5,则生成了32*5 图像。

    我不确定第二个问题。更好的选择是对训练和测试数据进行更多的数据扩充。

    对于第三个问题,您应该尝试efficient netfocal loss

    【讨论】:

    • 但是批次大小必须与steps_per_epoch匹配,并且我使用的是32批次,那么通过这些修改我会使用32 * 10(亮度)* 2(翻转)* 2的批次? (旋转),然后使用数据集的长度计算steps_per_epochs(如果我不进行扩充,而只使用ImageDataGenerator),那么某处会丢失一些数据。检查这个:link
    • 查看 keras 预处理文档的第一个示例:link,在 steps_per_epochs 上使用的是主要训练集的长度,因此生成器生成的总图像必须匹配该长度
    • steps_per_epochs 就像传递所有批次的数据需要多少步,它应该是样本数(实际而不是增加)除以批次大小。
    • 例如,我们有 100 张图片,我们的批大小是 25,我们需要 4 个步骤来完成一个 epoch。现在让我们进行增强并假设我们有 500 张图像。我们每个时代的步数将 500/25=20 。我们需要 5 倍以上的步骤来完成一个 epoch,因为数据增加了 5 倍。
    • 在这种情况下,如果我们将所有增强图像保存在本地,但如果我们不保存它们并在管道中使用它们,那么每个 epoch 的步长将是 4
    【解决方案2】:

    我打印了 X.shape,似乎是 32 张图像,但经过修改,所以它不会使图像相乘。我说的增强数据的方法也很好。

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2018-05-06
      • 2020-01-20
      相关资源
      最近更新 更多