卷积神经网络(Convolutional Neural Network,CNN) 介绍

cnn-basic

[图-1:LeNet-5]

 

卷积神经网络(Convolutional Neural Network,CNN)相较于常规神经网络主要有三个特点:

receptive fields:常规神经网络各层之间的神经元是全连接的,而CNN中CONV和POOL层中单个神经元只与前面一层的receptive fields内的神经元相连。

shared weights:CONV层各feature map中的权值w和偏置b是共享的,这样极大的减少了参数的数量。单个featture map上共享的权值和偏置被称作一个kernel或filter。如果使用a1表示一个feature map的output activations,a0表示它的input activations,那么就有a1 = σ(w*a0 + b)  [式01] ,其中的 “*“ 就是一个卷积(convolution)操作,这就是“卷积”这个名称的由来。

sub-sampling:在pool层实现亚采样(sub-sampling),如图-1中S2,S4即为pool层,将CONV层的信息简化处理,一般采用max pooling。

屏幕快照 2016-08-15 下午2.54.18

 

模型-样例

图像识别CNN Architeture: [INPUT – CONV – RELU – POOL – FC]

INPUT [32 * 32] 表示输入的单张图像是32 * 32px。即每一张图都能表示成一个32*32=1024 维的向量。

CONV 层对input通过卷机操作将得到多个feature map的CONV层比如图-1中的c1[6@28*28],6个feature map,每个map尺寸是28 * 28。

RELU 层,你也可以不把它当作一个层,因为它只是对上层所有的单个神经元activation用一个activation function进行ReLU(Rectified Linear Units)处理,即max(0,x)。那么它的尺寸和map数都不会变,只是神经元的activation可能变了。

POOL 层,比较常见的处理是对上层的2*2的respective field进行 max(input1, input2, input3, input4) 处理,本层的一个神经元对应上层的4个神经元,且本层的神经元所对应的上层神经元没有重叠(overlap)。如图-1中s2就得到[6@14 * 14]

FC层,即常规神经网络中的全联接层。

屏幕快照 2016-08-15 下午3.17.05

[图-3:VGGNet]

直观理解

强烈推荐一个网站:http://scs.ryerson.ca/~aharley/vis/conv/

在其左上角手写一个数字,即可看到这个手写字是如何被右边的3d模拟的CNN识别出来的,这个模型是很典型的CNN,非常直观细致。对于理解CNN架构很有帮助。

 

Hyperparameter:

屏幕快照 2016-08-15 下午2.53.30 屏幕快照 2016-08-15 下午2.54.01[图-4]

假设输入层是[32 * 32],respective field是[5 * 5],如上图左边的respective field在input层上向右移动(slide)了一个单位,我们称这个slide值为S, 那么上图的S=1。

如图-4,如果按照S=1移动respective field,那么CONV层自然变成了28 * 28,如果我们想要CONV层的尺寸是32 * 32和前面一层一样的话,我们就需要一个zero-padding, 即用0值来填充inpu层,将input变为34 * 34,外围四边都用0值填充,使用P来表示zero-padding的数量,那么这里P=2。(上面推荐的网站你会发现input是有填充的)

另外使用F表示respective field的尺寸。W表示input的尺寸。

那么就会得到一个公式 (W – F + 2P)/S +1 即可得到CONV层feature map的尺寸, 比如(32 – 5 + 2*2)/1 +1 = 32。长宽方向可以分别计算。

有了这个公式我们在选取这些值的时候就有了一些限制,从而也会有一些选择依据。比如zero-padding,在S=1的时候一般使P=(F-1)/2 , 如果S=2,  则(W – F + 2P)不能是奇数。

S, F, P都有 一些经验性的取值方式,参见文献[1]

 

im2col

回顾 a1 = σ(w*a0 + b)  [式01]

假设有inout[32 * 32], respective field是[5 * 5],CONV是[6@ 28 * 28]。

那么input与CONV层间的所有权值w是一个(6,5 * 5)的矩阵称之为W_row,  所有的输入activation是一个(5 * 5,28 * 28)的矩阵称之为X_col (col表示column)。

那么np.dot(W_row, X_col) 即是一个im2col运算,得到CONV层的所有input activation即为(6,28 * 28)的矩阵。

 

Cases

一些比较出名的CNN:

LeNet

AlexNet

ZF Net

GoogLeNet

VGGNet

ResNet

 

References

[1] CS231n Convolutional Neural Networks for Visual Recognition

[2] http://neuralnetworksanddeeplearning.com/chap6.html

[3] LeNet-5 , LeCun,

GradientBased Learning Applied to Document Recognition

[4] http://scs.ryerson.ca/~aharley/vis/conv/

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注