一、数据集准备和扩增
1)沿着X轴将图片左右翻转:如镜像。
2)随机的剪切、缩放、旋转。
3)颜色抖动:R、G、B分别随机在一定范围内的做增减。
4)提高图像中像素的饱和度(可以改变光线明暗对图片识别率的影响)和值(即HSV颜色空间的S和V成分)到0.250.25和44之间(在一个样本图像内要保证各个像素该值是一样的),再在图像上加上一个范围在[-0.1,0.1][-0.1,0.1]之间的值给H(Hue,即HSV的色调)这个成分。
~~~~~~~~~~~~~~~~~~~~以上四种比较直观
5)用PCA来改变RGB的强度值,产生分别对应的特征值和特征向量,然后用均值为0方差为0.1的随机数与特征值和特征向量相乘得到新的数据。
Fancy PCA(12年提出,李飞飞老师学生提出):
a、对训练数据的像素点在RGB三个维度上计算PCA。
b、用PCA获得它的特征向量和对应的特征值。
c、对特征向量和特征值做偏移。
二、图像预处理
常见的是减均值、除方差,还有变化到-1~1,主要针对不同尺度的特征,进行尺度变换normaliz.
1)去均值(zero-centered)和规范化(normalize):让每个样本都减去整体样本的均值,使整体样本的新均值为0,再进行规范化(normalize):将每一个维度的最大最小值分别限定为1和-1。
2)主成分分析白化(PCA-Whitening)
a.数据先经过去均值,然后计算出(能刻画数据内部相关结果的)协方差矩阵:
>>>X -=np,mean(X,axis=0)#去均值
>>>cov=np.dot(X.T,X)/X.shape[0]#计算协方差矩阵
b.之后对数据去相关,方法是将(刚刚去均值后的)原始数据投影到特征基(eigenbasis)上:
>>>U,S,V=np.linalg.svd(cov)#对数据的协方差矩阵计算SVD分解
>>>Xrot=np.dot(X,U)#对数据去相关
c.最后一步是白化,它对去相关后的数据在每个维度上的特征值做尺度规范化处理:
>>>Xwhite=Xrot/np.sqrt(S+1e-5)#除以特征值(其实是奇异值的开平方根),
目的是为了更大的平滑,减低噪声影响。
缺点:放大噪声
原因:白化过程尺度变化时,噪声也做了同样变化。
3)参数初始化
训练网络前对参数做初始化。常用初始化方法如下:
a.全零初始化(错误,不可取)
b.小随机数初始化:是一种接近0但不是00的权重初始化方法。
做法:初始化权重为接近0的随机小数,因为很接近0但不相等,这也被称为“对称破缺”(symmetry breaking)。
,也可以使用均匀分布。
c.方差校准
使用前面讲到方法对权重随机初始化得到的神经元都存在一个问题,网络输出单元的值得分布的方差(variance)会随着输出单元的增多而变大。但可以让每个随机得到的权重向量通过除以输入单元个数的平方根sqrt(n)来规范化(normalize),代码如下:
>>>w=np.random.randn(n)/sqrt(n)
使用输入单元个数n的平方根来校正最终输出导致的高方差,其中函数randn来表示生成的结果服从标准正态分布(即高斯分布),变量n表示输入单元的个数。这样确保了网络中神经元在最初时有着大致相同的输出分布,以及收敛速度的提升。
d.推荐方法(微软亚洲研究院)
先前通过校准神经元上的方差来初始化参数并未考虑使用ReLUs这样的激活函数。最近一篇论文(K.He,X.Zhang,S.Ren,and J.Sun.Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification.lnlCCV,2015)
讨论了如何为ReLUs这样的激活函数做参数初始化,从而使网络中神经元的方差为2.0/n,初始化方式如下:
>>>w=np.random.randn(n)*sqrt(2.0/n)#目前推荐做法
‘xavier’为第三种’msra’为第四种