resnet-50 pytorch之结构分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了resnet-50 pytorch之结构分析相关的知识,希望对你有一定的参考价值。

参考技术A 在pytorch中的torchvision封装了Resnet的源码,我们通过对源码的分析进一步了解ResNet网络结构,方便对以后对ResNet结构的理解,以及日后搭建自己的网络,或者修改别人的网络。

首先我们需要先了解ResNet系列的网络结构。

从源码中我们可以看到他直接引入了 Bottleneck 后边接了 3,4,6,3 层从上图中可以看到

在ResNet中ResNet50 的结构在 conv2_x 中有三个 卷积层的堆叠
当然同理在 conv3_ 中有4个卷积层的堆叠,在ResNet中将卷积层分为4个大层,也就是[3,4,6,3]分别代表每个大层中卷积的重复次数

总共是 层

不过这里涉及到了一个 Bottleneck 类,可以把一个 Bottleneck 当成一个基础的block就是对应上图中 卷积核大小的组合

在论文中数据首先进入的是一个卷积和一个池化层后出来的就是个56* 56 *64的大小的图片了,这样就再进入到一个大层中。

因此在输入到 Bottleneck 之前得到一个56(height)* 56(weight) * 64(channel)大小的 feature map

根据源码中我们可以看到1 *1 的卷积核以及3 * 3 的卷积核都不会改变输入的 feature map 的大小

下面看一下 Bottleneck 的 forward 函数

在downsample,因为 feature map 的大小不会改变,但是经过 Bottleneck 后他的 channel 变成原来的4倍,因此想要和原来的 feature map 相加,需要将原来的 feature map 也变为原来的4倍, downsample 的作用就是为了保持当前的维度是一样的方便进行计算。

Resnet 也是由 __init__ 和 forward 构成
为了方便分析 这里首先分析 init 函数,在 init 中最重要的是 _make_layer 函数
以 layer1 为例

block 为 Bottleneck , planes=64 (即 channel 数目) blocks=3 ([3,4,6,3] 分别代表每一层的 blocks 数目)这里要注意 layer1 的 stride 为 1 其他layer的 stride 为 2

对于 layer1 而言

因此需要经过 downsample 才能够使得残差和经过该层的 feature map 能够相加, downsample 即为右路部分

主体分支

downsample 分支

更新 inplanes=64*4

其余的都是一样的我们可以看到他的结构

forward

以上是关于resnet-50 pytorch之结构分析的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch CIFAR10图像分类 ResNet篇

Pytorch Note31 深度残差网络 ResNet

森说AI:用paddle2.x完成resnet50模型转写并实现前向对齐

pytorch搭建ResNet50实现鸟类识别

图像分类案例 ResNet50 鸟类图像4分类,附Pytorch完整代码

如何使用 Pytorch 中的预训练权重修改具有 4 个通道作为输入的 resnet 50?