前言
无论是机器学习还是深度学习,都是为了解决某个问题,比如为了解决分类的问题。拿猫狗分类当作例子,那么就需要知道猫,狗究竟是怎么表达的,要去了解它们的毛发,体型,长相等等。以上说的就是我们到底要选取它们的哪一些特征。
当我们选取了合适的特征之后,就可以让机器学习,深度学习这一些算法去帮我们逐步去训练,去学习它们的特征。以深度学习为例:训练完毕后,我们就可以得到在神经网络中各个层的参数。
卷积神经网络的组成
卷积神经网络概括:
卷积的主要作用是提取特征,并且在提取特征的同时能够使网络加深。因为卷积的过程是使用参数共享的方法来减少网络参数,那么这样一来就可以减少网络的运算量。参数共享的意思是使用相同的卷积核去按行、按列进行扫描,因为都是扫描的时候都是使用同一个卷积核,所以也称为权值共享。也因为参数共享的方式减少了许多运算量,所以可以对高维的数据进行处理,并且不需要在初始化的时候选取特征的属性,只需要将训练好的权重作为我们想要的特征值就可以了。在计算机视觉中,我们就会经常遇到卷积神经网络来提取特征,但是卷积神经网络的复杂性较大,使用起来需要不断调参,否则容易造成过拟合。
卷积神经网络包括,训练的过程是通过反向传播来更新权重。我们知道对于人体的神经元来说,有信号的正向传播。将这一个概念映射到神经网络中,就相当于输入样本从上一层输入,经过中间各层处理,最后从输出层输出。
但一般来说,训练的过程并非一帆风顺,如果当输出的结果与预期结果较为不符,我们希望可以通过得到的这些误差来间接调整各层的权重参数。这里就会将输出反向传播回上一层,平均地将误差作为修正依据分摊给各个神经元,从而使各个神经元进行权重的修正,使网络向误差小的方向进行训练。从而达到提升训练的效果:
卷积层:
卷积层中的卷积核可以理解为是一个m*n的矩阵,其中里边的数字代表着权重。卷积神经网络里有一个概念叫做感受野。感受野是用来表示网络内部不同神经元对图像的感受范围,也就是在CNN中表示原图的区域大小,那是因为CNN关注局部像素的相关性比较强,而较远像素的相关性则比较弱,所以神经元的感受野越大,说明它能感受到全图的范围就越大,越小则说明它越关注局部和细节。
我们可以通过卷积核里面的数字使一定区域内的像素进行加权求和、提取特征,也可以通过设置卷积核的大小来让网络只关注哪一些局部的特征,也就是提取哪一些区域的特征,所以也可以说,表达局部的程度取决于这个卷积核的卷积核大小。
一般的卷积核为奇数尺寸,这是因为奇数的对称性方便确定中心、对角线这些位置,而偶数是不对称的,有可能造成混叠错误,并且不能保证通过卷积运算后特征的尺寸保持原来不变。 常用的卷积核尺寸有3x3,5x5,7x7。尺寸越大,运算量越大,因此一般不选择大尺寸进行建模。
虽然1x1的卷积核看上去并没有考虑在前一层的局部信息关系,但是实际当中还是有1x1卷积核的使用场景。当1x1大小的卷积核出现时,大多数情况下它的作用是进行升/降特征的维度,这里的维度指的是通道数(厚度),而不改变图片的宽和高。
此外1x1的卷积核也类似全连接层的作用,可以实现不同通道上的交互以及不同通道的信息整合能力,借此增加了非线性的作用。
除了以上,卷积的特点还有:对图像的外围进行不同方式的填充,全零填充,均值填充,镜像填充;不同步长的设置,设定卷积核每次移动的步长为stride,步长一般会小于卷积核的尺寸,目的是使得窗口之间出现重叠的区域,这样可以降低窗口间边缘的不平滑。
卷积的公式:
N=(W-F+2P)/S+1
其中N:输出大小,W:输入大小,F:卷积核大小,P:填充值的大小,S:步长大小
激活函数和BN层:
卷积运算完之后一般会使用激活函数使之非线性化。因为如果只使用线性函数进行叠加的话,那么假设第一层的输出为y1=k1x+b, 第二层输出为y2=k2y1+b,那么最终第n层的输出y就可以写成kn*x+b, 这样一来,无论有多少层,都只是线性关系,模型的表达能力就受到的限制。 因此这里就需要添加激活函数进行非线性化。常见的激活函数有tanh,relu,sigmoid。
但是随着x趋向正无穷或者趋向负无穷时,激活函数的变化程度会随之减小,所以为了使特征的变化更加明显,一个比较好的办法就是让特征处于激活函数的活跃区域,也就是梯度变化较大的区域,这样就可以让网络更好地学习了。这里就涉及到了BN层的数据归一化作用。
BN也是Batch Normalization的意思,在数据预处理阶段,数据通常会被标准化以降低样本之间的差异性、加快收敛速度。同样地,对神经网络内部隐藏层的输出也可以进行标准化,即增加BN层使输出服从高斯分布,然后再送入下一层进行处理。BN层一般位于卷积层的后面,池化层的前面。
传统的处理方法为:
a.去均化:将输入的数据减去他们的均值,将各个维度的中心归零。
(x-min )/ max - min
b.归一化:将各个维度的幅度归一化到一定的范围内。
(x - mean ) / var
此外,标准化后的数据在0-1范围,不会造成像上一层的数值大小为255,而这一层却仅仅为15这样小的结果,从而造成数据相差过大的现象(因为这样产生的数据差别过大现象会造成梯度爆炸,从而使训练失效)。这样一来,因为数据都已经固定在一定的范围内了,所以也可以允许网络使用较大的学习率,来加快收敛的速度。
需要注意的是:BN层可以使梯度传递的更加流畅,但是随着网络的加深,模型训练速度会变慢。
池化层:
池化层也称为采样层,它可以缩减上一层的输入,减少参数的个数。因为卷积神经网络拥有许多的参数,所以可能出现网络的参数过分迁就训练集中的样本,从而导致过拟合的现象(也就是在训练集上表现良好,但是在评估集上准确率就相差许多)。比如一张图上的6x6个像素合并成了一个像素,这样就可以又起到提取显著的特征、最大化保留图像的有效信息,又舍弃了个别信息、使特征图变小的作用。这样也就意味着模型参数的减少,从而一定程度上减缓过拟合。
池化也分为:有最大值池化,和均值池化两种方式。 顾名思义,最大池化就是取这个窗口范围内的最大值作为代表,平均池化就是取窗口范围内的平均值作为代表。
全连接层:
如果说卷积层的作用是提取特征,那么全连接层的作用就是将所有特征组合在一起,最后生成一个分类器。全连接层的作用是和上一层的神经元全部连接在一起,连在一起的作用可以忽略空间结构上的影响,比如特征是一样的,但是特征的位置不同,那么分类结果有可能不同。
假设我们输出的特征结果为:[0 1 0 0]、 [0 0 0 1]。那么全连接层就可以直接将这个特征图做运算,输出一个值,这样忽略了这个值的位置。当连接完所有的特征之后,全连接层就可以将输出值送给分类器(如softmax)进行分类或者其他的任务。