保持了层级网络结构
不同层次使用不同的形式(运算)与功能
数据输入层:Input Layer
卷积计算层:CONV Layer
ReLU激励层:ReLU Incentive Layer
池化层:Pooling Layer
全连接层:FC Layer
备注:Batch Normalization Layer(可能有)
和神经网络/机器学习一样,需要对输入的数据需要进行预处理操作,需要进行预处理的主要原因是:
输入数据单位不一样,可能会导致神经网络收敛速度慢,训练时间长
数据范围大的输入在模式分类中的作用可能偏大,而数据范围小的作用就有可能偏小
由于神经网络中存在的激活函数是有值域限制的,因此需要将网络训练的目标数据映射到激活函数的值域
S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X),f(100)与f(5)只相差0.0067
常见3种数据预处理方式
去均值
将输入数据的各个维度中心化到0
归一化
将输入数据的各个维度的幅度归一化到同样的范围
PCA/白化
用PCA降维(去掉特征与特征之间的相关性)白化是在PCA的基础上,对转换后的数据每个特征轴上的幅度进行归一化
• http://ufldl.stanford.edu/wiki/index.php/白化
备注:虽然我们介绍了PCA去相关和白化的操作,但是实际上在卷积神经网络中,一般
并不会适用PCA和白化的操作,一般去均值和归一化使用的会比较多。
建议:对数据特征进行预处理,去均值、归一化.
人的大脑在识别图片的过程中,会由不同的皮质层处理不同方面的数据,比如:颜色、形状、光暗等,然后将不同皮质层的处理结果进行合并映射操作,得出最终的结果值,第一部分实质上是一个局部的观察结果,第二部分才是一个整体的结果合并
基于人脑的图片识别过程,我们可以认为图像的空间联系也是局部的像素联系比较紧密,而较远的像素相关性比较弱,所以每个神经元没有必要对全局图像进行感知,只要对局部进行感知,而在更高层次对局部的信息进行综合操作得出全局信息;即局部感知。
卷积计算层:CONV Layer
局部关联:每个神经元看做一个filter
窗口(receptive field)滑动,filter对局部数据进行计算
相关概念
深度:depth
步长:stride
填充值:zero-padding
CONV过程参考:http://cs231n.github.io/assets/conv-demo/index.html
一个数据输入,假设为一个RGB的图片
在神经网络中,输入是一个向量,但是在卷积神经网络中,输入是一个多通道图像
局部感知: 在进行计算的时候,将图片划分为一个个的区域进行计算/考虑;
参数共享机制:假设每个神经元连接数据窗的权重是固定的
滑动窗口重叠:降低窗口与窗口之间的边缘不平滑的特性。
固定每个神经元的连接权重,可以将神经元看成一个模板;也就是每个神经元只关注一个特性需要计算的权重个数会大大的减少
备注:一组固定的权重和不同窗口内数据做矩阵内积后求和的过程叫做卷积
类似传统神经网络中的结构,FC层中的神经元连接着之前层次的所有激活输出;
换一句话来讲的话,就是两层之间所有神经元都有权重连接;通常情况下,在CNN中,FC层只会在尾部出现
一般的CNN结构依次为:
INPUT
[[CONV -> RELU] * N -> POOL?]*M
[FC -> RELU] * K
FC
Batch Normalization Layer(BN Layer)是期望我们的结果是服从高斯分布的,
所以对神经元的输出进行一下修正,一般放到卷积层后,池化层前。
论文:Batch Normalization: Accelerating Deep Network Training by
Reducing Internal Covariate Shift;
论文链接:https://arxiv.org/pdf/1502.03167v3.pdf
Batch Normalization优点:
梯度传递(计算)更加顺畅,不容易导致神经元饱和(防止梯度消失(梯度弥散)/梯度爆炸)
学习率可以设置的大一点
对于初始值的依赖减少
Batch Normalization缺点:
如果网络层次比较深,加BN层的话,可能会导致模型训练速度很慢。
备注:BN Layer慎用!!!
保存了层级的网络结构
不同层次有不同的形式(运算)与功能
《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》
一般情况下,对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一半左右的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其它的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其它神经元之间的更加健壮robust(鲁棒性)的特征。另外Dropout不仅减overfitting,还能提高准确率。
正则化是通过给cost函数添加正则项的方式来解决overfitting,Dropout是通过
直接修改神经网络的结构来解决overfitting
一般都可以使用Dropout解决过拟合问题
回归算法中使用L2范数相比于Softmax分类器,更加难以优化
对于回归问题,首先考虑是否可以转化为分类问题,比如:用户对于商品的评分,可以考虑将得分结果分成1~5分,这样就变成了一个分类问题。
如果实在没法转化为分类问题的,那么使用L2范数的时候要非常小心,比如在L2范数之前不要使用Dropout。
一般建议使用L2范数或者Dropout来减少神经网络的过拟合。
和一般的机器学习算法一样,需要先定义Loss Function,衡量预测值和实际值之间的误差,一般使用平方和误差公式
找到最小损失函数的W和b的值,CNN中常使用的是SGD
其实就是一般机器学习中的BP算法;SGD需要计算W和b的偏导,BP算法就是计算偏导用的,BP算法的核心是求导链式法则。
增加训练数据,则能够提升算法的准确率,因为这样可以避免过拟合,而避免了过拟合
你就可以增大你的网络结构了。当训练数据有限的时候,可以通过一些变换来从已有的训
练数据集中生成一些新的数据,来扩大训练数据。数据增强的方法有:
- 水平翻转
2)随机裁剪
如原始图像大小为256*256,随机裁剪出一些图像224*224的图像。如下图,红色方框内
为随机裁剪出的224*224的图片。 AlexNet 训练时,对左上、右上、左下、右下、中间做了5次裁剪,然后翻转,得到10张裁剪的图片。防止大网络过拟合(under ubstantial overfitting)。
3)fancy PCA
在训练集像素值的RGB颜色空间进行PCA, 得到RGB空间的3个主方向向量,3个特征值, p1,
p2, p3, λ1, λ2, λ3. 对每幅图像的每个像素加上如下的变化:
4)样本不均衡
样本不均衡即有些类别图像特别多,有些特别少。类别不平衡数据的处理:Label shuffle。
5)其他
平移变换;
旋转/仿射变换;
高斯噪声、模糊处理
对颜色的数据增强:图像亮度、饱和度、对比度变化。
6)训练和测试要协调
在训练的时候,我们通常都需要做数据增强,在测试的时候,我们通常很少去做数据
增强。这其中似乎有些不协调,因为你训练和测试之间有些不一致。实验发现,训练的最
后几个迭代,移除数据增强,和传统一样测试,可以提升一点性能。
如果训练的时候一直使用尺度和长宽比增强数据增强,在测试的时候也同样做这个变
化,随机取32个裁剪图片来测试,也可以在最后的模型上提升一点性能。
就是多尺度的训练,多尺度的测试。
训练过程的中间结果,加入做测试,可以一定程度上降低过拟合。
1)学习率(Learning Rate)
学习率被定义为每次迭代中成本函数中最小化的量。也即下降到成本函数的最小值的
速率是学习率,它是可变的。从梯度下降算法的角度来说,通过选择合适的学习率,可以使梯度下降法得到更好的性能。
一般常用的学习率有0.00001,0.0001,0.001,0.003,0.01,0.03,0.1,0.3,1,3,10
2)学习率调整策略
2.1 fixed固定策略,学习率始终是一个固定值。
2.2 step 均匀分步策略,如果设置为step,则还需要设置一个stepsize, 返回
base_lr * gamma (floor(iter / stepsize))其中iter表示当前的迭代次数。floor(9.9)=9, 其功能是“下取整”。
2.3 base_lr * gamma iter, iter为当前迭代次数。
2.4 multistep 多分步或不均匀分步。刚开始训练网络时学习率一般设置较高,这样loss和
accuracy下降很快,一般前200000次两者下降较快,后面可能就需要我们使用较小的学习
率了。step策略由于过于平均,而loss和accuracy的下降率在整个训练过程中又是一个不平均的过程,因此有时不是很合适。fixed手工调节起来又很麻烦,这时multistep可能就会派上用场了。multistep还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据 stepvalue值变化。
2)学习率调整策略
2.4 multistep设置示例(caffe)
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "multistep"
gamma: 0.9
stepvalue: 5000
stepvalue: 7000
stepvalue: 8000
stepvalue: 9000
stepvalue: 9500
2.5 poly: 学习率进行多项式误差, 返回 base_lr *(1 - iter/max_iter) power
1)过拟合
过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。
2)欠拟合
欠拟合模型没有很好地捕捉到数据特征,不能够很好地拟合数据。
3)误差的变化
4)根据特征的层来调整参数
左图很粗糙,显示不出底层特征,可能是因为网络不收敛或者学习速率设置不好或者是因为惩罚因子设置的太小。 右图合理,特征多样,比较干净、平滑。