关键词:卷积、池化、全连接层、zero-padding
相关文章链接: http://blog.csdn.net/KangRoger/article/details/55681297
CNN整体架构
常用层示例
以一个分类CIFAR-10图像的卷积网络为例,网络结构[INPUT-CONV-RELU-POOL-FC],具体如下:
INPUT Layer:[32x32x3],数据为原始像素值,宽 * 高 --> 32 * 32 ,三通道RGB,深度为3。
CONV layer:卷积层计算对象连接到输入层神经元的输出,每次计算都是权重和局部输入的点乘。如果使用12个滤波器(核),输出为[32x32x12],深度为12.
RELU layer:ReLU是逐元素操作(elementwise),使用函数max(0,x)max(0,x),经过ReLU后,输出大小不会变,还是[32x32x3]。
POOL layer:池化层是下采样操作(宽weight和高height),使用max pool (2*2 卷积核,stripe = 2), 样输出会变小为[16x16x12],depth不变。
FC layer:将之前最后一层的输出全部展开为一列数据,全连接层将会计算每类别对应的得分,输出大小为[1x1x10],代表10类每个类别的得分。全连接顾名思义,这一层的每个神经元和上一层的每个神经元之间都有连接。
注:深度Depth - 输出的深度对应卷积核的个数,不同的卷积核查找输入中不同的物体。例如,输入是原始图像,那么深度方向上不同神经元可能被颜色、边缘、特定形状(不同卷积核)所激活。
卷积层
卷积操作是输入的局部区域和卷积核的点乘。卷积层是卷积网络的核心,大部分的计算量都在这个层。
每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些不同局部的神经元综合起来就可以得到全局信息。
卷积层参数包含要学习参数的一个集合。每个滤波器的长度和宽度比较小(3*3,5*5),但是深度和输入数据保持一致。在前向传播过程中,把卷积核沿着输入数据在宽和高上滑动,把对应的数据和卷积核做内积运算;随着卷积核的滑动,可以得到一个2维的激活图(activation map),激活图的值是卷积核在不同空间位置的响应。直观上看,网络会让卷积核学到“对某些特定物体或颜色产生激活”。
假设我们有一个卷积核的集合,每个卷积核都会生成一个2维激活图,多个卷积核就会生成多个激活图,就可以在深度方向上得到输出。
如果在一个深度切片上使用相同的权重(滤波器中的数值),那么前向传播就是输入数据和权重的卷积运算(卷积层名字的由来),这也是为什么称权重为滤波器或卷积核。
参数共享:一个卷积核学习一种特征,如,检测某一位置水平方向边界很重要,那么也应该适用于其他地方,因为具有平移不变性。因此没有必要再学习一个检测水平边界的卷积核了。但有时参数共享假设并没有意义。例如输入图像有明确的中心结构,这时我们希望在不同位置学习到不同特征。一个典型的例子就是人脸检测,人脸就位于图像中心位置,其他位置可能学到眼睛或头发特征;这种情况,就需要放松参数共享的限制,称这样的层叫做局部连接层Locallly-Connected Layer。
池化层
在卷积神经网络中,常常在连续卷积层中间隔插入池化层。池化操作可以减小数据量,从而减小参数,降低计算,因此防止过拟合。
池化操作在每个深度切片上进行,例如使用MAX Pooling。常用的池化核:2x2大小,在每个深度切片的width和height方向下进行下采样,在覆盖的2*2的面积内(4个像素)取最大数值,忽略掉75%(3/4)的激活信息。池化操作,保持深度depth大小不变。
池化层没有参数,F和S一般是固定取值。而且,在池化层一般不会使用零填充。
全连接层
如果一层的神经元和前一层的每个神经元都有连接,这样的层叫做全连接层。这样的层可以使用矩阵相乘再加上bias即可。
Zero-Padding 零填充
1. 为什么要用zero-padding?
如果在CONV不使用padding,经过CONV后,数据空间维度尺寸会略微减小,这样图像的边缘信息将会很快丢失掉
2. Zero-Padding是如何运作的?
如下如,P = 1时,相当于将7*7的输入转化为了9 * 9,滤波器 F = 3,S=1,输出的size = 7*7。也就是在CONV使用zero-padding,可以保持输入输出空间维度尺寸不变,也可以提升性能。
局部连接
每个神经元只跟前一层输入的一个局部区域相连接,这个局部区域大型是一个超参数,叫做感受视野receptive field,其大小就是卷积核大小,其深度和输入数据深度一致。
左图是32x32x3(CIFAR-10)的一个输入,卷积核只是连接到输入的局部部分,但是扩展到输入的整个深度。右边是一个神经元,它计算输入数据和权重的内积,再加上一个bias,随后经过一个非线性函数。
CNN定义
输入数据size:W1×H1×D1
需要使用的超参数:
1、卷积核个数K
2、卷积核大小F:如F = 3,表示3*3 的卷积核(滤波器)
3、步长S:卷积核滑动的距离,如S=1,表示每次滑动一个像素
4、零填充大小 P
输出大小size:W2×H2×D2,其中
W2 = ( W1 − F +2*P ) /S +1
H2 = ( H1 − F + 2*P) /S+1
D2 = K
使用超参数共享,每个滤波器权重个数 = F⋅F⋅D1,共有权重= (F⋅F⋅D1)⋅K个,bias有K个。
输出中,在深度的第d个切片上(size为W2 × H2),其结果是第d个卷积核与输入卷积的结果,卷积步长为S。
超参数的设置,习惯为F=3,S=1,P=1
层模式
INPUT->[[CONV->RELU]*N]->POOL?]*M->[FC->RELU]*K->FC
其中*表示重复,POOL?表示可选;一般N >= 0(通常N <= 3), M >= 0, K >= 0(通常K < 3)。例如一些常见的卷积网络架构模式如下:
* INPUT->FC,实现的是一个线性分类器,这里N=M=K=0。
* INPUT->[CONV->RELU->POOL]*2->FC->RELU->FC,在每个CONV后面有一个POOL。
* INPUT->[CONV->RELU->CONV->RELU->POOL]*3->[FC->RELU]*2->FC,这里每2个CONV后面有一个POOL,这样的结构在大的深度网络常常见到,在POOL层破坏特征前,连续多个CONV层可以提取更复杂的特征。
宁愿使用连续多个小的滤波器,不使用一个大的滤波器。
例如连续3个CONV,每层滤波器核大小都是3x3。第一层CONV对于INPUT感受视野是3x3,第二层CONV对于INPUT感受视野是5x5,第三层对于INPUT的感受视野是7x7;如果换用一层CONV,核大小为7x7,将会有以下缺点:
1、一层对于输入来说是线性计算,三层具有很好的非线性,具有更强的表达能力。
2、假设channel数为C,对于一层7x7卷积层,共有权重C×(7×7×C)=49C^2,而三层3x3卷积,共有参数3×(C×(3×3×C))=27C^2。可以看出,连续的小卷积核,具有更少的参数和更强的表达能力;但是连续小的卷积核在训练时占用更多内存,因为在反向传播时需要用到中间结果。