此文是本人在卷积神经网络学习过程中的笔记。文中不进行基础概念的普及,主要以问答的方式来解答学习过程中的困惑,使得理解更加深刻清晰。文中多处摘录他人的博客,在此万分感谢。本人才疏学浅,错误部分望指出,谢谢!
最常见的ConvNet架构遵循以下模式:
INPUT ——> [ [ CONV ——> RELU ] * M ——> POOL ? ] * N ——> [ FC ——> RELU ] * K ——> FC ——> OUTPUT
注:N>=0 (and usually N<=3),M>=0,K>=0(and usually k<3)
如图:
此图的网络架构为;
INPUT ——> [ [ CONV ——> RELU ] * 1 ——> POOL ] * 2 ——> [ FC ——> RELU ] * 1 ——> FC ——> OUTPUT
可以看出,图中并没有出现ReLU激励层,这是由于通常我们将卷积层与ReLU激励层作为一个整体,统称为卷积层。
Q:
- 输入的是什么?
- 为什么要进行数据预处理?
- 如何进行数据预处理?
输入层是整个神经网络的输入,在处理图像的卷积神经网络中,其输入的数据为一张图像。彩色图像以三维矩阵的方式存与计算机中。三维矩阵的长和宽代表了图像的大小,而三维矩阵的深度代表了图像的色彩通道(channel)。从输入层开始,卷积神经网络通过不同的神经网络结构将上一层的三维矩阵转换成下一层的三维矩阵,直至最后的全连接层。
在CNN的输入层中,图像数据输入的格式与全连接神经网络的输入格式(一维向量)不太一样。CNN的输入层的输入格式保留了图片本身的结构信息。
对于黑白的 28×28 的图片,CNN的输入是一个28×28 的的二维神经元(左图);对于RGB格式的28×28图片,CNN的输入是一个3×28×28 的三维神经元(RGB中的每一个颜色通道都有一个 28×28 的矩阵)(右图)。
如图:
注:
通道
是指图片特定成分的习语。常见数码相机拍出来的照片有三个通道——红、绿、蓝,可以想象为是三个二维矩阵(每种颜色对应一个)叠在一起,每个矩阵的值都在0-255之间。- 灰度图像只有一个通道。即一个代表图像的二维矩阵。矩阵中每个像素值的范围在0到255之间——0表示黑色,255表示白色。
进行预处理的主要原因是:
预处理的方式:
去均值与归一化效果图:
去相关与白化效果图:
Q:
- 为什么进行卷积?
- 什么是卷积核?
- 卷积的计算规则是什么?
- 为什么卷积能够减少参数?
- 为什么加上偏置值?
- 卷积提取特征的过程是什么样的?
在卷积神经网络中,卷积的主要目的是从输入图像中提取特征。通过使用输入数据中的小方块(卷积核)来学习图像特征。而这个卷积核也称滤波器,提取图片纹理、边缘等特征信息的工具。卷积保留了像素间的空间关系。
下图就是卷积提取特征的过程,当然不管是原图还是特征图在算法中都是以矩阵的形式出现,在这里形象化的显示了出来。
卷积核(过滤器/滤波器)就是一个比原图像小的矩阵,矩阵中的元素就是神经网络中的参数权重w,一个卷积核在神经网络中就是一个神经元。上图中间那个就是2D卷积核,
那为什么卷积核的尺寸要比原图像小呢?
那是因为如果卷积核和输入图像的一样大,那么就相当于全连接了。这样就相当于把整张图片当作一个特征去学习,但一张图象并不是所有的区域的特征都有助于我们进行分类,同时这样会需要训练大量的卷积核,时间耗费也是十分巨大的,所以CNN中的卷积核的大小设置为小于输入图像的大小。
注:卷积核中的参数权重w可以通过训练反复调整(反向传播),从而达到识别图像的目的。
卷积核(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据,得到一个特征图(feature map)。这个过程中,有这么几个概念:
计算规则:图像与卷积核对应的区域中的参数进行加权求和,也就是相乘再求和。
如下图:2D卷积(3D卷积类似,故不在此处说明)
卷积神经网络CNN极大地提升了计算速度,减少了连接数量的原因在于以下两点:
- 局部感知(local field)
- 权值共享(Shared Weights)
普通的多层神经网络中,隐层神经元会全连接到一个图像的每个像素点上,而在卷积神经网络中,每个隐层节点只连接到图像某个足够小局部的像素点上,从而大大减少需要训练的权值参数。
如下图所示,左边是每个像素的全连接,右边是每行隔两个像素作为局部连接,因此在数量上,少了很多权值参数数量(每一条连接每一条线需要有一个权值参数)。
不同的图像或者同一张图像共用一个卷积核,减少重复的卷积核。同一张图像当中可能会出现相同的特征,共享卷积核能够进一步减少权值参数。
偏置值的问题就要结合激活函数来回答了,所以在激励层再做解答。
参考链接:
- https://www.zhihu.com/question/39022858/answer/500269014
- https://blog.csdn.net/qq_32445015/article/details/79719070
滤波器跟卷积神经网络有什么关系呢。不如我们预想一个识别问题:我们要识别图像中的某种特定曲线,也就是说,这个滤波器要对这种曲线有很高的输出,对其他形状则输出很低,这也就像是神经元的激活。
例1 : 一次卷积操作过程
下面通过一个例子理解一下一次卷积操作,我们设计的滤波器和想要识别的曲线如下:
假设上面的核(滤波器)按照卷积顺序沿着下图移动:
那么当它移动到上面的位置时,按照矩阵操作,将这个区域的图像像素值与滤波器相乘,我们得到一个很大的值(6600):
而当这个滤波器移动到其他区域时,我们得到一个相对很小的值:
如此,我们对整个原图进行一次卷积,得到的结果中,在那个特定曲线和周边区域,值就很高,在其他区域,值相对低。这就是一张激活图。对应的高值区域就是我们所要检测曲线的位置。也就是说得到的值越高,就和卷积核要提取的特征越匹配。
卷积神经网络的第一个卷积层的滤波器用来检测低阶特征,比如边、角、曲线等。随着卷积层的增加,对应滤波器检测的特征就更加复杂(理性情况下,也是我们想要的情况)。比如第二个卷积层的输入实际上是第一层的输出(滤波器激活图),这一层的滤波器便是用来检测低价特征的组合等情况(半圆、四边形等),如此累积,以检测越来越复杂的特征。
例2 : 二次卷积操作过程
下面通过一个例子理解一下二次卷积操作:
对下面数据
我们可以先用下面两个卷积核进行第一次处理;
卷积输出经过关键信息提取后的结果为:(注意颜色的相互对应)可以看出其保留了特征的位置信息
然后对上面的处理结果用下面卷积核进行第二次卷积操作;
处理后的结果为(注意颜色):
而上图每一个涂颜色框都与上上层数据的一个结构相关联;下面用不同颜色标了出来;
例3: 更深层次的探究
比方说识别一个“人”出来。对你没听错,前提是我们的“人”长下面这样。
这里给出简要过程:
每一个卷积核对应的最后输出为:
接下来我们就可以根据第一层卷积提取的结构,来提取更大的结构了;如:头;前胳膊,后胳膊,左腿,右腿、还有身子;
见下图:
对于头:我们之前已经见识过了,当时利用的是下面两个卷积核对第一层输出进行的处理;
这里再举一个例子加深理解:
下图左为这个人的右腿,经过第一层的卷积,其主要由下图右两部分组成,所以是否包含腿的信息可以经由下图右两部分结构的提取获得;
可以看出其实我们主要是从第一层卷积中的这两层(下图)提取出来蕴含“前腿”的信息的;
具体过程如下:
而卷积核的样子是这样的;
它是一个三维结构,共四层,每层都是3*3的结构;而它就是一个三维卷积操作的卷积核。
输出结果为:
共有三条“腿”被检测了出来,从原始图中可以看出,只要是具有与我们要检测的“前腿”具有相同结构的地方都被我们检测了出来;见下图
类似的,分别取下面卷积核对第一层输出处理:
得到输出结果为:
顺便将它们三维化;
上图便是对“前腿”,“头”,“后腿”,“左臂”,“右臂”的检测结果。可以看出有些结构检测到不只一个;而对于头部,我们也是分为前后两部分分别检测的。
- 什么是激活函数?
- 为什么引入激活函数?
- 有哪些激活函数?
- 应用中如何选择合适的激活函数?
参考:
- https://blog.csdn.net/tyhj_sf/article/details/79932893
- https://blog.csdn.net/lwc5411117/article/details/83620184
首先要了解神经网络的基本模型。单一神经元模型如下图所示。
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
如果不用激励函数,在这种情况下你每一层节点的输入都是上层输出的线性函数,那么网络的逼近能力就相当有限。正因此,我们引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
非线性激活函数是如何做到这一点的,下面这个视频会很好解答该疑问。
视频链接:找不到视频在哪里0.0
Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
函数图像及导数为:
优点:取值范围在(0, 1),而且是单调递增,比较容易优化,求导比较容易。
缺点:容易产生梯度消失,导致训练出现问题,输出不是以0为中心的。
如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) 区间内的值,则会出现梯度爆炸情况。
区间位于[-1,1]之间,函数及导数图像为:
优点:这个函数和sigmoid相比收敛速度快
缺点:容易产生梯度消失
函数及导数图像为:
优点:这个是线性,非饱和的形式和前面两个相比它能够快速收敛,另外ReLU有效的缓解了梯度消失的问题,而且它提供了神经网络的稀疏表达能力
缺点:随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
这个问题目前没有确定的方法,凭一些经验吧。
- 池化层的作用
- 池化的类型
参考:https://blog.csdn.net/weixin_42137700/article/details/86713188
在卷积神经网络中,我们经常会碰到池化操作,池化技术的本质:在尽可能保留图片空间信息的前提下,降低图片的尺寸,增大卷积核感受野,提取高层特征,同时减少网络参数量,预防过拟合。其主要有以下几个作用:
无论是max pool还是average pool都有分信息被舍弃,那么部分信息被舍弃后会损坏识别结果吗?
因为卷积后的Feature Map中有对于识别物体不必要的冗余信息,我们下采样就是为了去掉这些冗余信息,所以并不会损坏识别结果。
卷积之后的冗余信息是怎么产生的?
卷积核就是为了找到特定维度的信息,比如说某个形状,但是图像中并不会任何地方都出现这个形状,但卷积核在卷积过程中没有出现特定形状的图片位置卷积也会产生一个值,但是这个值的意义就不是很大了,所以我们使用池化层的作用,将这个值去掉的话,自然也不会损害识别结果了。
比如下图中,假如卷积核探测"横折"这个形状。 卷积后得到3x3的Feature Map中,真正有用的就是数字为3的那个节点,其余数值对于这个任务而言都是无关的。 所以用3x3的Max pooling后,并没有对"横折"的探测产生影响。 试想在这里例子中如果不使用Max pooling,而让网络自己去学习。 网络也会去学习与Max pooling近似效果的权重。因为是近似效果,增加了更多的参数的代价,却还不如直接进行最大池化处理。
2.4.2 池化的类型
注:池化本身不具有任何参数。池化就是一个简单的过程,没什么好说的,不做过多叙述。
- 什么是全连接层及其作用?
- 全连接层具体是怎么实现的?
全连接层可以理解为一个简单的多分类神经网络,通过softmax函数得到最终的输出。两层之间所有神经元都有权重连接,用来把前边提取到的特征综合起来。通常全连接层在卷积神经网络尾部,也就是跟传统的神经网络神经元的连接方式是一样的:
全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。全连接的核心就是矩阵向量乘积 y = W*x。全连接层中的每个神经元与其前一层的所有神经元进行全连接,可以整合卷积层或者池化层中具有类别区分性的局部信息。为了提升 CNN网络性能,全连接层每个神经元的激励函数一般采用ReLU函数。最后一层全连接层的输出值被传递给一个输出,可以采用softmax逻辑回归(softmax regression)进行分类,该层也可称为 softmax层(softmax layer)。
参考:
- https://blog.csdn.net/ImDePanDa/article/details/90262629
- https://blog.csdn.net/weixin_36836622/article/details/81949258
例:原图片尺寸为9X9,在一系列的卷积、relu、池化操作后,得到尺寸被压缩为2X2的三张特征图。
先将经过卷积、激活函数、池化的深度网络后的结果串起来(Nx1的向量),如下图所示:
由于神经网络是属于监督学习,在模型训练时,根据训练样本对模型进行训练,从而得到全连接层的权重(如预测字母X的所有连接的权重,经过训练,这些权重已确定):
在利用该模型进行结果识别时,根据刚才提到的模型训练得出来的权重,以及经过前面的卷积、激活函数、池化等深度网络计算出来的结果,进行加权求和,得到各个结果的预测值,然后取值最大的作为识别的结果(如下图,最后计算出来字母X的识别值为0.92,字母O的识别值为0.51,则结果判定为X):
上述这个过程定义的操作为”全连接层“(Fully connected layers),全连接层也可以有多个,如下图:
- softmax函数
- 是如何进行分类的?
特点:输出值在(0,1)范围内,所有输出加起来为1。常用于输出层。这个函数很重要,尤其在k个分类中。
参考:https://blog.csdn.net/qq_41581769/article/details/89373373
CNN网络,网络的最后往往是全连接层和softmax层:
图中W代表的是权重矩阵,bias是偏置,X是来自全连接层的输入,Z为K为的列向量。
将wj 视为第j类下特征的权重,即每维特征的重要程度、对最终分数的影响程度,再经过Softmax映射为概率。
具体操作过程如下图:
可以看到,上图中有三个类别,softmax将原来的输入数值映射到(0,1)之间,属于Z1类概率为0.88,属于Z2类概率为0.12,属于Z3类概率约等于0,所有类别概率相加和为1。分类结果取其最大值。
例:
全连接层:
W为全连接层的参数,X是全连接层的输入,也就是特征,经上层卷积或者池化层输出。
从图中可以看出X是NX1的向量,这是怎么得到的呢?
这个输入X就是由全连接层前面多个卷积层和池化层处理后得到的,假设全连接层前面连接的是一个卷积层,卷积之后输出一百张不同的特征图。每个特征图的大小是4X4,那么在将这些特征输入给全连接层之前会将这些特征flat成NX1的向量,那么此时N就应该是1600(4X4X100 )。
再来看W,W是全连接层的参数,是个TXN的矩阵,这个N和X的N对应,T表示类别数,比如你是7分类,那么T就是7。我们所说的训练一个网络,对于全连接层而言就是寻找最合适的W矩阵。
softmax层:
全连接层就是执行W*X得到一个TX1的向量(也就是图中的logits[TX1]),这个向量里面的每个数都没有大小限制的,也就是从负无穷大到正无穷大。然后如果你是多分类问题,一般会在全连接层后面接一个softmax层,这个softmax的输入是TX1的向量,输出也是TX1的向量(也就是图中的prob[TX1],这个向量的每个值表示这个样本属于每个类的概率),只不过输出的向量的T个值的大小范围为0到1,分别表示各个类别的概率。
栗子:假设你的W*X=[1,2,3],那么经过softmax层后就会得到[0.09,0.24,0.67],这三个数字表示这个样本属于第1,2,3类的概率分别是0.09,0.24,0.67。
初始化一个网络结构,第一次训练猫的图片,进行BP算法;第二次训练狗的图片,再次进行BP算法,那么后一次的BP算法也调整了全部权值,那么这会对识别猫产生影响吗?
比如,从最简单的例子来讲,二分类(猫和狗),我第一次输入一张猫,期望输出[1,0],训练的时候按照这个去训练。训练完了以后,我第二次输入一张狗的图片,期望输出[0,1],并且按照这个训练。此时第二次的训练会对第一次训练参数产生一定的影响,就像你说的,可能会降低网络识别猫的能力。因此我第三次继续输入猫,增强一下网络识别猫的能力,伴随着可能会使得网络降低识别狗的能力。重点来了:只要我网络参数足够多,就能完美的最后打到一种终极平衡状态,使得训练猫的时候不会使网络降低对狗的认识。同样,使得训练狗的时候不会使网络降低对猫的认识。在这种状态下,网络就是用一种完美的非线性划分,把猫和狗这两类动物分开了。
前提是网络能力足够强大,能够把所要分类的东西全部按照类别完美分开。那么怎样提高网络的能力? 那就是增加网络参数,参数越多,网络的非线性分类的能力越强。那怎么增加参数呢?那当然就是加深网络了。
这样做的目的第一是为了快,一幅幅训练实在太慢了。他在做BP算法的时候,用的所有样本的误差的平均,也就是一堆样本只做一次BP算法。第二是降低训练的个性,不要为了一张图片,去训练参数,而是为了一组图片去训练,某种程度上可以防止出现过拟合问题。那么这一组图片都是一个物种吗?不一定,这些图片都是随机的。
由于本文篇幅过长,在此就不阐述反向传播了。