训练神经网络模型时对图片的预处理是否必要?

用 CNN 做 classification 任务时,我们需要对图片做 pre processing, 例如先 减去 mean 再 除 std, 很多…
关注者
88
被浏览
79,287

10 个回答

图片需要进行预处理的原因:

1. 适应神经网络结构:网络结构可以接收的数据格式/类型是固定的,因此在训练过程之前,需要将训练样本预处理成为可以被神经网络读取的格式/类型;

3. 对训练样本进行提纯:训练样本中可能存在“不好的数据”,通过预处理手段,可以将这部分数据剔除掉,或者消除掉它的影响;

3. 进行数据增强:对训练样本进行预处理,可以增加数据的多样性。例如通过旋转、镜像、裁切等手段,将图片的空间多样性呈现出来,据此训练出来的模型也将具有更好的鲁棒性;

4. 数据归一化:预处理可以将不同规格的数据转换成相同规格的训练数据,最典型的的例子就是图片的尺寸归一化。

5. 压缩数据体积:预处理还可以减小训练数据的尺寸。例如原始数据是FHD尺寸的,若压缩至QQVGA则会大幅缩减数据体积。

预处理有很多种,问题中提了一种,简要说明一下:

1、问题中提到的减均值除以方差的方式,在Batch Normalization(BN)出现之前是很有必要的,因为这样拉到均值附近,学习的时候更加容易,毕竟激活函数是以均值为中心的,学习到这个位置才能将不同的类分开。但是BN出现之后,这个操作就完全没必要了,因为每次卷积后都有BN操作,BN就是把数据拉到0均值1方差的分布,而且这个均值和方差是动态统计的,不是只在原始输入上统计,因此更加准确。即采用BN后该预处理无必要。

2、数据增强(Data Augment):以前有数据增强的各种研究,目前很少出现了。数据增强的目的是增加样本数量,这在数据很少的情况下是非常有效的,Caffe自己的数据输入层自带裁剪、镜像等功能,一般做法是把训练数据放大到输入尺寸的1.1倍左右,然后随机裁剪到输入尺寸,这个效果非常好。

3、白化等去相关性的操作,我自己实验感觉意义不大,所以一直没有用。

4、输入图像转leveldb格式,这个可以使输入速度提升10%左右,如果你的输入比较慢,屏幕上经常打印出“Data layer prefetch queue empty”这种提示,那么就转一下;如果从来没有出现过这个,说明读取数据的线程足够快了,比你GPU训练的快,所以转不转看个人爱好了。


Oct. 25th, 2018补充

第2点请忽略!回答这个帖子后,忽然发现GAN做数据扩充的文章如雨后春笋般出现在我眼前,原谅我以前没见过春笋,请忽略...