resnet50结构分析(ResNet50模型计算过程详解)

resnet迄今为止,仍然是最佳的backbone.

resnet的全称为深度残差网络,Deep Residual Network

在resnet的论文Deep Residual Learning for Image Recognition中,作者给出了这样几个模型:resnet18,resnet34,resnet50,resnet101,resnet152.

这些模型,都是由使用残差模块residual block构成的,不然为什么叫做residual network 呢?

那么resnet中的残差模块residual block是怎样的呢?

其实resnet中有两种残差模块:basic residual block 和 和 bottleneck residual block,如下图所示:

左边为basic residual block,右边为bottleneck residual block。

在resnet18,resnet34中,使用的是左边的basic residual block

在resnet50,resnet101,resnet152中使用的是右边的bottleneck residual block.

上一篇文章中我们详细介绍了resnet18的计算过程。

这篇文章主要详细介绍resnet50的计算过程。

如论文中的 Table-1所示,resnet50的模型结构是表中的第5列。

给一张224x224x3的图片img,我们输入到resnet50模型,看看它是如何得到模型输出的。

我们先把图片矩阵变换为:3x224x224

3x224x224的img

经过kernel_size=7,in_channel=3,output_channel=64,stride=2,padding=3的same卷积,bn,relu得到64x112x112的feature map

接着经过kernel_size=3,stride=2的map pooling,得到64x56x56的feature map: F4

接着就开始经过(3+4+6+3=16)16个bottleneck residual block。这16个bottleneck residual block中,前3个的3×3卷积的channel数为64,接着的4个bottlneck residual block中的3×3卷积的channel数为128,接着的6个bottleneck residual block中的3×3卷积的channel数为256,最后4个bottleneck residual block中的 3×3卷积的channel数为512。

得到F4后,将其输入到bottleneck residual block中,得到256x56x56的feature map:F5

从F4到F5的计算过程,就是bottleneck residual block中的计算过程,详细如下:

F4经过kernel size = 1,in_channel=64,out_channel=64,stride=1的卷积,bn,relu,得到64x56x56的feature map.

接着经过一个kernel size=3,in_channel=64,out_channel=64的卷积,bn,relu,得到64x56x56的feature map.

接着经过一个kernel size=3,in_channel=64,out_channel=256的卷积,bn得到256x56x56的feature map:F4_1

将F4经过一个kernel size=1,in_channel=64,out_channel=256,stride=1的卷积,bn得到256x56x56的feature map:F4_2

F4_1+F4_2后,再经过激活函数relu得到256x56x56 的 F5

这就是一个典型的经典的bottleneck residual block的计算过程。
这里面有一个细节要注意:当F4和F4_1的维度不相等时,我们就用一个1×1的卷积,将F4进行维度变换得到F4_2. 保证F4_2在feature map 的size和channel都与F4_1相等时,再将F4_1+F4_2,再经过relu得到F5

如果F4和F4_1在size 和 维度都相等时,F4_2=F4,然后进行 F4_1+F4_2,经过relu得到 F5.

从64x56x56的F4到256x56x56的F5,就是我们16个bottleneck residual block的第1个block.

F5经过第2个bottleneck residual block得到256x56x56 的 F6,

详细过程:

F5经过kernel size = 1,in_channel=256,out_channel=64,stride=1的卷积,bn,relu,得到64x56x56的feature map.

接着经过一个kernel size=3,in_channel=64,out_channel=64的卷积,bn,relu,得到64x56x56的feature map.

接着经过一个kernel size=3,in_channel=64,out_channel=256的卷积,bn得到256x56x56的feature map:F5_1

F5_1+F5后,再经过激活函数relu得到256x56x56 的 F6

这一步我们没有对F5进行维度变换得到F5_2,因为F5与F5_1维度相同,可以直接相加

这是我们16个 bottleneck residual block中的第2个block.

F6经过第3个 bottleneck residual block,得到256x56x56 的 F7

详细过程:

F6经过kernel size = 1,in_channel=256,out_channel=64,stride=1的卷积,bn,relu,得到64x56x56的feature map.

接着经过一个kernel size=3,in_channel=64,out_channel=64的卷积,bn,relu,得到64x56x56的feature map.

接着经过一个kernel size=3,in_channel=64,out_channel=256的卷积,bn得到256x56x56的feature map:F6_1

F6_1+F6后,再经过激活函数relu得到256x56x56 的 F7

注意到,前3个bottleneck residula block中的3×3的卷积的in_channel=out_channel=64,由于这3个 bottleneck residula block中3×3卷积的channel数是一样的,我们通常把他们3个 block合称为resnet50的block1,或者conv2_x,或者layer1.

F7经过第4个bottleneck residual block, 得到512x28x28 的 F8

详细如下:

F7经过kernel size = 1,in_channel=256,out_channel=128,stride=2的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=3,in_channel=128,out_channel=128的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=1,in_channel=128,out_channel=512的卷积,bn得到512x28x28的feature map:F7_1

将F7经过一个kernel size=1,in_channel_256,out_channel=512,stride=2的卷积,bn得到512x28x28的feature map:F7_2

F7_1+F7_2后,再经过激活函数relu得到512x28x28的feature map F8

F8经过第5个bottleneck residual block, 得到512x28x28的F9

详细如下:

F8经过kernel size = 1,in_channel=512,out_channel=128,stride=1的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=3,in_channel=128,out_channel=128的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=1,in_channel=128,out_channel=512的卷积,bn得到512x28x28的feature map:F8_1

F8_1+F8后,再经过激活函数relu得到512x28x28的 feature map F9

F9经过第6个bottleneck residual block, 得到512x28x28的F10

详细如下:

F9经过kernel size = 1,in_channel=512,out_channel=128,stride=1的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=3,in_channel=128,out_channel=128的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=1,in_channel=128,out_channel=512的卷积,bn得到512x28x28的feature map:F9_1

F9_1+F9后,再经过激活函数relu得到512x28x28的 feature map F10

F10经过第7个bottleneck residual block, 得到512x28x28的F11

详细如下:

F10经过kernel size = 1,in_channel=512,out_channel=128,stride=1的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=3,in_channel=128,out_channel=128的卷积,bn,relu,得到128x28x28的feature map.

接着经过一个kernel size=1,in_channel=128,out_channel=512的卷积,bn得到512x28x28的feature map:F8_1

F10_1+F10后,再经过激活函数relu得到512x28x28的 feature map F11

注意到,这4个bottleneck residula block中的3×3的卷积的in_channel=out_channel=128,由于这3个 bottleneck residula block中3×3卷积的channel数是一样的,我们通常把他们3个 block合称为resnet50的block2,或者conv3_x,或者layer2.

F11经过第8个bottleneck residual block, 得到1024x14x14的F12

详细如下:

F11经过kernel size = 1,in_channel=512,out_channel=256,stride=2的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=3,in_channel=256,out_channel=256的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=1,in_channel=256,out_channel=1024的卷积,bn得到1024x14x14的feature map:F11_1

将F11经过一个kernel size=1,in_channel=512,out_channel=1024,stride=2的卷积,bn得到1024x14x14的feature map:F11_2

F11_1+F11_2后,再经过激活函数relu得到1024x14x14的F12

F12经过第9个bottleneck residual block, 得到1024x14x14的F13

详细如下:

F12经过kernel size = 1,in_channel=1024,out_channel=256,stride=1的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=3,in_channel=256,out_channel=256的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=1,in_channel=256,out_channel=1024的卷积,bn得到1024x14x14的feature map:F12_1

F12_1+F12后,再经过激活函数relu得到1024x14x14的F13

F13经过第10个bottleneck residual block, 得到1024x14x14的F14

详细如下:

F13经过kernel size = 1,in_channel=1024,out_channel=256,stride=1的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=3,in_channel=256,out_channel=256的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=1,in_channel=256,out_channel=1024的卷积,bn得到1024x14x14的feature map:F13_1

F13_1+F13后,再经过激活函数relu得到1024x14x14的F14

F14经过第11个bottleneck residual block, 得到1024x14x14的F15

详细如下:

F14经过kernel size = 1,in_channel=1024,out_channel=256,stride=1的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=3,in_channel=256,out_channel=256的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=1,in_channel=256,out_channel=1024的卷积,bn得到1024x14x14的feature map:F14_1

F14_1+F14后,再经过激活函数relu得到1024x14x14的F15

F15经过第12个bottleneck residual block, 得到1024x14x14的F16

详细如下:

F15经过kernel size = 1,in_channel=1024,out_channel=256,stride=1的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=3,in_channel=256,out_channel=256的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=1,in_channel=256,out_channel=1024的卷积,bn得到1024x14x14的feature map:F15_1

F15_1+F15后,再经过激活函数relu得到1024x14x14的F16

F16经过第13个bottleneck residual block, 得到1024x14x14的F17

详细如下:

F16经过kernel size = 1,in_channel=1024,out_channel=256,stride=1的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=3,in_channel=256,out_channel=256的卷积,bn,relu,得到256x14x14的feature map.

接着经过一个kernel size=1,in_channel=256,out_channel=1024的卷积,bn得到1024x14x14的feature map:F11_1

F16_1+F16后,再经过激活函数relu得到1024x14x14的F17

注意到,这6个bottleneck residula block中的3×3的卷积的in_channel=out_channel=256,由于这3个 bottleneck residula block中3×3卷积的channel数是一样的,我们通常把他们3个 block合称为resnet50的block3,或者conv4_x,或者layer3.

F17经过第14个bottleneck residual block, 得到2048x7x7的F18

详细如下:

F17经过kernel size = 1,in_channel=1024,out_channel=512,stride=2的卷积,bn,relu,得到512x7x7的feature map.

接着经过一个kernel size=3,in_channel=512,out_channel=512的卷积,bn,relu,得到512x7x7的feature map.

接着经过一个kernel size=1,in_channel=512,out_channel=2048的卷积,bn得到512x7x7的feature map:F17_1

将F17经过一个kernel size=1,in_channel=1024,out_channel=2048,stride=2的卷积,bn得到2048x7x7的feature map:F17_2

F17_1+F17_2后,再经过激活函数relu得到2048x7x7的F18

F18经过第15个bottleneck residual block, 得到2048x7x7的F19

详细如下:

F18经过kernel size = 1,in_channel=2048,out_channel=512,stride=1的卷积,bn,relu,得到512x7x7的feature map.

接着经过一个kernel size=3,in_channel=512,out_channel=512的卷积,bn,relu,得到512x7x7的feature map.

接着经过一个kernel size=1,in_channel=512,out_channel=2048的卷积,bn得到512x7x7的feature map:F18_1

F18_1+F18后,再经过激活函数relu得到2048x7x7的F19

F19经过第16个bottleneck residual block, 得到2048x7x7的F20

详细如下:

F19经过kernel size = 1,in_channel=2048,out_channel=512,stride=1的卷积,bn,relu,得到512x7x7的feature map.

接着经过一个kernel size=3,in_channel=512,out_channel=512的卷积,bn,relu,得到512x7x7的feature map.

接着经过一个kernel size=1,in_channel=512,out_channel=2048的卷积,bn得到512x7x7的feature map:F19_1

F19_1+F19后,再经过激活函数relu得到2048x7x7的F20

注意到,16个中的最后这3个bottleneck residula block中的3×3的卷积的in_channel=out_channel=512,由于这3个 bottleneck residula block中3×3卷积的channel数是一样的,我们通常把他们3个 block合称为resnet50的block4,或者conv5_x,或者layer4.

1024x7x7的F20,经过average pool 得到1024x1x1 的F21

F21经过 1024×1000的fc ,再经过bn,softmax输出1000类的概率值。

(0)
打赏 微信扫一扫 微信扫一扫

相关推荐

本文内容由互联网用户自发贡献,该文观点仅代表作者本人,不代表万网时代立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qulianxi@foxmail.com 举报,一经查实,本站将立刻删除。