CNN,即卷积神经网络,主要用于图像识别,分类。这篇卷积神经网络是前面介绍的多层神经网络的进一步深入,它将深度学习的思想引入到了神经网络当中,通过卷积运算来由浅入深的提取图像的不同层次的特征,而利用神经网络的训练过程让整个网络自动调节卷积核的参数,从而无监督的产生了最适合的分类特征。
卷积神经网络主要由这几类层构成:输入层、卷积层,ReLU层、池化(Pooling)层和全连接层(全连接层和常规神经网络中的一样)。通过将这些层叠加起来,就可以构建一个完整的卷积神经网络。 在实际应用中往往将卷积层与ReLU层共同称之为卷积层,所以卷积层经过卷积操作也是要经过激活函数的。具体说来,卷积层和全连接层(CONV/FC)对输入执行变换操作的时候,不仅会用到激活函数,还会用到很多参数,即神经元的权值w和偏差b;而ReLU层和池化层则是进行一个固定不变的函数操作。卷积层和全连接层中的参数会随着梯度下降被训练,这样卷积神经网络计算出的分类评分就能和训练集中的每个图像的标签吻合了。
卷积层是构建卷积神经网络的核心层,它产生了网络中大部分的计算量。注意是计算量而不是参数量。 先简单给大家介绍一下什么叫做卷积,那么白话解释一下啥叫卷积,很形象,就是“卷”,你假象一下,你把毛巾卷起来,成为一个圆柱体的卷,就是这个意思,抽象的说,就是将原来的对象变小一些,但又能保证原来图像中的信息尽量多的保留下来,可以看看下面这个卷积过程图。看看这个图,大概理解卷积是一个什么样子的过程就可以了,用映射两个字我认为是比较恰当的。
二维卷积:即滤波器的每个格子与滤波器选中数据的格子相乘。
三维卷积:三维数据的话,滤波器的也是三维。同时对每个维度进行卷积,最后将每个维度的卷积结果相加,输出二维。
过滤器的作用是:寻找图片的特征。 这就涉及到CNN要做的工作了。每一个过滤器中的数值,都是算法自己学习来的,不需要我们费心去设置。
需要我们做的有:
① 设置过滤器的大小(用字母“F”表示)
一般情况下,我们的过滤器大小是3×3,即F=3。
当然,你还可以设置成5×5,都是可以的。
只不过,需要注意的是:过滤器的尺寸越大,得到的图像细节就越少,最终得到的特征图的尺寸也更小。
② 设置过滤器滑动的步幅数(用字母“S”表示)
一般情况下,过滤器滑动的步幅是1,即每次过滤器向右或向下滑动1个像素单位。
当然,你也可以将步幅设置为2或更多,但是通常情况下,我们会使用S=1或S=2。
③ 设置过滤器的个数(用字母“K”表示)
以下,我们分别给大家展示了4种过滤器。所以你可以理解为K=4,如下图:
当然,你可以设置任意个数。
再次强调:不要在意过滤器里面的数值,那是算法自己学习来的,不需要我们操心,我们只要把过滤器的个数设置好,就可以了。
所以,一张图片,在经过4种过滤器的提取后,会得到4种不同的特征图片:
从上面的例子我们能够看到,“卷积”输出的结果,是包含“宽、高、深”3个维度的:
实际上,在CNN中,所有图片都是包含有“宽、高、深”。
像输入的图片——萌狗,它也是包含3个维度,只不过,它的深度是1,所以在我们的图片中没有明显地体现出来:
所以,我们要记住,经过“卷积”层的处理后,图片含有深度,这个“深度”,等于过滤器的个数。
例如,上面我们采用了4种过滤器,那么,输出的结果,深度就为4。
④ 设置是否补零(用字母“P”表示)
何为“补零”?
当我们采用了3×3大小的过滤器,直接在原始图片滑过。
从结果中可以看到,最终得到的“特征图片”比“原始图片”小了一圈:
为什么会出现这种情况?
原因很简单:过滤器将原始图片中,每3*3=9个像素点,提取为1个像素点
所以,当过滤器遍历整个图片后,得到的特征图片会比原始图片更小。
当然,你也可以得到一个和原始图片大小一样的特征图,这就需要采用“在原始图片外围补零”的方法:
下面,我们来看看“补零”后的效果:
如何确定“补零”的圈数,才能保证图片大小一致? 假设你的过滤器大小为F,滑动步幅S=1,想要实现这一目标,补零的个数应为:
举个例子:
在上图中,因为我们使用的是3*3大小的过滤器,而且每次滑动时,都是向右或向下移动1格。
所以,为了使特征图片与原始图片保持一致,需要补零P=(3-1)/2=1,即在原始图片外围,补1圈零。
如果你使用的过滤器大小为5*5,那么补零P=(5-1)/2=2,即在原始图片外围,补2圈零。
当然,是否需要“补零”,由你自己来决定,“补零”并不是硬性规定。
定义如下:
O=输出图像的尺寸。
I=输入图像的尺寸。
K=卷积层的核尺寸
N=核数量
S=移动步长
P =填充数
输出图像尺寸的计算公式如下:
输出图像的通道数等于核数量N。
示例:AlexNet中输入图像的尺寸为2272273.第一个卷积层有96个尺寸为11113的核。步长为4,填充为0.
输出的图像为555596(每个核对应1个通道)
如上图所示,一个filter或者神经元的内部计算过程,我们可以看到通过卷积并加上bias后(其实在感知机那个时代到这一步就可以了,模型就具备了线性分类的能力,但是大千世界我们的分类问题很少是线性函数可以拟合的,所以我们就需要拟合非线性函数),filter还做了一次函数映射运算,这里的函数 f 就是我们的非线性激活函数,它的作用是:使模型不再是线性组合,具有可以逼近任意函数的能力。下图就是我们经常使用激活函数 ReLU,还有sigmoid函数或者tanh函数这些,读者可以自行搜索。
如果是负数,出来的结果就是0
如果是正数或零,出来的结果仍是自己本身
举个例子:
假设经过“过滤器”提取后,得到的“特征图片”其像素值如左下图,那么,经过ReLU处理后,得到的“新的”特征图片会呈现右下图形态:
回到我们之前的例子中,在“卷积”的后面,再加上一步“ReLU计算”,即为:
有时图像太大,即使我们参数不太多,但图像的像素实在太多,导致卷积操作后,我们得到的结果仍然过大。我们需要减少训练参数的数量,它被要求在随后的卷积层之间周期性地引进池化层。池化的一个目的是减少图像的空间大小。池化在每一个纵深维度上独自完成,因此图像的纵深保持不变。
所谓“池化”,就是在保留图片主要信息的前提下,将图片的尺寸缩小。
池化的类型有很多种,诸如“最大池化”、“平均池化”、“求和池化”等等,它们的运算原理基本一致。
因为“最大池化”更为常用,所以我们重点介绍“最大池化”的运算过程。
假设经过ReLU处理后,我们得到的特征图片,如下图:
在对特征图片进行“池化”处理时,与“卷积”类似,需要我们设置2个超参数:
过滤器大小(F)和 滑动的步幅数(S) 这里,假设我们设置F=2,S=2,那么,“最大池化”为:
在每2*2(即4个)像素区域内,保留像素值最大的那一个,其余3个像素值抛弃。 如下图:
这样,经过“池化”处理,就将一个44大小的图片,缩小为22大小的图片了。
当然,在“池化”过程中,你也可以将超参数设置为F=3、S=2,只不过“F=2、S=2”更为常用。
回到我们之前的例子中,在“ReLU计算”的后面,再加上一步“最大池化”,即为:
定义如下:
O=输出图像的尺寸。 I=输入图像的尺寸。 S=移动步长 PS=池化层尺寸
输出图像尺寸的计算公式如下:
不同于卷积层,池化层的输出通道数不改变。
示例:每1层卷积层后的池化层的池化层尺寸为33,步长为2。根据前面卷积层的输出为555596。池化层的输出图像尺寸如下:
输出尺寸为2727*96。
有的时候,我们会进行多次卷积和池化,所以,更一般的形式:
举个例子:
★ 你可以构建2层“卷积 + ReLU”,如下:
输入图片 → 卷积 → ReLU → 卷积 → ReLU → 池化
★ 也可以构建2层“卷积 + ReLU + 池化”:
输入图片 → 卷积 → ReLU → 池化 → 卷积 → ReLU → 池化
当然,你还可以构建更多网络层,这里就不一一列举了。
经过上面一系列的处理,此时得到的图片,已经可以被视为一串串简单的数字(即像素值)。
将这一个个的像素值,塞到我们早已接触过的表达式中:
x是谁?
在计算机“眼中”的世界,图像是这样的:
那一个格子、一个格子中的数字,就是x。
y是谁?
我们给每张图片打上的标签:这张图是“猫”、那张图是“狗”…… 统统这些标签,就是y。
θ又是什么?
当你给计算机很多组、很多组(x,y)时,它会自己去学习寻找x与y之间的关系,这个“关系”,就是θ。
当你拥有了θ,下一次,即使拿到一张没有打过标签的图片,你也可以通过已知的θ和x,知道y的取值,从而“知道图片里画的是什么?”。
具体过程:
首先,需要把卷积后得到的图片,其中的像素值“展开”。
为了方便大家理解,假设我们卷积后,得到了2张2*2的图片,如果把它们的像素值“展开”,得到的效果为:
这样,我们就拿到了x。展开后所得到的
就是x。
在训练的最初,我们拥有每张图片的标签,即“我们已经拥有了y值”。
所以,在模型的最后,我们需要让计算机努力找到x-y之间的关系。
而寻找的办法,就需要依靠“全连接神经网络”:
所谓“全连接”,是指下一层的每一个神经元(即图中的“□”),与上一层的神经元全部相连,这里为了表达得更清晰,已经省去了中间的连接符。实际上,更多的时候,你会看到下面这样的图片:
过,本文的重点不在于讲解“全连接神经网络”,本文的核心在于卷积神经网络(CNN)。
这里,你只需要记住2点:
① “全连接神经网络”可以帮助我们学习到参数θ。有了它,下一次再给计算机“看”图片时,计算机便会自动识别出图中的景象。
② 模型得到的最终结果,表示“图片为某种类别的概率”。注意:这里的概率之和,永远为1。
例如:
即计算机“判断”,最初输入的图片为“狗”。
我们将CNN的所有流程,整合起来,即:
其实卷积神经网络(CNN)与人工神经网络(ANN)的大概思路是一样的,包括两个阶段:
第一阶段,向前传播阶段:
a)从样本集中取一个样本(X,Yp),将X输入网络;
b)计算相应的实际输出Op。
在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
第二阶段,向后传播阶段
a)算实际输出Op与相应的理想输出Yp的差;
b)按极小化误差的方法反向传播调整权矩阵。