ImageDataGenerator返回什么,以及如何进行数据扩充?

时间:2020-02-21 13:09:38

标签: python keras conv-neural-network cnn

我正在尝试使用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个批处理大小为1的图像32,它从那一个返回32个修改过的图像?我几乎可以确定每一个都是1,但我想确认一下。

第二,如果我想拥有40k图像,如果当索引超过samples // batch_size时再次将索引更改为0,然后将 len 方法更改为2或任意倍数,应该是因为图像是随机生成的,所以我将有4900张新图像,或者我想要的数量是不是?

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

谢谢。

2 个答案:

答案 0 :(得分:0)

让我尝试回答 1.如果仅使用ImageDataGenerator将批次大小32传递给horizontal_flip=True,它将水平翻转全部32张图像,然后将这32 +32(原始+翻转)传递给训练。
如果设置horizontal_flipvertical_flip,则将传递32 + 32 + 32图像进行训练。 对于brightness_range,它针对与一个原始图像相对应的每个亮度等级生成一个图像。这意味着,如果您的亮度等级为0.1-0.5,则生成32*5个图像。

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

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

答案 1 :(得分:0)

我打印了X.shape,似乎是32张图像,但已修改,因此它不会将图像相乘。而且我所说的扩充数据的方法也很好。