转载自:https://zhuanlan.zhihu.com/p/79378841,本文只做个人记录学习使用,版权归原作者所有。

今天回顾了ResNet的论文Deep Residual Learning for Image Recognition,又结合PyTorch官方代码,整理一遍ResNet的结构,在这里写个总结。

首先,ResNet在PyTorch的官方代码中共有5种不同深度的结构,深度分别为18、34、50、101、152(各种网络的深度指的是“需要通过训练更新参数”的层数,如卷积层,全连接层等),和论文完全一致。图1是论文里给出每种ResNet的具体结构:

图1 不同深度ResNet的具体结构

其中,根据Block类型,可以将这五种ResNet分为两类:(1) 一种基于BasicBlock,浅层网络ResNet18, 34都由BasicBlock搭成;(2) 另一种基于Bottleneck,深层网络ResNet50, 101, 152乃至更深的网络,都由Bottleneck搭成。Block相当于积木,每个layer都由若干Block搭建而成,再由layer组成整个网络。每种ResNet都是4个layer(不算一开始的7×7 7\times77×7卷积层和3×3 3\times33×3maxpooling层),如图1,conv2_x对应layer1,conv3_x对应layer2,conv4_x对应layer3,conv5_x对应layer4。方框中的“×2 \times2×2”、“×3 \times3×3”等指的是该layer由几个相同的结构组成。

下面借ResNet18和ResNet50两种结构分别介绍BasicBlock和Bottleneck。

1. Block前面的层

为了结构的完整性,我们有必要从网络最浅层开始讲起:

图2

首先说明,为了便于理解,本文所有图只包含卷积层和pooling层,而BN层和ReLU层等均未画出。然后说明图中部分符号的含义:

输入输出用椭圆形表示,中间是输入输出的尺寸:channel×height×width

直角矩形框指的是卷积层或pooling层,如“3×3,64,stride=2,padding=3 3 \times 3, 64, stride = 2, padding = 33×3,64,stride=2,padding=3”指该卷积层kernel size为3×3 3 \times 33×3,输出channel数为64,步长为2,padding为3。矩形框代表的层种类在方框右侧标注,如“conv1”。

这些都了解之后,图中所示结构就已经很清楚了,顺便提一句,卷积层的输出尺寸(单边)是这么计算的:

以conv1为例,input_size=224,padding=3,kernel_size=7,stride=2 input\_size=224, padding=3, kernel\_size=7, stride=2input_size=224,padding=3,kernel_size=7,stride=2。将它们带入公式,发现除不尽,所以前面的除法准确地说是求商。可以得出output_size=112 output\_size=112output_size=112。下面的max pooling类似,求得output_size=56 output\_size=56output_size=56,不再赘述。

2. ResNet18

2.1 layer1

图3 ResNet18 layer1

layer1的结构比较简单,没有downsample,各位看图即可理解。图中方框内便是BasicBlock的主要结构——两个3×3 3 \times 33×3卷积层。每个layer都由若干Block组成,又因为layer1的两个block结构完全相同,所以图中以“×2 \times 2×2”代替,各位理解就好。

2.2 layer2

layer2和layer1就有所不同了,首先64×56×56 64\times56\times5664×56×56的输入进入第1个block的conv1,这个conv1的stride变为2,和layer1不同(图4红圈标注),这是为了降低输入尺寸,减少数据量,输出尺寸为128×28×28 128\times28\times28128×28×28。

到第1个block的末尾处,需要在output加上residual,但是输入的尺寸为64×56×56 64\times56\times5664×56×56,所以在输入和输出之间加一个 1×1 1\times11×1卷积层,stride=2(图4红圈标注),作用是使输入和输出尺寸统一,(顺带一提,这个部分就是PyTorch ResNet代码中的downsample)

由于已经降低了尺寸,第2个block的conv1的stride就设置为1。由于该block没有降低尺寸,residual和输出尺寸相同,所以也没有downsample部分。

2.3 layer3-4

layer3和layer4结构和layer2相同,无非就是通道数变多,输出尺寸变小,就不再赘述。

ResNet18和34都是基于Basicblock,结构非常相似,差别只在于每个layer的block数。

3. ResNet50

3.1 layer 1

图5 ResNet50 layer1

和Basicblock不同的一点是,每一个Bottleneck都会在输入和输出之间加上一个卷积层,只不过在layer1中还没有downsample,这点和Basicblock是相同的。至于一定要加上卷积层的原因,就在于Bottleneck的conv3会将输入的通道数扩展成原来的4倍,导致输入一定和输出尺寸不同。

layer1的3个block结构完全相同,所以图中以“×3 \times 3×3”代替。

3.2 layer 2

图6 ResNet50 layer2

尺寸为256×56×56 256\times56\times56256×56×56的输入进入layer2的第1个block后,首先要通过conv1将通道数降下来,之后conv2负责将尺寸降低(stride=2,图6从左向右数第2个红圈标注)。到输出处,由于尺寸发生变化,需要将输入downsample,同样是通过stride=2的1×1 1\times11×1卷积层实现。

之后的3个block(layer2有4个block)就不需要进行downsample了(无论是residual还是输入),如图6从左向右数第3、4个红圈标注,stride均为1。因为这3个block结构均相同,所以图6中用“×3 \times 3×3”表示。

3.3 layer3-4

layer3和layer4结构和layer2相同,无非就是通道数变多,输出尺寸变小,就不再赘述。

ResNet50、101和152都是基于Basicblock,结构非常相似,差别只在于每个layer的block数。

ResNet网络结构分析相关推荐

  1. [人工智能-深度学习-33]:卷积神经网络CNN - 常见分类网络- LeNet网络结构分析与详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  2. YOLO v3 网络结构分析

    YOLO v3 网络结构分析 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, -.问题或建议,请公众号留言; 最近在看Tensorflow,没有经过实践的学习总感觉很心虚, ...

  3. ResNet网络的训练和预测

    ResNet网络的训练和预测 简介 Introduction 图像分类与CNN 图像分类 是指将图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法,是计算机视觉中其他任务,比如目标检测 ...

  4. CV之IG:基于CNN网络架构+ResNet网络进行DIY图像生成网络

    CV之IG:基于CNN网络架构+ResNet网络进行DIY图像生成网络 目录 设计思路 实现代码 设计思路 实现代码 # 定义图像生成网络:image, training,两个参数# Less bor ...

  5. 使用resNet网络 进行图像分类(jupyter notebook)

    这学期做了三次的CV把他贴出来, resNet网络的结构 import torch.nn as nn import torchclass BasicBlock(nn.Module):expansion ...

  6. ResNet网络详解与keras实现

    ResNet网络详解与keras实现 ResNet网络详解与keras实现 Resnet网络的概览 Pascal_VOC数据集 第一层目录 第二层目录 第三层目录 梯度退化 Residual Lear ...

  7. ResNet网络简单理解与代码

    ResNet网络提出的文章是<Deep Residual Learning for Image Recognition> 下载地址:https://arxiv.org/pdf/1512.0 ...

  8. ResNet网络详解

    ResNet ResNet在2015年由微软实验室提出,斩获当年lmageNet竞赛中分类任务第一名,目标检测第一名.获得coco数据集中目标检测第一名,图像分割第一名. ResNet亮点 1.超深的 ...

  9. ResNet网络的改进版:ResNeXt

    之前的文章讲过ResNet网络的基本架构,其本质就是让网络的学习目的从学习 转为学习 ,也就是学习输入和输出之间的残差信息,从而缓解了梯度消失和网络退化问题. 本文讲下ResNet网络的改进版:Res ...

最新文章

  1. 积跬步,聚小流------ps有用小技巧,改变png图标颜色
  2. python简单入门_Python简明入门教程
  3. poj 2201(RMQ+笛卡尔树)
  4. web前端怎么获取cookie?新手前端开发者需了解
  5. ASP.Net Core WebApi几种版本控制对比
  6. 2020河南工业大学计算机考研科目,你知道2020年河南工业大学硕士研究生考研有哪些复试科目...
  7. 6.824 RPC lesson2 2020(一)
  8. python内置函数分类_Python 69个内置函数分类总结
  9. 请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?...
  10. 【dp】POJ-2817
  11. 基于Lumisoft.NET组件开发碰到乱码等一些问题的解决
  12. 20150409作业3 阅读《构建之法》1-5章
  13. 开源大数据周刊-第90期
  14. P2756 飞行员配对方案问题【二分匹配】【网络流Dinic、EK详解】【萌新初写】
  15. android手机邮件Exchange账户的设置
  16. 【Babel】1186- 保姆级教学!这次一定学会 Babel 插件开发!
  17. 仓库系统用什么服务器,什么是仓库管理saas系统 仓库管理saas系统的功能有哪些...
  18. 下载keep运动软件_Keep健身软件官方最新版下载-Keep健身软件下载v6.40.0安卓版-西西软件下载...
  19. 像素、移动端网页——CSS
  20. 字符串——删除字符串中的大写字母

热门文章

  1. Js广告_全屏漂浮广告效果
  2. 2020中国白酒轻奢消费趋势白皮书
  3. php 访问php_PHP的美味邪恶
  4. 倾斜摄影的无人机拍摄的注意事项
  5. 一个很很很简单的移动端日历
  6. 岭北之役:徐达的莫大苦楚
  7. 启动docker容器
  8. 广泛使用的PID算法
  9. 解决:全局引用了低版本的avue,而有些功能却在后续版本才有的问题
  10. [Linux] 执行crontab -e报错:/tmp/crontab.hTTt2M: Permission denied