10.1 深度学习框架Caffe学习与应用-数据集准备和扩增、图像预处理

 

一、数据集准备和扩增

  • 数据准备:一般数据集可能不会给出验证集,所以自己会从给的训练集中按照一定比例(9:1)分离出验证。
  • 数据的扩增:因为深度网络需要在大规模的训练图像上来满足性能,所以,当原始数据集不够时需要进行数据扩增。
  • 常用方法:

      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)。

                   weights ~ 0.001\times N\left ( \left 0,1 \right )\right )   ,也可以使用均匀分布。

      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)#目前推荐做法
  •  参数初始化在Caffe上的设置(决定了收敛的效率和效果)

     ‘xavier’为第三种’msra’为第四种

 

            

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值