Lecture 9 CNN Architectures网络
参见:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_83app
1、 LeNet-5:框架
神经网络的第一个实例,用于识别邮票上的手写数字,使用步长为1,大小为5*5的卷积核,对第一层进行操做,而后进行池化,经过几层卷积和池化,在网络的最后还有一些全链接层。LeNet在数据识别领域取得了成功。ide
2、 AlexNet:函数
Alexnet是2012年ImageNet中胜出的模型,将错误率从25.8%下降至16.4%。性能
1.网络结构:学习
[227x227x3] INPUT测试
[55x55x96] CONV1: 96 11x11 filters at stride 4, pad 0优化
[27x27x96] MAX POOL1: 3x3 filters at stride 2.net
[27x27x96] NORM1: Normalization layer
[27x27x256] CONV2: 256 5x5 filters at stride 1, pad 2
[13x13x256] MAX POOL2: 3x3 filters at stride 2
[13x13x256] NORM2: Normalization layer
[13x13x384] CONV3: 384 3x3 filters at stride 1, pad 1
[13x13x384] CONV4: 384 3x3 filters at stride 1, pad 1
[13x13x256] CONV5: 256 3x3 filters at stride 1, pad 1
[6x6x256] MAX POOL3: 3x3 filters at stride 2
[4096] FC6: 4096 neurons
[4096] FC7: 4096 neurons
[1000] FC8: 1000 neurons (class scores)
FC8与softmax层相连,进行1000个类别的ImageNet的图像分类。
2.关于第一层形状和参数数量的计算(number of parameters)
output_size = (input_size-filter_size)/stride +1
parameters_num = filter_size*filter_number
比较有趣的是,池化层参数数量为零。由于它只对参数作了较少操做,只是观察卷积层已有的参数,而后取了最大值。
3.AlexNet网络特色
First use of ReLU;
Used Norm layers (not common anymore);
Heavy data augmentation;
Dropout 0.5;
Batch size 128;
SGD Momentum 0.9;
Learning rate 1e-2, reduced by 10 manually when val accuracy plateaus;
L2 weight decay 5e-4(正则化的权重衰减);
7 CNN ensemble: 18.2% -> 15.4%(模型集成,取平均)。
因为当时所使用GPU的显存不够存放这么多参数,所以从第一个卷积层开始将参数分为两组,在两个GPU中训练。
3、 ZFNet:
ZFNet是2013年ImageNet获胜的模型,在超参数上对AlexNet进行了改进。
ZFNet网络特色
ZFNet框架大致与AlexNet一致。它们具备相同的层数,基本结构;在步长上有一点改进,卷积核数量上也略有不一样。
4、 VGGNet
VGGNet和GoogleNet是14年胜出的模型,它们与以前的网络最大的不一样之处在于拥有了更深层的网络,分别是19层、22层。GoogleNet与VGGNet很相近,其实是VGGNet的一个本地化的改进,二者的鲁棒性都很好。
VGG16网络详细信息:
INPUT: [224x224x3] memory: 224x224x3=150K params: 0
CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x3)x64 = 1,728
CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x64)x64 = 36,864
POOL2: [112x112x64] memory: 112x112x64=800K params: 0
CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x64)x128 = 73,728
CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x128)x128 = 147,456
POOL2: [56x56x128] memory: 56x56x128=400K params: 0
CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x128)x256 = 294,912
CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824
CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824
POOL2: [28x28x256] memory: 28x28x256=200K params: 0
CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x256)x512 = 1,179,648
CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296
CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296
POOL2: [14x14x512] memory: 14x14x512=100K params: 0
CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
POOL2: [7x7x512] memory: 7x7x512=25K params: 0
FC: [1x1x4096] memory: 4096 params: 7x7x512x4096 = 102,760,448
FC: [1x1x4096] memory: 4096 params: 4096x4096 = 16,777,216
FC: [1x1x1000] memory: 1000 params: 4096x1000 = 4,096,000
TOTAL memory: 24M * 4 bytes ~= 96MB/image (only forward) (每一个数字占用四字节内存)
TOTAL params : 138M parameters。
前向传播占用的总内存约为每张图像96MB,算入反向传播的话加倍便可。
VGGNet网络特色:
更小的filters,更深的网络;
Only 3x3 CONV stride 1, pad 1 and 2x2 MAX POOL stride 2;
这种卷积核已是最小的卷积核了,网络只关注相邻的像素。整个网络保持这种小卷积核的结构、并进行下采样,简洁而优雅,得到了ImageNet最好的7.3的错误率。
为何使用小的卷积核?当使用小卷积核时,3个3x3的卷积层和1个7x7的卷积层拥有一样有效的感觉野,可是小卷积核可让咱们尝试更深层的网络和更多的卷积核,更非线性化,最终的效果比大卷积核的效果要好,且其参数数量更少,3x(3x3)<7x7。
倒数第二层FC(FC7,1000个,即类别层以前)的hidden number=4096被验证已经可以很好地进行特征表达,能够用于在其余数据中提取特征,并有比较好的泛化性能;
做者先训练了一个11层的网络,使其收敛,以后将其扩展到16/19层,以此来解决深层网络收敛困难的问题(Batch Normalization提出后就不须要这种操做了);
5、GoogleNet:
1.GoogleNet网络特色:
l 22层网络;
l 没有FC层,所以节省了大量参数,仅有5million,比AlexNet少了12倍;
l 为提升计算效率引入了“inception” module和“bottleneck”的概念;
l 网络有两个辅助输出(Auxiliary classification outputs)用于向低层的网络注入额外的梯度,以此解决网络收敛困难的问题(Batch Normalization提出后就不须要这种操做了);
2.“inception” module
能够将网络当作是由局部网络拓扑(“inception” module)堆叠而成。对进入相同层的相同输入并行应用不一样类别的滤波操做。咱们未来自前面层的输入进行不一样的卷积操做、池化操做,从而获得不一样的输出,最后须要将全部输出在深度层面上链接到一块儿。计算与串联方式以下图所示:
咱们经过inception操做在保持形状不变的状况下扩充了深度。为何在通过不一样的滤波器后咱们老是能获得相同的尺寸?为了让输出尺寸和输入尺寸保持一致,咱们使用的方法是零填充(zero padding)。另外,输入中的256是上一层中输入的深度。
池化层在这个问题中也参与了运算,它保留了模型的深度,所以在每一层深度只能增长。
另外经过计算咱们能够发现,卷积层的参数数量或者操做数量达到了854M,计算量极大。
3.“blottleneck”(瓶颈层):
使用 “inception” module 后随之而来的问题就是:
l 单层的参数就达到854M个,计算量极大;
l 且数据通过每个 “inception” module 后深度都会增长(光池化层获得输出数据的尺寸就已经与原数据相同)。
为解决上述问题,构建了称之为“bottleneck”的1x1卷积层以减小特征深度(以下图所示):
改进后的“inception” module以下图所示:
Bottleneck的目的是在卷积运算以前下降特征图的维度。咱们运用以前提到过的1*1卷积核,它可以保持形状不变,减少深度,从而下降特征图的维度。
对于Bottleneck减少运算量的具体计算:对于相同的输入大小28*28*256,咱们将计算量减小到了358M。
用1*1卷积核是否会致使一些信息丢失?结果可能会有一些信息丢失,但这样的效果更好,对于处理计算复杂性这一点来讲。
4.Full GoogleNet Architecture:
Stem Network更像咱们以前见过的正常的CNN结构。
咱们将初始模块堆叠在一块儿
在堆栈的顶部有分类输出。全链接层已经被移除,没有FC工做效果依然很好,还节省了不少参数。
5.Auxiliary classification outputs:
GoogleNet同时拥有两个辅助输出,它们是使用Softmax函数的一个带有平均池化的小网络,具备平均池化、1*1卷积、FC*二、Softmax分类的结构(至关于咱们提早进行了分类输出),能够对前面几个层进行更多的梯度训练。当网络深度很深的时候,一些梯度信号会最小化而且丢失了前面几层的梯度信号,该方法能在必定程度上解决梯度消失的问题。
5、ResNet:
1.ResNet网络特色:
l 152层;
l 利用残差层实现优化;
l 网络由残差盒堆叠而成(每个残差盒包含两个3x3 CONV);
l 若是将残差盒中的全部权重置零,那么残差盒的输出与输入就是相等的,所以,在某种层度上,这个模型是相对容易去训练的,并不须要添加额外的层;
l 神经网络中添加L2正则化的做用是迫使网络中的全部参数趋近于0,其余网络结构(如CONV)参数趋于0不太说得通。但在残差网络中,若是全部参数趋于0,那就是促使模型再也不使用他不须要的层,由于它只趋使残差盒趋向同一性,也就不须要进行分类;
l 残差链接在反向传播时,为梯度提供了一个超级“高速通道”(梯度通过残差盒的加法门分流而后汇总),这使得网络训练更加容易(DenseNet和FractalNet也有相似的梯度直传式的链接);
l 周期性的,会使用两倍数量的filters,用stride 2 CONV进行下采样(全部维度/2);
l 网络起始处有一个额外的CONV;
l 没有额外的FC;
l 只有一个全局的AVE POOL;
l 每个CONV后都带有一个BN;
l 用一个额外的带尺度因子的Xavier/2去初始化;
l 初始学习率为0.1,当Validation error停滞时,将其缩小十倍;
l Mini-batch size = 256;
l Weight decay = 1e-5.
2.残差盒(Residual block):
当咱们在普通卷积神经网络[1]上堆叠愈来愈多的层时到底会发生什么?咱们以VGG或者其余的通常网络为例,咱们能仅仅经过扩展更多的层来获得更好的效果吗?答案是不能。
由上图实验结果可知,56层网络的训练偏差和测试偏差都高于20层的网络。按理说。56层的NN拥有不少参数和更深的层数,应该会更早地达到过拟合,从而拥有更低的训练偏差和更高的测试偏差。可是实验代表56层的NN的训练偏差比20层的NN更高了。
ResNet的做者假设:这是一个优化问题,层深的模型更难优化。因而,做者提出了残差网络的概念,其与常规网络的区别以下图所示:
Residual block使这些网络层拟合的是残差映射H(x)-x而不是直接映射H(x)。某种意义上能够当作是一种对输入的修正。以前咱们学习的是H(x),如今咱们把最终的表达分解为F(x)+x,从而只需学习F(x),F(x)就是咱们所说的残差。一般来讲,网络的层与层之间实际上相差不大的,一个恒等映射(x到x自己)加上很小的∆x(若恒等映射是最好的,只需将∆x置零)的学习过程更容易实现。
与GoogleNet相似,若是网络层数较多的话,ResNet的残差盒可使用“bottleneck”来加速计算(以下图所示)。
6、扩展知识:
1.Network in Network(NiN):
每一个卷积层中都有一个彻底链接的MLP(micronetwork),以计算局部图像块的更多抽象特征。这个模型是GoogleNet和ResNet模型“bottleneck”的灵感来源。
2.Identity Mappings in Deep Residual Networks:
在ResNet的基础上进行修改,新的结构可以实现一种更直接的路径用于在整个网络中传播信息(将激活层移动到残差映射路径中)。
3.Wide Residual Networks:
做者认为残差量是一个十分重要的因素而不是深度。使用了更宽的残差模块(FxK filters而不是F filters in each layer),宽网络的另外一个优势是便于使用并行计算。本文旨在比较网络的宽度、深度和残差链接所作出的贡献。
4.ResNeXt:
经过多条平行路径增长残差盒宽度,这些分支总和被称为“cardinality”,思想相似于“inception”module。
5.Deep Networks with Stochastic Depth:
动机是在训练过程当中经过短网络减小消失梯度和训练时间。该思想相似于Dropout,只不过这里是沿网络深度方向的dropout。方法是在每次训练中随机drop某层子集(即ResNet中∆x=0,该层为恒等映射),在测试时使用完整的训练好的网络。
6.FractalNet:
做者认为引入残差可能不是必须的,关键在于有效地从浅层网络转型为深层网络。所以他使用了上图所示这种分型结构,各层都以分形的形式存在,所以同时存在浅层和深层路径到大输出值。他们经过抛弃子路径的方式训练,相似于dropout,测试时使用整个分形网络。
7.DenseNet:
密集链接卷积神经网络。每一个Dense block中每层都与其后的全部层之前馈的形式链接,所以在这个Dense block内,你对其的输入也是对全部其余各层的输入,你会计算每个卷积输出,这些输出与其后的全部层链接,全部这些值集中起来,共同做为卷积层的输入。这一方法能缓解梯度消失的问题,增强特征图的传递,鼓励特征的再利用。
8.SqueezeNet:
关注于构建高效网络,压缩网络的大小。由一个个fire模块组成,每一个fire模块都含有一个squeeze层,其由许多1x1的filters组成。接着,它再传递给一个扩大层含有一些1x1和3x3的filters。参数只有AlexNet的1/50,性能类似。