ResNet作为卷积神经网络的一个里程碑式的模型一直在各个领域被应用,因此学习这样一个模型架构很有必要。网上也有很多关于这个网络的介绍,也从中衍生了很多改进的模型(无论改动幅度大小)。因此,有必要就ResNet的变体进行总结。
本篇文章涉及到的文章有:原始版本ResNet[1]、Wider ResNet[3]、ResNeXt[4]、DarkNet53[5],这几篇是我看到变化相对明显;还有一些则是改动相对小一点的,如Identity mapping[2]、Bag of Trick[6]、Dilated ResNet[7]以及torch框架下一个Blog[8],这些文章里也提及到对ResNet的改动,但是并没有整个Block地改,而是只改动了小部分。
下面就开始讲讲这些文章的改动。
原版的ResNet[1]指出一般认为,越深的网络通常会带来更好的表现,但实际上,普通的更深的网络性能不但没有提升,反而会出现下降。于是文章提出了一个假设,越深的网络应该带来至少和浅层网络一样的性能,那么如何保证这个效果呢?文章提出了skip connection,也就是一个简单的浅层特征与深层特征相加,这样保证了,即使中间的运算得到的特征没有任何作用,那么这个深层网络也可以保证和浅层有相同的性能。然而实际的效果则出乎意料地好,因为skip connection的存在,每一个特征与特征相加的Block中间的卷积只需要拟合“残差”,剩余的可以跳过“skip”给更前面的。文章中提出了两个Block,一个是BasicBlock,一个则是BottleNeck Block,如下图:
![22cdfd30911198ed733783404b28c53f.png](https://i-blog.csdnimg.cn/blog_migrate/acd4fb6b46ae684e4cf48708d46dd460.jpeg)
其中,左边的是BasicBlock,用于少于50层的ResNet(通常是ResNet18、ResNet34);右边是BottleNeckBlock,用于大于等于50层ResNet(通常是ResNet50、ResNet101和ResNet152)。在较深的网络中BottleNeck会在参数上更加节约,然后还能保持性能的提升。值得注意的是在“add”操作前的卷积只需要在其后面加BN不需要Relu,而是在“add”后再Relu。整个网络结构如下图所示:
![9e2b4f778ef52ddf245d523fcb31023b.png](https://i-blog.csdnimg.cn/blog_migrate/ee62505bd41ac80cba1f3d74357c2472.jpeg)
原始的ResNet对于训练卷积神经网路做出了很大的贡献,但是同样也有着许多可以改进的地方。首先,在[1]发表后,很多后续研究[],[]表示,残差连接并不高效,从[1]中的原文也可以看到从ResNet50到ResNet152,top5-error降低了1%(top1-error连1%都没),但是FLOPs却增加了3倍左右。
(注:在之后的文章[6]以及torch框架中的Blog[8]中,ResNet50的top1-error为24.7%的,而下图则是在arxiv上得到)
![aab18ecf93c058048dd2668c73261c27.png](https://i-blog.csdnimg.cn/blog_migrate/b09f18cfeb0829ac18b30725601d4571.jpeg)
后续[3]提出,每一个Block中的卷积应该更宽,如下图(c):
![619cc25b3209f4f808287f0b2e5eba2a.png](https://i-blog.csdnimg.cn/blog_migrate/946ca8e296ae97afa6a956a5e5f1380b.jpeg)
但是这个作为对比只能说宽模型有更好的作用,因为在拓宽了模型后参数也变得更多了。但是仍然比较快。
![00724b905ca7f2d208d5f97d858d8308.png](https://i-blog.csdnimg.cn/blog_migrate/e061a560bc7cff137fc06abc8fe4c7de.jpeg)
总得来说这篇文章只是提出了一种可能性,说明了宽模型的作用。
ResNeXt[4]则同样由Kaiming组提出,在BottleNeck中的3x3 Conv用组卷积(Group Conv)的方式加入,并且提出了一个超参数“Cardinality”代表组卷积的组数。同时1x1 Conv的降维由原来的降成1/4变成降成1/2,再接3x3 Group Conv。这样保持了参数和浮点数的近似。
![15d1aaa438bf5bc4eb01ef2d5055bc84.png](https://i-blog.csdnimg.cn/blog_migrate/6434c01c9fb21c0280f5981675330a7f.jpeg)
结果表明与原模型相比有1%提升:
![e5f1bb8ed0f0614b3b82a9d9a41527ee.png](https://i-blog.csdnimg.cn/blog_migrate/11827c777997bcfd48297469eb4f36e6.jpeg)
在[1]发表后,Kaiming组又发表了Identity mapping[2]文章来探讨更深的残差网络的优化问题,提出了“pre-activation”的顺序,即进入每一个Block时先进行BatchNorm+ReLU后接Conv,这样每一次相加都是直接相加而不用接BN+ReLU,实验证明这样会使更深的网络,ResNet-1001变得容易优化,而且不容易过拟合。
![f92a6e399c884400165423b8070fb574.png](https://i-blog.csdnimg.cn/blog_migrate/189f2bfa1584d04889afacc037c4e589.jpeg)
最终的结果表示,使用带pre-activation的ResNet-200性能达到了sota,即比InceptionV3更好。
![43f69e3822bf77633fd5d0ab2b534f14.png](https://i-blog.csdnimg.cn/blog_migrate/de9f47b3d5d8b0fc89ead1ae1d3ba5af.jpeg)
但是这一个现象只有很深的网络才有效果,哪怕是ResNet-164,pre-activation和普通的结构性能并没有相差多少。
第一部分就写到这里吧,下半部分会写一下DarkNet53以及其它一些关于ResNet的改动。
- Deep residual learning for image recognition
- Identity Mappings in Deep Residual Networks
- Wide Residual Networks
- Aggregated Residual Transformations for Deep Neural Networks
- YOLOv3: An Incremental Improvement
- Bag of Tricks for Image Classification with Convolutional Neural Networks
- Dilated Residual Networks
- Torch | Training and investigating Residual Nets