参考文档:CS231n
一、概述
卷积神经网络(Convolutional Neural Network,CNN)与原始的fully connect neural network相似,由具有可训练的权重和偏差的神经元组成,每个神经元接受输入,执行点积,有选择性的用一个非线性函数处理它。整个网络仍表现为一个单一可微函数,并在最后一层具有损失函数。不同之处在于,CNN明确假定输入是图片,这使我们可以将某些特性编码到网络结构中,大大减少了网络参数数量。
传统的神经网络在处理图片时效果并不理想。以一张32*32*3的图片为例,一方面,需要将其拉伸成3072*1的向量,这损失了很多信息,比如图片中相邻的点;另一方面,这种做法要求非常多的权重,浪费且很容易导致过拟合(overfitting)。
CNN的神经元有三个维度:width,height,depth。每层都执行一个简单的操作:将一个3d的输入转化为3d的输出,输出有一些可微的函数,这些函数可以有参数。我们主要使用三种图层构建CNN:卷积层(Convolutional Layer)、池化层(Pooling Layer)、全连接层(Fully-Connected Layer),通常还有一层用来非线性化(如ReLU)。
二、Convolutional Layer
卷积层的参数由一组可学习的滤波器(filter)组成。每个滤波器的尺寸(宽和高)都很小,但深度和整个输入相同,例如,第一层的滤波器尺寸通常为5*5*3(5像素宽和高,3通道)。在正向传递期间,我们沿着输入体积的宽度和高度滑动(更精确地说,卷积)每个滤波器,并计算滤波器输入和任意位置输入之间的点积。当我们在输入体积的宽度和高度上滑动滤波器时,我们将生成一个二维激活图,给出该滤波器在每个空间位置的响应。我们的每层卷积层都将会有一整套滤波器(例如,12个),每个都将单独生成一张二维的激活图。
三个超参数控制输出的大小:深度(depth)、步长(stride)和零填充(zero-padding)。设输入尺寸为W,卷积层滤波器接受域尺寸为F,步长为S,零填充数为P,则计算输出尺寸的公式为:
(W-F+2P)/S + 1
最终每个滤波器都会得到这样尺寸(设为L)的一张二维图,而层的深度为K,则最终的输出尺寸为L*L*K。
使用零填充来控制输出的尺寸。通常,当步长为1时,令P=(F-1)/2,保证了输入与输出拥有同样的空间尺寸。
步长的有效性。需要保证上面的公式计算结果为整数,否则设置的步长是无效的。
参数共享。卷积层通过参数共享来减少参数数量。这基于一个合理的假设:如果一个特征对于在某个空间位置(x,y)进行计算是有用的,那么由于平移不变性(translationally invariant)在不同位置计算也应该是有用的(x2 ,y2)上。换句话说,将单个2维深度切片表示为深度切片(例如,大小为[55×55×96]的输入具有96个深度切片,每个切片的大小为[55×55]),我们将限制每个深度切片中的神经元使用相同的权重和偏差。
三、Pooling Layer
在连续的卷积层之前插入池化层是很常见的。其功能是逐步减少表示的空间大小,以减少网络中的参数和计算量,从而控制过拟合。 池层在输入的每个深度切片上独立运行,并使用MAX操作在空间上调整其大小。
一般来说,池化层:
接受尺寸为W1*H1*D1的输入
要求两个超参数:空间范围F,步长S
产生尺寸为W2*H2*D2的输出,其中:
W2=(W1-F)/S+1
H2=(H2-F)/S+1
D2=D1
计算固定的功能,零参数
通常不在池化层使用零填充
通常只有两种Max Pooling:F=3,S=2(也称作overlapping pooling)和更常用的F=2,S=2。更大接受域的Max Pooling损失信息过多。