详解卷积神经网络(CNN)
卷积神经网络CNN
CNN概述
卷积神经网络(Convolutional Neural Networks,简称CNN)是一类包含卷积计算且有深度结构的前馈神经网络,是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按照其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络(shift-Invariant Artificial Neural Networks,简称SIANN)”。
CNN结构
卷积神经网络主要包含以下几种层:输入层(Input Layer)、卷积层(Convolutional Layer)、池化层(Pooling Layer)、全连接层(Fully-Connected Layer)、输出层(Output Layer)。如下图所示:
卷积层(Convolutional Layer)
感受野(receptive field)
卷积层是构建卷积神经网络的核心层,它会产生非常大的计算量。若普通神经网络把输入层和隐含层进行“全链接”的设计。在计算量方面,相对较小的图片在计算特征时,是可行的。但是,对于更大的图片,若要进行全联通网络学习整张图片的特征,其计算量将会非常大,从而也非常耗费时间。假设设计的输入单元为个,需要学习的特征为100个,那么就有个参数需要学习。与25*25的小图片相比较,其计算过程慢了倍。
因此在处理图像的高纬度输入时,让每个神经元都与前一层中的所有神经元进行全链接是不现实的,也是不允许的。但是,我们可以让每个神经元只与输入数据的局部区域进行链接。而该链接的空间大小是神经网络的感受野(receptive field),它的尺寸是一个超参数(即滤波器的空间深度)。而且该超参数和输出数据的深度相一致
上图中展现的卷积神经网络的一部分,其中的红色为输入数据,假设输入数据体尺寸为[32x32x3](比如CIFAR-10的RGB图像),如果感受野(或滤波器尺寸)是5x5,那么卷积层中的每个神经元会有输入数据体中[5x5x3]区域的权重,共5x5x3=75个权重(还要加一个偏差参数)。注意这个连接在深度维度上的大小必须为3,和输入数据体的深度一致。其中还有一点需要注意,对应一个感受野有75个权重,这75个权重是通过学习进行更新的,所以很大程度上这些权值之间是不相等(也就对于同一个卷积核,它对于与它连接的输入的每一层的权重都是独特的,不是同样的权重重复输入层层数那么多次就可以的)。在这里相当于前面的每一个层对应一个传统意义上的卷积模板,每一层与自己卷积模板做完卷积之后,再将各个层的结果加起来,再加上偏置,注意是一个偏置,无论输入输入数据是多少层,一个卷积核就对应一个偏置
空间排列(Spatial arrangement)
输出单元的尺寸大小是由下面三个超参数进行控制的:深度(depth)、步长(stride)和零填充(zero-poolin)。
- 深度(depth):和输出单元、滤波器的深度一致;
- 步长(stride):是指滤波器在感受野区域内,每次移动的像素值大小;当步长为1时,滤波器每次移动1个像素;若步长为2,滤波器每次移动2个像素;
- 零填充(zero-poolin):通过在输入单元周围补零来改变输入单元的空间大小,从而改变输出单元的空间大小。最常用的是利用零填充的方法来确保输入单元和输出单元的宽度和高度相等;
若输入单元的尺寸为,输出单元的尺寸为,卷积层中的神经元感受野为(F),步长(S),滤波器数量为(K)和零填充的数量为§,那么输出尺寸和输入尺寸之间的关系如下:
步长的限制:假如,当输入尺寸w=10,不使用零填充P=0,滤波器尺寸F=3,此时步长为S=2是不行的,因为$ (W-F+2P)/S+1=(10-3+0)/2+1=4.5$,其输出单元的尺寸不为整数,也就是说神经元不能整齐对称划过所有数据体,因此该超参数设置是无效的。
权值共享
在卷积层中权值共享是用来控制参数的数量。假如在一个卷积核中,每一个感受野采用的都是不同的权重值(卷积核的值不同),那么这样的网络中参数数量将是十分巨大的。
应用参数共享可以大量减少参数数量,参数共享基于一个假设:如果图像中的一点(x1, y1)包含的特征很重要,那么它应该和图像中的另一点(x2, y2)一样重要。换种说法,我们把同一深度的平面叫做深度切片(depth slice)((e.g. a volume of size [55x55x96] has 96 depth slices, each of size [55x55])),那么同一个切片应该共享同一组权重和偏置。我们仍然可以使用梯度下降的方法来学习这些权值,只需要对原始算法做一些小的改动, 这里共享权值的梯度是所有共享参数的梯度的总和。
我们不禁会问为什么要权重共享呢?一方面,重复单元能够对特征进行识别,而不考虑它在可视域中的位置。另一方面,权值共享使得我们能更有效的进行特征抽取,因为它极大的减少了需要学习的自由变量的个数。通过控制模型的规模,卷积网络对视觉问题可以具有很好的泛化能力。
卷积
每一个卷积层的计算都是输入单元和权重(即滤波器)的卷积;卷积的运算如下图所示:
卷积层参数
- 输入单元尺寸:
- 输出单元尺寸:,其中
-
注:- 在权值共享中,每个filter有个权重和K个偏值;
- 在输出单元中,第d个深度切片的结果是第d个filter和输入单元做的卷积运算,然后再加上偏值。
池化层(Pooling Layer)
通常在连续的卷积层之间会插入一个池化层。它的作用是逐渐降低数据单元的尺寸,来有效的减少网络中的参数数量,降低计算资源的消耗;同时,也能有效的控制过拟合。池化层的运算方式有最大池化层(Max Pooling)、平均池化层(Average Pooling)、中值池化层(Mid-value Pooling)等方式。
输入数据体尺寸,有两个超参数:空间大小FF和步长SS;输出数据体的尺寸 ,其中
-
-
-
全连接层(Fully-Connected Layer)
全连接层和卷积层可以相互转换:
- 对于任意一个卷积层,要把它变成全连接层只需要把权重变成一个巨大的矩阵,其中大部分都是0 除了一些特定区块(因为局部感知),而且好多区块的权值还相同(由于权重共享)。
- 相反地,对于任何一个全连接层也可以变为卷积层。比如,一个K=4096K=4096 的全连接层,输入层大小为 7∗7∗5127∗7∗512,它可以等效为一个 F=7, P=0, S=1, K=4096F=7, P=0, S=1, K=4096 的卷积层。换言之,我们把 filter size 正好设置为整个输入层大小。