1. Lecture 9 卷积神经网络架构
首先回顾一下在数字识别领域有巨大成功的LeNet-5,该网络结构为 [CONV-POOL-CONV-POOL-FC-FC]。卷积层使用5x5的卷积核,步长为1;池化层使用2x2的区域,步长为2;后面是全连接层。如下图所示:
而2012年的 AlexNet 是第一个在ImageNet大赛上夺冠的大型CNN网络,它的结构和LeNet-5很相似,只是层数变多了——[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-Max POOL3-FC6-FC7-FC8],共有5个卷积层、3个池化层、2个归一化层和三个全连接层。如下图所示:
之所以分成上下两个部分,是因为当时的GPU容量太小,只能用两个来完成。还有一些细节是:
AlexNet夺得ImageNet大赛2012的冠军时,将正确率几乎提高了10%,2013年的冠军是ZFNet,和AlexNet使用相同的网络架构,只是对超参数进一步调优:
这样将错误率从16.4%降低到11.7%
14年的冠亚军GoogLeNet和VGG分别有22层和19层,下面来分别介绍。
VGG 相对于AlexNet使用更小的卷积核,层数也更深。VGG有16层和19层两种。卷积核只使用3x3,步长为1,pad为1;池化区域2x2,步长为2。
那么为什么使用3x3的小卷积核呢?
下面看一下VGG-16的参数和内存使用情况:
VGG网络的一些细节是:
下面来看一下分类的第一名,GoogLeNet。
先说明 GoogLeNet 的一些细节:
“Inception”模块 是一种设计的比较好的局域网拓扑结构,然后将这些模块堆叠在一起。
这种拓扑结构对来自前一层的输入,并行应用多种不同的滤波操作,比如1x1卷积、3x3卷积、5x5卷积和3x3池化。然后将所有滤波器的输出在深度上串联在一起。如下图所示:
但是这种结构的一个问题是计算复杂度大大增加。比如考虑下面的网络设置:
输入为28x28x256,而串联后的输出为28x28x672。(假设每个滤波操作都通过零填充保持输入尺寸)并且运算花费也非常高:
由于池化操作会保持原输入的深度,所以网络的输出一定会增加深度。解决办法是在进行卷积操作前添加一个“瓶颈层”,该层使用1x1卷积,目的是保留原输入空间尺寸的同时,减小深度,只要卷积核的数量小于原输入的深度即可。
使用这种结构,同样的网络参数设置下,的确会减少计算量:
最终得到的输出为28x28x480。此时总运算量为:
Inception mole堆叠成垂直结构,这里方便描述,将模型水平放置:
所以含参数的层总计3+18+1 = 22层。此外,橙色部分的层不计入总层数,这两块的结构都是:AveragePool 5x5+3(V) - Conv 1x1+1(S) - FC - FC - SoftmaxActivation - Output。“该相对较浅的网络在此分类任务上的强大表现表明,网络中间层产生的特征应该是非常有区别性的。 通过添加连接到这些中间层的辅助分类器,我们期望在分类器的较低阶段中鼓励区分,增加回传的梯度信号,并提供额外的正则化。 这些辅助分类器采用较小的卷积核,置于第三和第六个Inception mole的输出之上。 在训练期间,它们的损失会加到折扣权重的网络总损失中(辅助分类的损失加权为0.3)。 在预测时,这些辅助网络被丢弃。”——引自原论文
从2015年开始,网络的层数爆发式的增长,15-17年的冠军都是有152层,开始了“深度革命”!
ResNet 是一种非常深的网络,使用了残差连接。细节是:
表现这么好的ResNet仅仅是因为深吗?答案是否定的,研究表明一个56层的卷积层堆叠网络训练误差和测试误差都比一个20层的网络要大,并且不是过拟合的原因,而是更深的网络优化更难。但是一个更深的模型至少能和一个较浅的模型表现一样好,如果想把一个较浅的层变成较深的层,可以用下面的方式来构建:将原来比较浅的层拷贝到较深的层中,然后添加一些等于本身的映射层。现在较深的模型可以更好的学习。
ResNet通过使用多个有参层来学习输入与输入输出之间的 残差映射( resial mapping ) ,而非像一般CNN网络(如AlexNet/VGG等)那样使用有参层来直接学习输入输出之间的 底层映射( underlying mapping) 。
若将输入设为X,将某一有参网络层映射设为H,那么以X为输入的该层的输出将为H(X)。通常的CNN网络会直接通过训练学习出参数函数H的表达式,从而直接得到 X 到 H(X) 的映射。而 残差学习 则是致力于使用多个有参网络层来学习输入到输入、输出间的残差(H(X) - X)的映射,即学习 X -> (H(X) - X) ,然后加上X的 自身映射(identity mapping) 。也就是说网络的输出仍然是 H(X) - X + X = H(X),只是学习的只是 (H(X) - X),X部分直接是本身映射。
残差学习单元通过本身映射的引入在输入、输出之间建立了一条直接的关联通道,从而使得强大的有参层集中精力学习输入、输出之间的残差。一般我们用 来表示残差映射,那么残差学习单元的输出即为: 。当输入、输出通道数相同时,自然可以直接使用 X 进行相加。而当它们之间的通道数目不同时,我们就需要考虑建立一种有效的自身映射函数从而可以使得处理后的输入 X 与输出 Y 的通道数目相同即 。
当X与Y通道数目不同时,有两种自身映射方式。一种是简单地将X相对Y缺失的通道直接补零从而使其能够相对齐,另一种则是通过使用1x1的卷积来表示 Ws 映射从而使得最终输入与输出的通道一致。
实验表明使用一般意义上的有参层来直接学习残差比直接学习输入、输出间映射要容易得多(收敛速度更快),也有效得多(可通过使用更多的层来达到更高的分类精度)。比如在极端情况下,如果自身映射是最优的,那么将残差设为零比通过使用一堆非线性层进行自身映射更容易。
完整的网络结构如下:
对于ResNet-50+的网络,为提高计算效率,使用类似GoogLeNet的“瓶颈层”。像Inception模块那样通过使用1x1卷积来巧妙地缩减或扩张特征图维度从而使得3x3 卷积的卷积核数目不受上一层输入的影响,它的输出也不会影响到下一层。不过它纯是为了节省计算时间进而缩小整个模型训练所需的时间而设计的,对最终的模型精度并无影响。
ResNet的实际训练如下:
实际的训练效果为可以堆叠很多的层而不使准确率下降:152在ImageNet上, 1202层在CIFAR上。现在和预想中的一致,网络越深,训练准确率越高。横扫了2015年所有的奖项,第一次超过人类的识别率。
下面左图通过Top1准确率来比较各种网络的准确性;右图是不同网络的运算复杂度,横轴为计算量,圆圈大小表示内存占用。其中 Inception-v4是 Resnet + Inception。
图中可以看出:
还可以比较前向传播时间和功率消耗:
2. 34-卷积神经网络(Conv)
深度学习网络和普通神经网络的区别
全连接神经网络的缺点
卷积神经网络的错误率
卷积神经网络的发展历程
卷积神经网络的结构
结构特点:
神经网络(neural networks)的基本组成包括输入层、隐藏层、输出层。而卷积神经网络的特点在于隐藏层分为卷积层和池化层(pooling layer,又叫下采样层)。
卷积过程
纠正:卷积层的过滤器,就是一个矩阵,里面的元素是对应扫描时每个像素点的权重
即:每个过滤器会产生一张feature map
0填充的两种方式
卷积核在提取特征映射时的动作称之为padding(零填充),由于移动步长不一定能整出整张图的像素宽度。其中有两种方式,SAME和VALID
彩色图片的卷积过程
由于彩色图片有3个通道,即3张表,所以filter需要分3次去分别观察,每次观察的结果直接相加作为最后的结果
过滤器的个数
有几个过滤器,就会生成几张表。eg:
对于[28, 28, 1]的图片,如果有32个过滤器,就会卷积的结果就为[28, 28, 32],相当于图片被“拉长”了
观察结果大小的计算
面试可能考
注意:如果计算结果出现小数,需要结合情况具体考虑,而不是说直接四舍五入
卷积的api
在卷积神经网络中,主要使用Relu函数作为激活函数
即在这里使用relu函数去掉了像素中小于0的值
神经网络中为什么要使用激活函数
为什么使用relu而不再使用sigmoid函数?
api
卷积就是进行特征的提取,观察更加仔细,然而,观察仔细就意味着数据多,运算量增加,这就需要使用池化层以减少计算量
Pooling层主要的作用是特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很郑扒多,最常用的是Max Pooling。
池化层也有一个窗口大小(过滤器)
即:池化过程迟丛洞让图片变得更“窄”
即:卷积层使得图片变长,池化层使得图片变窄,所以经过卷积,图片越来越“细长”
api
池化中SAME的计算方式与卷积过程中SAME的计算方式一样。eg:
[None, 28, 28, 32]的数据,经过2x2,步长为2,padding为SAME的池化,码枯变成了[None, 14, 14, 32]
分析:前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用。
所以神经网络也相当于是一个特征选择的方式
3. 卷积神经网络的 卷积层、激活层、池化层、全连接层
数据输入的是一张图片(输入层),CONV表示卷积层,RELU表示激励层,POOL表示池化层,Fc表示全连接层
全连接神经网络需要非常多的计算资源才能支撑它来做反向传播和前向传播,所以说全连接神经网络可以存储非常多的参数,如果你给它的样本如果没有达到它的量级的时候,它可以轻轻松松把你给他的样本全部都记下来,这会出现过拟合的情况。
所以我们应该把神经元和神经元之间的连接的权重个数降下来,但是降下来我们又不能保证它有较强的学习能力,所以这是一个纠结的地方,所以有一个方法就是 局部连接+权值共享 ,局部连接+权值共享不仅权重参数降下来了,而且学习能力并没有实质的降低,除此之外还有其它的好处,下来看一下,下面的这几张图片:
一个图像的不同表示方式
这几张图片描述的都是一个东西,但是有的大有的小,有的靠左边,有的靠右边,有的位置不同,但是我们构建的网络识别这些东西的时候应该是同一结果。为了能够达到这个目的,我们可以让图片的不同位置具有相同的权重(权值共享),也就是上面所有的图片,我们只需要在训练集中放一张,我们的神经网络就可以识别出上面所有的,这也是 权值共享 的好处。
而卷积神经网络就是局部连接+权值共享的神经网络。
现在我们对卷积神经网络有一个初步认识了,下面具体来讲解一下卷积神经网络,卷积神经网络依旧是层级结构,但层的功能和形式做了改变,卷积神经网络常用来处理图片数据,比如识别一辆汽车:
在图片输出到神经网络之前,常常先进行图像处理,有 三种 常见的图像的处理方式:
均值化和归一化
去相关和白化
图片有一个性质叫做局部关联性质,一个图片的像素点影响最大的是它周边的像素点,而距离这个像素点比较远的像素点二者之间关系不大。这个性质意味着每一个神经元我们不用处理全局的图片了(和上一层全连接),我们的每一个神经元只需要和上一层局部连接,相当于每一个神经元扫描一小区域,然后许多神经元(这些神经元权值共享)合起来就相当于扫描了全局,这样就构成一个特征图,n个特征图就提取了这个图片的n维特征,每个特征图是由很多神经元来完成的。
在卷积神经网络中,我们先选择一个局部区域(filter),用这个局部区域(filter)去扫描整张图片。 局部区域所圈起来的所有节点会被连接到下一层的 一个节点上 。我们拿灰度图(只有一维)来举例:
局部区域
图片是矩阵式的,将这些以矩阵排列的节点展成了向量。就能更好的看出来卷积层和输入层之间的连接,并不是全连接的,我们将上图中的红色方框称为filter,它是2*2的,这是它的尺寸,这不是固定的,我们可以指定它的尺寸。
我们可以看出来当前filter是2*2的小窗口,这个小窗口会将图片矩阵从左上角滑到右下角,每滑一次就会一下子圈起来四个,连接到下一层的一个神经元,然后产生四个权重,这四个权重(w1、w2、w3、w4)构成的矩阵就叫做卷积核。
卷积核是算法自己学习得到的,它会和上一层计算,比如,第二层的0节点的数值就是局部区域的线性组合(w1 0+w2 1+w3 4+w4 5),即被圈中节点的数值乘以对应的权重后相加。
卷积核计算
卷积操作
我们前面说过图片不用向量表示是为了保留图片平面结构的信息。 同样的,卷积后的输出若用上图的向量排列方式则丢失了平面结构信息。 所以我们依然用矩阵的方式排列它们,就得到了下图所展示的连接,每一个蓝色结点连接四个黄色的结点。
卷积层的连接方式
图片是一个矩阵然后卷积神经网络的下一层也是一个矩阵,我们用一个卷积核从图片矩阵左上角到右下角滑动,每滑动一次,当然被圈起来的神经元们就会连接下一层的一个神经元,形成参数矩阵这个就是卷积核,每次滑动虽然圈起来的神经元不同,连接下一层的神经元也不同,但是产生的参数矩阵确是一样的,这就是 权值共享 。
卷积核会和扫描的图片的那个局部矩阵作用产生一个值,比如第一次的时候,(w1 0+w2 1+w3 4+w4 5),所以,filter从左上到右下的这个过程中会得到一个矩阵(这就是下一层也是一个矩阵的原因),具体过程如下所示:
卷积计算过程
上图中左边是图矩阵,我们使用的filter的大小是3 3的,第一次滑动的时候,卷积核和图片矩阵作用(1 1+1 0+1 1+0 0+1 1+1 0+0 1+0 0+1 1)=4,会产生一个值,这个值就是右边矩阵的第一个值,filter滑动9次之后,会产生9个值,也就是说下一层有9个神经元,这9个神经元产生的值就构成了一个矩阵,这矩阵叫做特征图,表示image的某一维度的特征,当然具体哪一维度可能并不知道,可能是这个图像的颜色,也有可能是这个图像的轮廓等等。
单通道图片总结 :以上就是单通道的图片的卷积处理,图片是一个矩阵,我们用指定大小的卷积核从左上角到右下角来滑动,每次滑动所圈起来的结点会和下一层的一个结点相连,连接之后就会形成局部连接,每一条连接都会产生权重,这些权重就是卷积核,所以每次滑动都会产生一个卷积核,因为权值共享,所以这些卷积核都是一样的。卷积核会不断和当时卷积核所圈起来的局部矩阵作用,每次产生的值就是下一层结点的值了,这样多次产生的值组合起来就是一个特征图,表示某一维度的特征。也就是从左上滑动到右下这一过程中会形成一个特征图矩阵(共享一个卷积核),再从左上滑动到右下又会形成另一个特征图矩阵(共享另一个卷积核),这些特征图都是表示特征的某一维度。
三个通道的图片如何进行卷积操作?
至此我们应该已经知道了单通道的灰度图是如何处理的,实际上我们的图片都是RGB的图像,有三个通道,那么此时图像是如何卷积的呢?
彩色图像
filter窗口滑的时候,我们只是从width和height的角度来滑动的,并没有考虑depth,所以每滑动一次实际上是产生一个卷积核,共享这一个卷积核,而现在depth=3了,所以每滑动一次实际上产生了具有三个通道的卷积核(它们分别作用于输入图片的蓝色、绿色、红色通道),卷积核的一个通道核蓝色的矩阵作用产生一个值,另一个和绿色的矩阵作用产生一个值,最后一个和红色的矩阵作用产生一个值,然后这些值加起来就是下一层结点的值,结果也是一个矩阵,也就是一张特征图。
三通道的计算过程
要想有多张特征图的话,我们可以再用新的卷积核来进行左上到右下的滑动,这样就会形成 新的特征图 。
三通道图片的卷积过程
也就是说增加一个卷积核,就会产生一个特征图,总的来说就是输入图片有多少通道,我们的卷积核就需要对应多少通道,而本层中卷积核有多少个,就会产生多少个特征图。这样卷积后输出可以作为新的输入送入另一个卷积层中处理,有几个特征图那么depth就是几,那么下一层的每一个特征图就得用相应的通道的卷积核来对应处理,这个逻辑要清楚,我们需要先了解一下 基本的概念:
卷积计算的公式
4x4的图片在边缘Zero padding一圈后,再用3x3的filter卷积后,得到的Feature Map尺寸依然是4x4不变。
填充
当然也可以使用5x5的filte和2的zero padding可以保持图片的原始尺寸,3x3的filter考虑到了像素与其距离为1以内的所有其他像素的关系,而5x5则是考虑像素与其距离为2以内的所有其他像素的关系。
规律: Feature Map的尺寸等于
(input_size + 2 * padding_size − filter_size)/stride+1
我们可以把卷积层的作用 总结一点: 卷积层其实就是在提取特征,卷积层中最重要的是卷积核(训练出来的),不同的卷积核可以探测特定的形状、颜色、对比度等,然后特征图保持了抓取后的空间结构,所以不同卷积核对应的特征图表示某一维度的特征,具体什么特征可能我们并不知道。特征图作为输入再被卷积的话,可以则可以由此探测到"更大"的形状概念,也就是说随着卷积神经网络层数的增加,特征提取的越来越具体化。
激励层的作用可以理解为把卷积层的结果做 非线性映射 。
激励层
上图中的f表示激励函数,常用的激励函数几下几种:
常用的激励函数
我们先来看一下激励函数Sigmoid导数最小为0,最大为1/4,
激励函数Sigmoid
Tanh激活函数:和sigmoid相似,它会关于x轴上下对应,不至于朝某一方面偏向
Tanh激活函数
ReLU激活函数(修正线性单元):收敛快,求梯度快,但较脆弱,左边的梯度为0
ReLU激活函数
Leaky ReLU激活函数:不会饱和或者挂掉,计算也很快,但是计算量比较大
Leaky ReLU激活函数
一些激励函数的使用技巧 :一般不要用sigmoid,首先试RELU,因为快,但要小心点,如果RELU失效,请用Leaky ReLU,某些情况下tanh倒是有不错的结果。
这就是卷积神经网络的激励层,它就是将卷积层的线性计算的结果进行了非线性映射。可以从下面的图中理解。它展示的是将非线性操作应用到一个特征图中。这里的输出特征图也可以看作是"修正"过的特征图。如下所示:
非线性操作
池化层:降低了各个特征图的维度,但可以保持大分重要的信息。池化层夹在连续的卷积层中间,压缩数据和参数的量,减小过拟合,池化层并没有参数,它只不过是把上层给它的结果做了一个下采样(数据压缩)。下采样有 两种 常用的方式:
Max pooling :选取最大的,我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图中取出最大的元素,最大池化被证明效果更好一些。
Average pooling :平均的,我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图算出平均值
Max pooling
我们要注意一点的是:pooling在不同的depth上是分开执行的,也就是depth=5的话,pooling进行5次,产生5个池化后的矩阵,池化不需要参数控制。池化操作是分开应用到各个特征图的,我们可以从五个输入图中得到五个输出图。
池化操作
无论是max pool还是average pool都有分信息被舍弃,那么部分信息被舍弃后会损坏识别结果吗?
因为卷积后的Feature Map中有对于识别物体不必要的冗余信息,我们下采样就是为了去掉这些冗余信息,所以并不会损坏识别结果。
我们来看一下卷积之后的冗余信息是怎么产生的?
我们知道卷积核就是为了找到特定维度的信息,比如说某个形状,但是图像中并不会任何地方都出现这个形状,但卷积核在卷积过程中没有出现特定形状的图片位置卷积也会产生一个值,但是这个值的意义就不是很大了,所以我们使用池化层的作用,将这个值去掉的话,自然也不会损害识别结果了。
比如下图中,假如卷积核探测"横折"这个形状。 卷积后得到3x3的Feature Map中,真正有用的就是数字为3的那个节点,其余数值对于这个任务而言都是无关的。 所以用3x3的Max pooling后,并没有对"横折"的探测产生影响。 试想在这里例子中如果不使用Max pooling,而让网络自己去学习。 网络也会去学习与Max pooling近似效果的权重。因为是近似效果,增加了更多的参数的代价,却还不如直接进行最大池化处理。
最大池化处理
在全连接层中所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。当前面卷积层抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。 通常卷积网络的最后会将末端得到的长方体平摊成一个长长的向量,并送入全连接层配合输出层进行分类。比如,在下面图中我们进行的图像分类为四分类问题,所以卷积神经网络的输出层就会有四个神经元。
四分类问题
我们从卷积神经网络的输入层、卷积层、激活层、池化层以及全连接层来讲解卷积神经网络,我们可以认为全连接层之间的在做特征提取,而全连接层在做分类,这就是卷积神经网络的核心。
4. 卷积神经网络的输出能够是一个具体的值吗
可以的。
因为卷积神经网络最后的输出是全连接层,所以它的输出可以是一个值也可以是一组向量。
卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元。