赞
踩
经典网络ResNet(Residual Networks)由Kaiming He等人于2015年提出,论文名为《Deep Residual Learning for Image Recognition》,论文见:https://arxiv.org/pdf/1512.03385.pdf
ResNet要解决的是深度神经网络的”退化(degradation)”问题,即使用浅层直接堆叠成深层网络,不仅难以利用深层网络强大的特征提取能力,而且准确率会下降,这个退化不是由于过拟合引起的。
ResNet也称为残差网络。ResNet是由残差块(Residual Building Block)构建的,论文截图如下所示:提出了两种映射:identity mapping(恒等映射),指的是右侧标有x的曲线;residual mapping(残差映射),残差指的是F(x)部分。最后的输出是F(x)+x。F(x)+x的实现可通过具有”shortcut connections”的前馈神经网络来实现。shortcut connections是跳过一层或多层的连接。图中的”weight layer”指卷积操作。如果网络已经达到最优,继续加深网络,residual mapping将变为0,只剩下identity mapping,这样理论上网络会一直处于最优状态,网络的性能也就不会随着深度增加而降低。
残差块由多个级联的卷积层和一个shortcut connections组成,将二者的输出值累加后,通过ReLU激活层得到残差块的输出。多个残差块可以串联起来,从而实现更深的网络。
残差块有两种设计方式,论文截图如下所示:左图针对较浅的网络,如ResNet-18/34;右图针对较深的网络,又称为”bottleneck” building block,如ResNet-50/101/152,使用此方式的目的就是为了降低参数数目。
论文中给出了5种不同层数的ResNet,论文截图如下所示:可见,ResNet-18/34是进行两层卷积的残差,ResNet-50/101/152是进行三层卷积的残差,分别对应于上图中的残差块的两种设计方式。ResNet-18/34对应的每个残差块的卷积kernel大小依次是3*3、3*3,ResNet-50/101/152对应的每个残差块的卷积kernel大小依次是1*1、3*3、1*1。
18、34层等数字是如何计算出来的:以34层为例,1个卷积(conv1)+3残差块*2个卷积(conv2_x)+4个残差块*2个卷积(conv3_x)+6个残差块*2个卷积(conv4_x)+3个残差块*2个卷积(conv5_x)+最后的1个全连接层=34。这里的层仅指卷积层和全连接层,其它类型的层并没有计算在内。
论文中给出了层数为34的ResNet网络结构,论文截图如下所示:左侧为VGG-19网络结构;中间为34层的普通网络结构;在此基础上,在层与层之间加入shortcut connections,就将普通网络转换为对应的ResNet网络,即右侧网络结构。与上表中ResNet-34一致。
右侧ResNet网络,曲线有实线和虚线两种。虚线表示恒等映射x输出的feature map数、width、height与残差F(x)的输出不一致时,x需要进行卷积kernel大小为1*1的运算操作,因为最终F(x)与x要执行”+”操作,即Eltwise操作。GoogLeNet中使用Concat操作。
假如输入图像大小为n*n,过滤器(filter)为f*f,padding为p,步长(stride)为s,则输出大小为:计算卷积层大小,如果商不是整数,向下取整,即floor函数;计算池化层大小,如果商不是整数,向上取整,即ceil函数。参考:https://blog.csdn.net/fengbingchun/article/details/80262495
在https://github.com/fengbingchun/Caffe_Test/tree/master/test_data/Net/ResNet 上整理了论文中ResNet对应的18、34、50、101、152的prototxt文件。
这里描述下ResNet-50架构:与上表中”50-layer”一致
(1).输入层(Input):图像大小为224*224*3。
(2).卷积层conv1+BatchNorm+Scale+ReLU:使用64个7*7的filter,stride为2,padding为3,输出为112*112*64,64个feature maps。
(3).卷积层conv2_x:输出为56*56*256,256个feature maps。
A.最大池化层:filter为3*3,stride为2,padding为0,输出为56*56*64,64个feature maps。
B.连续3个残差块,每个残差块,包含3层卷积,卷积kernel大小依次为1*1、3*3、1*1,feature maps数依次为64、64、256,第1、2层卷积做Convolution+BatchNorm+Scale+ReLU,第3层卷积做Convolution+BatchNorm+Scale。第1个残差块的identity mapping需做卷积kernel大小为1*1+BatchNorm+Scale运算,使其输出调整为56*56*256,便于做Eltwise操作。每个残差块后做Eltwise+ReLU操作。
(4).卷积层conv3_x:输出为28*28*512,512个feature maps。
连续4个残差块,每个残差块,包含3层卷积,卷积kernel大小依次为1*1、3*3、1*1,feature maps数依次为128、128、512,第1、2层卷积做Convolution+BatchNorm+Scale+ReLU,第3层卷积做Convolution+BatchNorm+Scale。第1个残差块的identity mapping需做卷积kernel大小为1*1+BatchNorm+Scale运算,使其输出调整为28*28*512,便于做Eltwise操作。每个残差块后做Eltwise+ReLU操作。
(5).卷积层conv4_x:输出为14*14*1024,1024个feature maps。
连续6个残差块,每个残差块,包含3层卷积,卷积kernel大小依次为1*1、3*3、1*1,feature maps数依次为256、256、1024,第1、2层卷积做Convolution+BatchNorm+Scale+ReLU,第3层卷积做Convolution+BatchNorm+Scale。第1个残差块的identity mapping需做卷积kernel大小为1*1+BatchNorm+Scale运算,使其输出调整为14*14*1024,便于做Eltwise操作。每个残差块后做Eltwise+ReLU操作。
(6).卷积层conv5_x:输出为7*7*2048,2048个feature maps。
连续3个残差块,每个残差块,包含3层卷积,卷积kernel大小依次为1*1、3*3、1*1,feature maps数依次为512、512、2048,第1、2层卷积做Convolution+BatchNorm+Scale+ReLU,第3层卷积做Convolution+BatchNorm+Scale。第1个残差块的identity mapping需做卷积kernel大小为1*1+BatchNorm+Scale运算,使其输出调整为7*7*2048,便于做Eltwise操作。每个残差块后做Eltwise+ReLU操作。
(7).平均池化层:filter为7*7,stride为1,padding为0,输出为1*1*2048,2048个feature maps。
(8).全连接层:有1000个神经元或输出1000个feature maps。
(9).输出层(Softmax):输出分类结果,看它究竟是1000个可能类别中的哪一个。
可视化结果如下图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。