笔者自2020.10.13学习卷积神经网络相关知识,于此仅做笔记记载。
声明:
1.本文为个人学习总结,部分内容(包括数学公式)是来自书籍及网上的资料。具体引用的资料请看参考文献。具体的版本声明也参考原文献。
2.本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应,更有些部分本来就是直接从其他博客复制过来的。如果某部分不小心侵犯了大家的版权,还望海涵,并联系本人删除或修改。
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一,常见地包含有输入层(input layer)、卷积层(convolutional layer)、激活函数(activation function )、池化层(pooling layer)、全连接层(fully connected layer)。
上图为卷积神经网络识别汽车的结构展示。
参考文章
输入数据需要进行预处理操作,原因如下:
(1).防止输入数据单位不一样,导致神经网络收敛速度慢、训练时间长;
(2).数据范围大的输入在模式分类中作用偏大,反之偏小;
(3).神经网络中存在的激活函数有值域限制,必须将网络训练的目标数据映射到激活函数值域;
(4).S形激活函数在(-4,4)区间外很平缓,区分度太低。
去均值:把输入数据各个维度都中心化到0,所有样本求和求平均,然后用所有的样本减去这个均值样本就是去均值。
归一化:数据幅度归一化到同样的范围,对于每个特征而言,范围最好是[-1,1]
PCA/白化:用PCA降维,让每个维度的相关度取消,特征和特征之间是相互独立的。白化是对数据每个特征轴上的幅度归一化。
参考文章1
参考文章2
卷积层的功能是对输入的Image数据进行特征提取。卷积层内部包含n个卷积核(尺寸必须相同),对应输出n个通道,即depth=n。增加一个卷积核,就会产生一个特征图。
如上图所示,卷积层包含6个卷积核分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果,此时depth=6。
卷积核大小(kernel/filter size):卷积核大小可以设为小于输入图像尺寸的任意值,卷积核越大,提取的特征越复杂;
步长(stride):卷积步长定义了卷积核相邻两次扫过特征图时位置的距离,卷积步长为1时,卷积核会逐个扫过特征图的元素,步长为n时会在下一次扫描跳过n-1个像素。步长越小,提取的特征越多,但是步长一般不取1,因为考虑时间效率的问题,步长也不能太大,否则会漏掉图像上的信息。
填充:由于卷积的边长大于S,会造成每次移动滑窗后有交集部分,交集部分意味着多次提取特征,尤其表现在图像的中间区域提取次数较多,边缘部分提取次数较少,故采用填充的方式解决。常用的犯法为零填充法。
如上图所示,输入图像为773的矩阵,+pad1意为填充了一圈0, +pad n表示加n圈0。
深度(depth):通道数,一般初始图像为单通道或三通道(RGB),depth = 1或3,通过卷积层处理后,depth取决于该层卷积核的个数。
如上所述的卷积核,其是由权重系数构成的矩阵,在进行卷积计算时,卷积核会有规律地扫过输入特征,在感受野(reception filed)内对输入特征做矩阵元素乘法求和并叠加偏差量(bias vector),得到一个新的特征图(feature map)。
如上图所示,左边是image矩阵,使用33的卷积核,第一次滑动的时候,卷积核和图片矩阵作用11+10+11+00+11+10+01+00+11+0=4,会产生一个值,这个值就是右边矩阵的第一个值,filter滑动9次之后,会产生9个值,也就是说下一层有9个神经元,这9个神经元产生的值就构成了一个矩阵,该矩阵叫做特征图(feature map),其表示image的某一维度的特征。
图片是一个矩阵,我们用指定大小的卷积核从左上角到右下角来滑动,每次滑动所圈起来的结点会和下一层的一个结点相连,连接之后就会形成局部连接,每一条连接都会有一个权重系数构成的矩阵,这个矩阵就是卷积核,所以每次滑动都会产生一个卷积核,而因为权值共享,所以这些卷积核都是一样的。卷积核会不断和当时卷积核所圈起来的局部矩阵作用,每次产生的值就是下一层结点的值了,这样多次产生的值组合起来就是一个特征图,表示某一维度的特征。也就是从左上滑动到右下这一过程中会形成一个特征图矩阵(共享一个卷积核),再从左上滑动到右下又会形成另一个特征图矩阵(共享另一个卷积核),这些特征图都是表示特征的某一维度。
左区域的三个大矩阵是原图像的输入,RGB三个通道用三个矩阵表示,大小为773。Filter W0表示1个filter,尺寸为3X3,深度为3(三个矩阵);Filter W1也表示1个filter。因为卷积中我们用了2个filter,因此该卷积层结果的输出深度为2(绿色矩阵有2个)。Bias b0是Filter W0的偏置项,Bias b1是Filter W1的偏置项。OutPut是卷积后的输出,尺寸为3X3,深度为2。
计算过程:
输入是固定的,filter是指定的,因此计算就是如何得到绿色矩阵。
第一步,在输入矩阵上有一个和filter相同尺寸的滑窗,然后输入矩阵的在滑窗里的部分与filter矩阵对应位置相乘:
第二步,将3个矩阵产生的结果求和,并加上偏置项,即0+0+0+1=1,因此就得到了输出矩阵的左上角的1:
第三步,滑动窗口2个步长,重复之前步骤进行计算;
第四步,最终可以得到,在2个filter下,卷积后生成的深度为2的输出结果。
在卷积神经网络中,卷积不仅限于对原始输入的卷积,还可以对上一个卷积层的输出进行进一步的卷积处理。特征是不断进行提取和压缩的,最终能得到比较高层次特征,即对原特征一步又一步的浓缩。随着卷积神经网络层数的增加,特征提取的越来越具体化,最后利用最后一层特征可以做各种任务:比如分类、回归等。
如上图所示:第一次卷积可以提取出低层次(low level)的特征;第二次卷积可以提取出中层次(middle level)的特征;第三次卷积可以提取出高层次(high level)的特征。
参考文章
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。
如上图,在最简单的情况下,数据是线性可分的,只需要一条直线就已经能够对样本进行很好地分类。
但如果情况变得复杂,数据就变成了线性不可分的情况。在这种情况下,简单的一条直线就已经不能够对样本进行很好地分类了。因此,我们引入非线性的因素,对样本进行分类。
在神经网络中也类似,如果没有激活函数,每一层节点的输入都是上层输出的线性函数,输出都是输入的线性组合,与没有隐藏层效果相当,那么网络的逼近能力就相当有限。引入非线性函数作为激励函数,这样输出就不再是输入的线性组合,而是几乎可以逼近任意函数,深层神经网络表达能力就更加强大。
参考文章1 优点: ReLU函数虽然不是Alex首次提出来的,但是当AlexNet在2012届图像识别大赛取得冠军才使其被大众所熟知。softplus可以看作是 ReLU的平滑版本。 relu定义为 f(x)=max(x,0)。softplus 定义为 f(x)=log(1+exp(x))。 参考文章1 综上,我们可以认为全连接层之间的在做特征提取,而全连接层在做分类,分类结果在输出层输出,这就是卷积神经网络的核心。
参考文章2
在实际应用中,我们还会涉及到以下的一些概念:
饱和:当一个激活函数h(x)满足limn→+∞h′(x)=0 时我们称之为右饱和。当一个激活函数h(x)满足limn→−∞h′(x)=0时我们称之为左饱和。当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和。
硬饱和与软饱和:对任意的x,如果存在常数c,当x>cx>c时恒有 h′(x)=0h′(x)=0则称其为右硬饱和,当xsigmoid函数:
1.Sigmoid函数的输出映射在(0,1)(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。
2.求导容易。
缺点:
1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。
2.其输出并不是以0为中心的。tanh函数:
优点:
1.比Sigmoid函数收敛速度更快。
2.相比Sigmoid函数,其输出以0为中心。
缺点:
还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。ReLU函数:
由上图可见, relu 在 x<0 时硬饱和。由于 x>0 时导数为 1,所以, relu 能够在 x>0 时保持梯度不衰减,从而缓解梯度消失问题,还能够更很地收敛,并提供了神经网络的稀疏表达能力。但是,随着训练的进行,部分输入会落到硬饱和区,导致对应的权重无法更新,称为“神经元死亡”。Leaky ReLU函数(PReLU)
2.4 池化层(pooling layer)
池化就是对特征图进行特征压缩,池化也叫做下采样,通过选择原来某个区域的max或mean代替那个区域。另外,池化是在不同的depth上是分开执行的,也就是depth=5的话,pooling进行5次,产生5个池化后的矩阵,池化不需要参数控制。池化操作是分开应用到各个特征图的,我们可以从五个输入图中得到五个输出图。
池化的主要作用如下:
1.保留主要的特征,同时减少下一层的参数和计算量,防止过拟合;
2. 保持某种不变性,包括translation(平移),rotation(旋转),scale(尺度);
常用的池化方法有mean-pooling和max-pooling两种。
2.5 全连接层
所谓全连接层是指该层的每一个元素都与上一层所有的元素相连。通常,全连接层在卷积神经网络尾部,当前面卷积层抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。一般来说,卷积层的最后会将末端得到的长方体通过卷积平摊成一个长长的向量,并送入全连接层配合输出层进行分类。
从上图我们可以看出,我们用一个 3×3×5 的 filter 去卷积上一层的输出,得到的结果就是一个 fully-connected layer 的一个神经元的输出,这个输出就是一个值。
上图所示为一个四分类问题。三、常见的卷积神经网络模型
3.1 AlexNet
3.2 GoogleNet
3.3 VGGNet
3.4 ResNet