用于视觉识别的卷积神经网络
一.卷积神经网络(CNNs/ConvNets)
1.架构概述
a.1个卷积网络架构是一系列将图像体积转换成输出体积的层组成;b.层有不同的类型(CONV/FC/RELU/POOL是目前最受欢迎的);
c.每层都通过1个可微函数接收1个3D体积且转换成1个输出体积;
d.有的层有参数(CONV/FC),有些层则没有(RELU/POOL);
e.有的层有额外的超参数(CONV/FC/POOL),有些层没有(RELU)。
2.卷积层
(1)空间布置
卷积层有3个超参数:深度,步长和补0。a.深度
控制连接到输入体积的相同区域的卷积层的神经元数目。类似于常规的神经网络,隐含层有多个神经元指向相同的输入。所有的神经元将学着去激活输入的不同特征。比如,如果第1个卷积层以原始图像为输入,那么深度维度上不同的神经元可能在颜色的不同方向的边缘或者斑点处激活。我们将所有指向输入相同区域的神经元集称为深度列。
b.步长
在空间维度(宽度和高度)上分配深度列。当步长为1时会分配1个新的神经元列至间隔只有1个空间单元的空间位置。这将导致列间严重的重叠感受野且产生巨大的输出体积。相反,如果我们用更高的步长则感受野重叠程度小且输出体积将在空间上维度更小。
c.补0
有时在输入体积的边界上填充0会比较方便。补0的尺寸是个超参数。补0美妙的特点是它允许我们控制输出体积的空间尺寸。尤其是我们有时希望保留输入体积的空间尺寸。
d.计算
我们可以通过输入体积尺寸(W),卷积层神经元的感受野尺寸(F),应用感受野的步长(S)和边界上补0的数量(P)来计算输出体积的空间尺寸。
计算多少神经元“合身”的正确公式: (W-F+2P)/S+1。
如果这个数不是整数,则步长设置不正确且不能在整个输入体积上整洁地“铺”神经元。
e.补0的用法
当步长为1时, 设置补0的数量P=(F-1)/2可以确保输入体积和输出体积的空间尺寸相同。
f.步长的约束
注意到空间布置的超参数是相互约束的。比如,W=10,P=0且滤波尺寸F=3,则S不可能等于2(因为(W-F+2P)/S+1=(10-3+0)/2+1=4.5,4.5不是整数)。因此,这样设置超参数是无效的且卷积网络库将抛出异常。合适地设置卷积网络的大小使得所有维度都“有用”是一件头疼的事,而用补0和一些设计方法会显著缓解。
g.真实例子
Krizhevsky et al.架构输入图像的尺寸为[227*227*3]。第1个卷积层,感受野尺寸F=11,步长S=4且没有补0(P=0)。由于(227-11)/4+1=55且卷积层的深度K=96,卷积层的输出体积的尺寸为[55*55*96]。这每个神经元连接到尺寸为[11*11*3]的区域。每个深度列的所有96个神经元都连接到输入的同一个[11*11*3]区域,当然权重不同。
(2)参数共享
卷积神经网络的参数共享模式用于控制参数的数目。以上面例子为例,在第1个卷积层共有55*55*96=290400个神经元,且每个神经元有11*11*3=363个权重和1个偏置。仅在卷积网络的第1层总共就有290400*364=105705600个参数。显然这个数目很巨大。通过合理的假设我们可以减少参数数目:如果1块的特征对计算空间位置(x,y)有用,那对计算不同的空间位置(x2,y2)也有用。换句话说,表示1个2维深度切片作为深度切片(体积尺寸为[55*55*96]有96个深度切片,每个切片大小为[55*55]),每个深度切片上的神经元用相同的权重和偏置约束。通过这个参数共享模式,本例中第1个卷积层现在只有96个不同的权重集(每个对应相应的深度切片),总共96*11*11*3=34848个不同的权重或34944个权重(加上96个偏置)。另外,每个深度层上的所有55*55个神经元现在将使用相同的参数。实际在反向传播时,体积中的每个神经元将计算它们权重的梯度,但这些梯度会经过每个深度切片累加且每个切片仅更新1个权重集。
注意到如果1个深度切片中的所有神经元使用相同的权重向量,计算卷积层的前向通道可以看作是神经元权重和输入体积的卷积(因此被称为:卷积层)。因此,经常将权重集称为1个与输入卷积的滤波器(或者核)。
(3)总结
卷积层a.接收尺寸为W1*H1*D1的体积
b.要求4个超参数:滤波器数目K,滤波器的空间范围F,步长S,补0的数目P;
c.产生尺寸为W2*H2*D2的体积:
W2=(W1-F+2P)/S+1
H2=(H1-F+2P)/S+1(宽度和高度由于对称性计算结果相等)
D2=K;
d.参数共享使得每个滤波器有F*F*D1个权重,总共有(F*F*D1)*K个权重和K个偏置;
e.输出体积的第d个深度切片(尺寸为W2*H2)是以步长S的输入体积上与第d个滤波器有效卷积然后偏移第d个偏置的结果。
超参数的常见设置为F=3,S=1,P=1。
3.池化层
在卷积网络结构中周期性地在连续卷积层间插入1个池化层是常见的。它的作用是逐步减少表征的空间大小来减少网络中的参数数目和计算量,同时也控制过拟合。池化层独立地运行在输入的每个深度片段上且用MAX操作在空间上重新调整大小。最常见的形式是沿着宽度和高度以2的倍数在输入的每个深度片段上以2的步长作下采样,排除激活部分的75%。每个MAX操作此时将在4个数中选择1个最大值。深度保持不变。更一般地说,池化层:
(1)计算
a.接收1个大小为W1*H1*D1的体积;b.要求3个超参数:它们的空间范围F,步长S;
c.产生大小为W2*H2*D2的体积:
W2=(W1-F)/S+1
H2=(H1-F)/S+1
D2=D1;
d.没有参数是因为它计算1个输入的固定函数;
e.池化层补0是不常见的。
值得注意的是,最大池化层的变种只有2种在实际中常见:
F=3,S=2的池化层(重叠池化)
F=2,S=2的池化层,更常见
带更大感受野的池化尺寸是对数据有破坏性。
平均池化和L2池化的实际效果不如最大池化。
(2)进展
a.部分最大池化
用尺寸小于2*2的滤波器来池化操作。它通过随机产生用1*1,1*2,2*1和2*2的滤波器的组合的池化区域来铺输入激活地图。网格在每个前向传递上随机产生并且测试时预测可以是若干网格的均值。
b.力求简单
全卷积网络倾向于仅包含重复的卷积层架构而排除池化层。为减小表征的尺寸而偶尔在卷积层用大步长。
由于表征尺寸的大幅降低(小数据集控制过拟合更有帮助),文献趋向于在现代卷积网络中排除池化层。
4.正则层
正则层最近失宠因为实际使用时它们的贡献很小。5.全连接层
和常规神经网络一样,全连接层中的神经元与前面层的所有激活全部连接。因此可以用矩阵乘法加上偏置的偏移来计算它们的激活。6.全连接层转换为卷积层
全连接层和卷积层唯一不同的地方是卷积层中的神经元仅和输入的局部区域相连接,并且卷积体积中的神经元共享权重。然而两层的神经元依然计算点积,所以它们的函数形式是相同的。因此,在全连接层和卷积层之间相互转换是有可能的:a.对于卷积层存在1个全连接层和它使用相同的前向函数。权重矩阵将是1个除了特定块(由于局部连通性)大多数为0的巨大矩阵,矩阵中的许多块的权重相等(由于参数共享)。
b.相反,任何全连接层可以转换为1个卷积层。比如,K=4096的指向一些尺寸为[7*7*512]的输入体积的全连接层可以等效地表示为F=7,P=0,S=1,K=4096的1个卷积层。换句话说,设置滤波器尺寸和输入体积的尺寸相等,因此输出只有[1*1*4096]因为只有1个和初始全连接层给出相同结果的单深度列“适合”整个输入体积。
(1)全连接层转换为卷积层
全连接层转换为卷积层在实际中非常有用。考虑1个卷积网络架构的输入图像尺寸为[224*224*3],然后用一系列卷积层和池化层减小图像至尺寸为[7*7*512]的1个激活体积(在AlexNet架构中,用5次池化每次以2的倍数下采样输入,最后的空间大小为i224/2/2/2/2/2=7)。这里,AlexNet使用2个尺寸为4096的全连接层并且最后用1000个神经元的全连接层计算类的分数。可以像上面描述的那样将这3个全连接层转换为卷积层。a.用尺寸F=7的滤波器的卷积层替换第1个尺寸为[7*7*512]的全连接层,输出体积为[1*1*4096];
b.用尺寸F=1的滤波器的卷积层替换第2个全连接层,输出体积为[1*1*4096];
c.用尺寸F=1的滤波器的卷积层替换最后1个全连接层,最后输出体积为[1*1*1000]。
每次转换实际上都是将每个全连接层的权重矩阵W操纵(比如变形)成卷积层的滤波器。在1个前向传递中,这种转换可以在大图像的很多空间位置上很有效地“滑过”初始卷积网络。
比如,尺寸为[224*224]的图像给出尺寸为[7*7*512]的体积-32倍下采样,同理尺寸为[384*384]的图像给出尺寸为[12*12*512]的体积(384/32=12)。后面3个由全连接层转换过来的卷积层给出尺寸[6*6*1000],因为(12-7)/1+1=6。注意到类分数的尺寸虽为[1*1*1000],但得到的是滑过整个[384*384]图像的全部6*6的类分数滤波器。
一次发送到转换的卷积网络比在所有36个位置迭代的初始卷积网络更加有效率,由于36次迭代共享计算。实际中获得更好性能的小技巧是调整图像使其更大,在很多空间位置用1个转换后的卷积网络来评估类分数。
最后,如果希望给图像用初始的卷积网络但步长小于32个像素呢?可以用多个前向传递实现。
二.卷积网络架构
常见的卷积网络架构包含3种类型的层:CONV,POOL(默认为最大POOL)和FC(全连接)。明确将按元素应用非线性的RELU激活函数作为1层。1.层模式
卷积网络架构中最常见的形式是若干CONV-RELU层堆叠,后面跟着POOL层,然后重复该模式直到图像在空间中合并至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->FC
INPUT->[CONV->RELU->POOL]*2->FC->RELU->FC。每个池化层间有1个卷积层。
INPUT->[CONV->RELU->CONV->RELU->POOL]*3->[FC->RELU]*2->FC。每个池化层前堆叠2个卷积层。通常网络越大越深越好,因为多个卷积网络堆叠可以在破坏性的池化操作前发展更复杂的输入体积特征。
1叠小卷积滤波器比1个大感受野卷积层更受欢迎。假定你堆叠[3*3]的卷积层。第1个卷积层上的每个神经元有输入体积的[3*3]视角,第2个卷积层上的每个神经元有第1个卷积层的[3*3]视角,因此第2个卷积层上的每个神经元有输入体积的[5*5]视角。类似的,第3个卷积层上的1个神经元有第2个卷积层的[3*3]视角,因此有输入体积的[7*7]视角。假设不用这3个[3*3]的卷积层,希望用单个[7*7]感受野的卷积层。这些神经元将有和空间范围(7*7)相同大小的感受野尺寸,但是存在一些缺点。首先,神经元将计算输入的线性函数,而3个堆叠的卷积层包含更能表现它们特征的非线性。其次,假定所有的体积都有C个通道,则[7*7]的滤波器将包含C*(7*7*C)=49*C*C个参数,而3个[3*3]的卷积层仅包含3*(C*(3*3*C))=27*C*C个参数。直观上看, 相对于1个大滤波器的卷积层,小滤波器堆叠出的卷积层能够表现输入的更加有力的特征,并且有更少的参数。实际中的缺点是如果打算作反向传播,则可能需要更多的存储空间来保存中间卷积层的结果。
2.层尺寸设置
a.输入层
输入层包含图像,尺寸应该能被2整除。常见数包括32(比如CIFAR-10),64,96(比如STL-10),224(比如ImageNet卷积网络),384和512。
b.卷积层
卷积层应该用小滤波器(比如3*3,或至多5*5),使用步长S=1,且关键是,对输入体积补0要求不改变输入的空间维度。也就是说,当F=3,然后用P=1将保留输入的原始尺寸。当F=5时,则P=2。对于一般的F,P=(F-1)/2时保留输入尺寸。如果必须要用更大的滤波器(比如7*7等),仅在输入图像的第1个卷积层常见。
c.池化层
池化层负责下采样输入的空间维度。最常见的设置是使用2*2的感受野(F=2)作最大池化,且步长为2(S=2)。这将排除输入体积中激活部分的75%(由于在高度和宽度上下采样)。另一个稍微不常见的设置是以2的步长用3*3的感受野,但这个可行。用大于3的感受野尺寸来最大池化很不常见,因为池化过于有损和激进。这通常会导致更差的效果。
d.为什么在卷积层中用步长1?
实际上步长越小效果越好。另外,步长1将所有空间下采样的工作丢给了池化层,而卷积层只负责按深度方向转换输入体积。
e.为什么用补0?
除了卷积后保持空间尺寸不变的好处外,这样做还能提升性能。如果卷积层没有给输入填充0而仅作有效卷积,那么体积的尺寸每次卷积后都会减小一点,且边缘信息将很快被“冲掉”。
f.基于存储空间约束的折中
某些情况(尤其是卷积网络架构早期),存储空间的数量用上面的经验会很快积聚。比如,用3个[3*3]的卷积层(每层64个滤波器)和补0给1张[224*224*3]的图像滤波将产生3个尺寸为[224*224*64]的激活体积。总共有约1千万个激活值,或者72MB的存储空间(每张图像,对于激活和梯度)。由于GPU经常受存储空间的限制,可能有必要去做折中。实际中,人们更愿意仅在网络的第1个卷积层做这种。比如,1种折中可能是将步长2和[7*7]滤波器用在第1个卷积层(见ZF net)。另外1个例子,1个AlexNet用尺寸为[11*11]的滤波器和4的步长。
3.实例研究
a.LeNet
上世纪90年代Yann LeCun成功应用第1个卷积网络。
b.AlexNet
计算机视觉领域中推广卷积网络的第1份工作是AlexNet,由Alex Krizhevsky,Ilya Sutskever和Geoff Hinton开发。AlexNet在2012年的ImageNet ILSVRC challenge上提交并明显优于亚军(top 5错误率为16%,亚军的错误率为26%)。网络和LeNet有相似的架构基础,但是更深更大并且 提取特征的卷积层彼此堆叠(之前常见的是单个卷积层后紧随1个池化层)。
c.ZF Net
ILSVRC 2013的冠军是来自Matthew Zeiler和Rob Fergus的卷积网络,以ZF Net著称(Zeiler & Fergus Net的简写)。它是通过调整架构参数的AlexNet的提升版,尤其是通过扩展中间卷积层的尺寸。
d.GoogLeNet
ILSVRC 2014的冠军是来自Google的Szegedy等的1个卷积网络。它的主要贡献是Inception模块的发展使得网络中的 参数数量极大地减少(4M,相对于AlexNet的60M)。
e.VGGNet
ILSVRC 2014的亚军是来自Karen Simonyan和Andrew Zisserman的网络,以VGGNet著称。它的主要贡献是显示网络的深度是好性能的1个关键组成部分。它们最后最优的网络包含16个卷积/全连接层并且,吸引人的地方是, 从开头到结尾只用[3*3]的卷积和[2*2]的池化得到1个极其同质的架构。后来发现尽管尽管分类的表现略弱,VGGNet在多个迁移学习任务中的表现优于GoogLeNet。因此, 当从图像中提取CNN特征时,VGG网络是现在的首选。尤其是它们的预训练模型在Caffe中即插即用。VGGNet的缺点是它更难评估并且占用更多存储空间和参数(140M)。
整个VGGNet由[3*3]卷积,步长为1,补0数为1的卷积层和[2*2]最大池化,步长为2,无补0的池化层组成。和常见卷积网络一样,大多数存储空间用在前面的卷积层,大多数参数在最后的全连接层。这里第1个全连接层包含100M的权重(整个网络权重共140M)。
4.计算代价
构建卷积网络架构最大的瓶颈是存储空间瓶颈。许多现代的GPU有3/4/6GB存储空间的限制,而最好的GPU大约有12GB的存储空间。有3处存储空间资源可以跟踪:a.中间体积尺寸
卷积网络每层原来都有很多激活函数和它们的梯度(数量相同)。通常大多数激活在1个卷积网络的前面层上(也就是第1个卷积层)。这些被保留因为反向传播时需要它们,但 测试时运行1个卷积网络的明智用法是通过仅存储任何层的当前的激活并排除前面层的激活,从而在原则上极大地减少了中间层体积所占的存储空间。
b.参数尺寸
参数尺寸就是网络参数和它们在反向传播时的梯度的数目,并且如果优化是用动量,Adagrad或RMSProp常见的也只用 1步的缓存。因此,仅存储这些参数向量的存储空间通常必须要乘以至少3的倍数。
c.其它
每个卷积网络应用都有其它的存储空间,比如图像数据块,也许还是它们的增加版本等等。
一旦你对这些值(激活,梯度和其它)的总数有大致的估计,该数应该转换成GB表示的大小。用总数再乘以4得到字节的原始数目(因为每个浮点数是4字节,或对双精度可能除以8),然后除以1024多次得到单位为KB,MB,GB的存储空间大小。 如果网络不合身,使其合身的常见想法是减小块大小,因为大多数存储空间通常消耗在激活那儿。
三.参考链接
http://cs231n.github.io/convolutional-networks/
注:粗略翻译我觉得重要的内容,如果不满足请看原文。