A. 卷积神经网络(CNN)基础
在七月初七情人节,牛郎织女相见的一天,我终于学习了CNN(来自CS231n),感觉感触良多,所以赶快记下来,别忘了,最后祝大家情人节快乐5555555.正题开始!
CNN一共有卷积层(CONV)、ReLU层(ReLU)、池化层(Pooling)、全连接层(FC(Full Connection))下面是各个层的详细解释。
卷积,尤其是图像的卷积,需要一个滤波器,用滤波器对整个图像进行遍历,我们假设有一个32*32*3的原始图像A,滤波器的尺寸为5*5*3,用w表示,滤波器中的数据就是CNN的参数的一部分,那么在使用滤波器w对A进行滤波的话,可以用下面的式子表示:
其中x为原始图像的5*5*3的一部分,b是偏置项置为1。在对A进行滤波之后,产生的是一个28*28*1的数据。那么假设我们存在6个滤波器,这六个滤波器之间彼此是独立的,也就是他们内部的数据是不同的且没有相关性的。可以理解为一个滤波器查找整幅图像的垂直边缘,一个查找水平边缘,一个查找红色,一个查找黑色这样。那么我就可以产生6个28*28*1的数据,将它们组合到一起就可以产生28*28*6的数据,这就是卷积层主要做的工作。
CNN可以看作一系列的卷积层和ReLU层对原始数据结构进行处理的神经网络,处理的过程可以用下面这幅图表示
特别要注意的是滤波器的深度一定要与上一层传来的数据的深度相同,就像上图的第二个卷积层在处理传来的28*28*6的数据时要使用5*5*6的滤波器.
滤波器在图像上不断移动对图像滤波,自然存在步长的问题,在上面我们举的例子都是步长为1的情况,如果步长为3的话,32*32*3的图像经过5*5*3的滤波器卷积得到的大小是(32-5)/3+1=10, 注:步长不能为2因为(32-5)/2+1=14.5是小数。
所以当图像大小是N,滤波器尺寸为F时,步长S,那么卷积后大小为(N-F)/S+1
我们从上面的图中可以看到图像的长和宽在逐渐的减小,在经过超过5层之后极可能只剩下1*1的空间尺度,这样是十分不好的,而且也不利于我们接下来的计算,所以我们想让卷积层处理完之后图像在空间尺度上大小不变,所以我们引入了pad the border的操作。pad其实就是在图像周围补0,扩大图像的尺寸,使得卷积后图像大小不变。在CNN中,主要存在4个超参数,滤波器个数K,滤波器大小F,pad大小P和步长S,其中P是整数,当P=1时,对原始数据的操作如图所示:
那么在pad操作后卷积后的图像大小为:(N-F+2*P)/S+1
而要想让卷积层处理后图像空间尺度不变,P的值可以设为P=(F-1)/2
卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有4个超参数:
K:滤波器个数
P:pad属性值
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
1*1的滤波器也是有意义的,它在深度方向做卷积,例如1*1*64的滤波器对56*56*64的数据卷积得到56*56的数据
F通常是奇数,这样可以综合考虑上下左右四个方向的数据。
卷积层从神经元的角度看待可以有两个性质: 参数共享和局域连接 。对待一个滤波器,例如5*5*3的一个滤波器,对32*32*3的数据卷积得到28*28的数据,可以看作存在28*28个神经元,每个对原图像5*5*3的区域进行计算,这28*28个神经元由于使用同一个滤波器,所以参数相同,我们称这一特性为 参数共享 。
针对不同的滤波器,我们可以看到他们会看到同一区域的图像,相当于在深度方向存在多个神经元,他们看着相同区域叫做 局域连接
参数共享减少了参数的数量,防止了过拟合
局域连接为查找不同特征更丰富的表现图像提供了可能。
卷积就像是对原图像的另一种表达。
激活函数,对于每一个维度经过ReLU函数输出即可。不改变数据的空间尺度。
通过pad操作,输出图像在控件上并没有变化,但是深度发生了变化,越来越庞大的数据给计算带来了困难,也出现了冗余的特征,所以需要进行池化操作,池化不改变深度,只改变长宽,主要有最大值和均值两种方法,一般的池化滤波器大小F为2步长为2,对于最大值池化可以用下面的图像清晰的表示:
卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有2个超参数:
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
将最后一层(CONV、ReLU或Pool)处理后的数据输入全连接层,对于W 2 *H 2 *D 2 数据,我们将其展成1*1*W 2 *H 2 *D 2 大小的数据,输入层共有W 2 *H 2 *D 2 个神经元,最后根据问题确定输出层的规模,输出层可以用softmax表示。也就是说,全连接层就是一个常见的BP神经网络。而这个网络也是参数最多的部分,是接下来想要去掉的部分。完整的神经网络可以用下面的图表示:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
1.更小的滤波器与更深的网络
2.只有CONV层而去掉池化与全链接
最早的CNN,用于识别邮编,结构为:
CONV-POOL-CONV-POOL-CONV-FC
滤波器大小5*5,步长为1,池化层2*2,步长为2
2012年由于GPU技术所限,原始AlexNet为两个GPU分开计算,这里介绍合起来的结构。
输入图像为227*227*3
1.首次使用ReLU
2.使用Norm layers,现在已经抛弃,因为效果不大
3.数据经过预处理(例如大小变化,颜色变化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 参数0.9(SGD和Momentum见我的其他文章)
7.学习速率 0.01,准确率不在提升时减少10倍,1-2次后达到收敛
8.L2权重减少0.0005
9.错误率15.4%
改进自AlexNet,主要改变:
1.CONV1的滤波器从11*11步长S=4改为7*7步长为2.
2.CONV3,4,5滤波器数量有384,384,256改为512,1024,512(滤波器数量为2的n次幂有利于计算机计算可以提高效率)
错误率:14.8%后继续改进至11.2%
当前最好的最易用的CNN网络,所有卷积层滤波器的大小均为3*3,步长为1,pad=1,池化层为2*2的最大值池化,S=2。
主要参数来自全连接层,这也是想要去掉FC的原因。
具有高度的统一性和线性的组合,易于理解,十分方便有VGG-16,VGG-19等多种结构。
错误率7.3%
完全移除FC层,参数只有500万,使用Inception模块(不太理解,有时间继续看)
准确率6.67%
准确率3.6%
拥有极深的网络结构,且越深准确率越高。是传统CNN不具备的特点,传统CNN并非越深越准确。需要训练时间较长但是快于VGG
1.每个卷积层使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准确率不变减小10倍(因为Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不适用失活(因为Batch Normalization)
具体的梯度过程学完ResNet再说吧。
B. 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]
分析:前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用。
所以神经网络也相当于是一个特征选择的方式
C. 卷积神经网络的 卷积层、激活层、池化层、全连接层
数据输入的是一张图片(输入层),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近似效果的权重。因为是近似效果,增加了更多的参数的代价,却还不如直接进行最大池化处理。
最大池化处理
在全连接层中所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。当前面卷积层抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。 通常卷积网络的最后会将末端得到的长方体平摊成一个长长的向量,并送入全连接层配合输出层进行分类。比如,在下面图中我们进行的图像分类为四分类问题,所以卷积神经网络的输出层就会有四个神经元。
四分类问题
我们从卷积神经网络的输入层、卷积层、激活层、池化层以及全连接层来讲解卷积神经网络,我们可以认为全连接层之间的在做特征提取,而全连接层在做分类,这就是卷积神经网络的核心。
D. 卷积神经网络
一般由卷积层,汇聚层,和全连接层交叉堆叠而成,使用反向传播算法进行训练(反向传播,再重新看一下)
卷积神经网络有三个结构上的特性:局部连接,权重共享以及子采样
滤波器filter 卷积核convolution kernel
局部连接,其实就是根据时间,权重递减 最后为0 参数就传播不到远处了
局部连接 乘以 滤波器 得特征映射
互相关,是一个衡量两个序列相关性的函数,
互相关和卷积的区别在于 卷积核仅仅是否进行翻转,因此互相关也可以称为 不翻转卷积
使用卷积 是为了进行特征抽取,卷积核 是否进行翻转和其特征抽取的能力无关。
当卷积核是可以学习的参数,卷积和互相关是等价的,因此,其实两者差不多。
Tips:P是代表特征映射