我正在尝试使用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个批次,然后停止,所以这就是我的疑问。
谢谢。
答案 0 :(得分:0)
让我尝试回答
1.如果仅使用ImageDataGenerator
将批次大小32传递给horizontal_flip=True
,它将水平翻转全部32张图像,然后将这32 +32(原始+翻转)传递给训练。
如果设置horizontal_flip
和vertical_flip
,则将传递32 + 32 + 32图像进行训练。
对于brightness_range
,它针对与一个原始图像相对应的每个亮度等级生成一个图像。这意味着,如果您的亮度等级为0.1-0.5
,则生成32*5
个图像。
我不确定第二个问题。更好的选择是在训练和测试数据上进行更多的数据扩充。
对于第三个问题,您应尝试将efficient net
与focal loss
答案 1 :(得分:0)
我打印了X.shape,似乎是32张图像,但已修改,因此它不会将图像相乘。而且我所说的扩充数据的方法也很好。