AlexNet 3 数据增强(data augmentation)

根据alexnet的论文,当gpu训练的时候cpu在扩充图片,也就是其数据增强是在cpu上进行的。

1.调整图片的形状来扩展训练集

第一步:统一输入图片的大小

因为训练集的图片大小都不统一,而alexnet输入要求格式为 【227,227,3】

首先统一将图片格式设定为【256,256,3】,但是不是单纯的直接resize。比如原始图片大小为【375,500,3】,先将最小的一边缩放成256,也就是【256,500,3】,再取图片中间的一块【256,256,3】patch resize后的图片

AlexNet 3 数据增强(data augmentation)_第1张图片

第二步:扩展数据

训练时:在256*256的图片中随机截取227*227的小块得到(256-227)^2=841,在加上水平翻转841*2=1682

可以看到这个数据量实在是太大了,一张图片就扩展了1682倍的话对电脑内存的需求太大了。

而且类比卷积,这种crop相当与stride=1,也就是每张图之间绝大部分是相同的

AlexNet 3 数据增强(data augmentation)_第2张图片

改进:

我的想法是既然alexnet原文里面先把图片统一为256*256再crop,那不如直接随机crop出227*227的小patch,这样图片多样性也丰富,函数也简单

AlexNet 3 数据增强(data augmentation)_第3张图片

可以看到这样做的话还是有风险的,比如第3张图中只有斑马的一小部分出现的图中。假如原图的物体比较小,那么这种截取方法很可能会导致一些图片中不包含目标物体,这样相当于给数据加入了噪声

比较:看两种方法的效果哪个好

测试时:在测试图片的4个角与正中间去一共5张图,再加上水平翻转一共10张。将这10张图的score(也就是softmax层的输出)取平均

实践:

现实问题:原论文中一张原图扩展出2048张图片,5种花数据集有大概3000张图片(一次读取到内存占用空间:3000*227*227*3*4 大概为1.7Gb左右),要是直接将全部图片一次扩展,存到内存中大概需要内存 1.7*2000 差不多要3000多Gb的内存,显然是不现实的。

解决办法:

首先是将扩展的图片用AlexNet不训练的网络层来抽取特征然后再将这:3000*200=60万张图片抽取的特征分成多个batch保存到硬盘中(提取倒数第二层的输出:1*4096),那么60万张图的特征大概占9.5Gb左右

1.训练集(扩展200倍,用200*3000=60万张图)


利用AlexNet网络将这60万张图转换成 1*4096维度的特征(FC6的输出)

(a)先得到一个划分好训练集合测试集的图片地址字典

AlexNet 3 数据增强(data augmentation)_第4张图片

(b)得到图片的地址字典后,将训练集中的图片每张扩展200倍,输出到alexnet中转换成特征。因为即使60万张训练图片转换成特征(1*4096)后仍然会占用内存9Gb(float32双精度浮点变量)所以会分成多个batch存储(每个batch存储8万条特征)

AlexNet 3 数据增强(data augmentation)_第5张图片

(c)将test图片提取特征存储(736张测试原图)

这一点卡了比较久,因为主要问题是要求将1张测试集扩展成10张,将这10张送入网络,平均得分然后再得到分类值。

我的策略是,在扩展测试图的时候扩展成格式为 (736,10,227,227,3),这样的话在随机抽取测试集的时候就会方便很多。同时这样也使得计算测试集的准确率和loss函数的表达式会有一点不同

为了保证测试集的一致性,先将测试集扩展后保存

AlexNet 3 数据增强(data augmentation)_第6张图片

然后是将扩展后的图片转换成特征

AlexNet 3 数据增强(data augmentation)_第7张图片

(4)训练

上面的工作将测试集、训练集扩展后转换成特征值,再保存到硬盘中。得到这些数据后我们就可以开始训练了。

在本例子中我设定的可训练网络为 fc7-fc8

先修改一下测试函数的accuracy&loss计算

AlexNet 3 数据增强(data augmentation)_第8张图片

然后开始训练,在训练过程中一次加载4个batch,大概32万条特征到特征池,再平均每条特征训练2次左右后重新抽取特征池里面的特征(每次训练送1024条特征进入网络训练)

AlexNet 3 数据增强(data augmentation)_第9张图片

结果分析:

没有进行数据增强前的fc7-fc8网络,训练时间大概是3min,准确率基本在83%左右


AlexNet 3 数据增强(data augmentation)_第10张图片

进行数据增强后会大大增加网络的训练时间,下面是进行数据增强后的fc7-fc8网络。在经过4小时的训练后在测试集的准确率大概是在87%左右(增大训练时间可能会稳定在90%)

AlexNet 3 数据增强(data augmentation)_第11张图片


AlexNet 3 数据增强(data augmentation)_第12张图片

这里可以看到loss在两个地方有比较大的波动,我的分析是认为和我的数据分发模式有关的。因为我一次从硬盘中载入 4*80000=32万条特征数据,然后再针对这32万条数据训练8000次(每次输入网络的batch为1024),刚开始前8k因为一直是对32万条数据进行训练,出现了过拟合,在经过多次更新大的特征池后,网络见过了所有的训练数据,就没有再出现这里强的过拟合了。

AlexNet 3 数据增强(data augmentation)_第13张图片

结论:

使用数据增强后大概能够提升5~10%左右的表现,但是会大大的增长训练的时间。但是假如是运用到实际的项目上这个训练时间还是可以接受的,但是假如只是平时练手或者是做模型验证的话建议还是不要用数据增强了





你可能感兴趣的:(AlexNet 3 数据增强(data augmentation))