https://zhuanlan.zhihu.com/p/349717627

ResNet与残差块

深度卷积网络的瓶颈:
理论上,增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时可以取得更好的结果。但VGG、GoogLeNet等网络单纯增加层数遇到了一些瓶颈:简单增加卷积层,训练误差不但没有降低,反而越来越高。在CIFAR-10、ImageNet等数据集上,单纯叠加3×3卷积,何恺明等[1]人发现,训练和测试误差都变大了。这主要是因为深层网络存在着梯度消失或者爆炸的问题,模型层数越多,越难训练。

残差块:

但是神经网络的ReLU激活函数恰恰不能保证“什么都不学习”。残差网络的初衷就是尽量让模型结构有“什么都不做”的能力,这样就不会因为网络层数的叠加导致梯度消失或爆炸。
现有H(x) = F(x)+x, 只要F(x)=0,那么H(x)=x,H(x)就是恒等映射,也就是有了“什么都不做”的能力。ResNet基于这一思想提出了一种残差网络的结构,其中输入x可以传递到输出,传递的过程被称为ShortCut
同时,下图里有两个权重层,即F(x)部分。假如“什么都不学习”是最优的,或者说H(x)=x是最优的,那么理论上来说,F(x)学习到的目标值为0即可;如果H(x)=x不是最优,那么基于神经网络强大的学习能力,F(x)可以尽可能去拟合我们期望的值。

BasicBlock

ResNet中使用的一种网络结构,在resnet18和resnet34中使用了BasicBlock:
输入输出通道数均为64,残差基础块中两个3×3卷积层参数量是:

BasicBlock类中计算了残差,该类继承了nn.Module。

class BasicBlock(nn.Module):expansion = 1def __init__(self, inplanes, planes, stride=1, downsample=None):super(BasicBlock, self).__init__()self.conv1 = conv3x3(inplanes, planes, stride)self.bn1 = nn.BatchNorm2d(planes)self.relu = nn.ReLU(inplace=True)self.conv2 = conv3x3(planes, planes)self.bn2 = nn.BatchNorm2d(planes)self.downsample = downsampleself.stride = stridedef forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)if self.downsample is not None:identity = self.downsample(x)out += identityout = self.relu(out)return out

bottleNeck

ResNet-34核心部分均使用3×3卷积层,总层数相对没那么多,对于更深的网络,作者们提出了另一种残差基础块。(在resnet50、resnet101、resnet152使用了Bottlenect构造网络.)

Bottleneck Block中使用了1×1卷积层。如输入通道数为256,1×1卷积层会将通道数先降为64,经过3×3卷积层后,再将通道数升为256。1×1卷积层的优势是在更深的网络中,用较小的参数量处理通道数很大的输入。

Bottleneck Block中,输入输出通道数均为256,残差基础块中的参数量是:

BasicBlock比较,使用1×1卷积层,参数量减少了。当然,使用这样的设计,也是因为更深的网络对显存和算力都有更高的要求,在算力有限的情况下,深层网络中的残差基础块应该减少算力消耗。


代码:

class Bottleneck(nn.Module):expansion = 4def __init__(self, inplanes, planes, stride=1, downsample=None):super(Bottleneck, self).__init__()self.conv1 = conv1x1(inplanes, planes)self.bn1 = nn.BatchNorm2d(planes)self.conv2 = conv3x3(planes, planes, stride)self.bn2 = nn.BatchNorm2d(planes)self.conv3 = conv1x1(planes, planes * self.expansion)self.bn3 = nn.BatchNorm2d(planes * self.expansion)self.relu = nn.ReLU(inplace=True)self.downsample = downsampleself.stride = stridedef forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:identity = self.downsample(x)out += identityout = self.relu(out)return out

【pytorch系列】ResNet中的BasicBlock与bottleneck相关推荐

  1. 图像分类篇:pytorch实现ResNet

    一.ResNet详解 ResNet网络是在2015年由微软实验室提出的,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名,获得COCO数据集中目标检测第一名,图像分类第一名. 在ResNe ...

  2. 通过和resnet18和resnet50理解PyTorch的ResNet模块

    文章目录 模型介绍 resnet18模型流程 总结 resnet50 总结 resnet和resnext的框架基本相同的,这里先学习下resnet的构建,感觉高度模块化,很方便.本文算是对 PyTor ...

  3. PyTorch系列 (二): pytorch数据读取自制数据集并

    PyTorch系列 (二): pytorch数据读取 PyTorch 1: How to use data in pytorch Posted by WangW on February 1, 2019 ...

  4. [Pytorch系列-42]:工具集 - torchvision常见预训练模型的下载地址

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

  5. CV 经典主干网络 (Backbone) 系列: ResNet变种

    CV 经典主干网络 (Backbone) 系列: ResNet变种 该篇是 CV 经典主干网络 (Backbone) 系列 下的一篇文章. ResNet 出来后,大家又基于 ResNet 提出了很多改 ...

  6. 【模型解读】resnet中的残差连接,你确定真的看懂了?

    文章首发于微信公众号<与有三学AI> [模型解读]resnet中的残差连接,你确定真的看懂了? 这是深度学习模型解读第6篇,本篇我们将介绍深度学习模型中的残差连接. 作者&编辑 | ...

  7. keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)...

    引自:http://blog.csdn.net/sinat_26917383/article/details/72859145 中文文档:http://keras-cn.readthedocs.io/ ...

  8. PyTorch 1.4 中文文档校对活动正式启动 | ApacheCN

    一如既往,PyTorch 1.4 中文文档校对活动启动了! 认领须知 请您勇敢地去翻译和改进翻译.虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错--在大部分情况下,我们的 ...

  9. PyTorch 1.2 中文文档校对活动 | ApacheCN

    整体进度:https://github.com/apachecn/pytorch-doc-zh/issues/422 贡献指南:https://github.com/apachecn/pytorch- ...

最新文章

  1. python 管道游戏_Python实现超级玛丽游戏系列教程05添加地面,管道和阶梯冲突检测...
  2. c语言航班订票管理系统源代码,简易C语言航空订票系统
  3. 科大星云诗社动态20201221
  4. #3601. 一个人的数论
  5. c语言flappy bird代码,Flappy bird源代码(略吊)
  6. 多域名证书的签名和自签名流程
  7. csdn 登录经常卡住无法登录
  8. Java显示smart3d数据_Smart3D系列教程 | smart3d空三错乱的解决办法
  9. 读懂职场则规潜 潜伏者的上位秘诀
  10. U盘转换NTFS格式
  11. AspectJ自定义注解报错:error Type referred to is not an annotation type:xxx -----IllegalArgumentException
  12. 炸!亚马逊将解散与印度亿万富翁的合资企业;eBay推迟公布2021年Q2财报;TikTok在英国进行测试电商功能…|洞悉跨境
  13. Qt tableview
  14. Blogbus博客*
  15. Ubantu18.04安装 双系统 win10 SSD+HHD DELL笔记本
  16. 标签传播算法(LPA)
  17. 盒子阴影 – box-shadow
  18. android alarmmanager 收不到广播,关于安卓AlarmManager定时会失效的问题,请指点
  19. 4399移动产品经理:海量关键词优化策略
  20. 计算机网络——第三章

热门文章

  1. 澳大利亚史上最大数据泄露事件,40%的居民信息被泄露
  2. 数据分析步骤——《谁说菜鸟不会数据分析》的总结
  3. vs好用吗?vs2022下载。
  4. java的强类型语言与JavaScript(js)的弱类型语言
  5. Excel 2010 SQL应用097 聚合函数之方差或标准方差
  6. 海康 综合安防管理平台 对接
  7. python爬取网易云某一歌手的音乐评论
  8. python裂缝检测_基于卷积神经网络的高楼外墙裂缝检测系统
  9. 地下管线三维建模痛点分析与优化
  10. 计算机设计大赛志愿服务活动,中国大学生计算机设计大赛 | 志愿者招募