1

我正在尝试使用 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 个批次然后停止,所以这就是我怀疑的原因。

谢谢。

4

2 回答 2

1

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

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

对于第三个问题,您应该尝试efficient net使用focal loss

于 2020-02-21T17:00:31.247 回答
0

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

于 2020-02-27T16:43:13.450 回答