残差网络的基本原理

上图即为残差网络的基本原理:

F(x)=H(x)-x,x为浅层输出,H(x)为深层的输出,F(x)为二者中间的两层变换。当浅层的x代表的特征已经足够成熟,如果任何对于x的改变都会让损失变大的话,F(x)会自动趋向于学习为0,x则从恒等映射的路径继续传递。这样在不增加计算成本的情况下实现了这一目的:当浅层的输出已经足够成熟,让深层网络后面的层能够实现恒等映射的作用。

残差网络的基本模块实现

上图中是残差网络中两个最基本的模块,论文中分别命名为“buiding block”和"bottleneck",分别应用于浅层(18和34)残差网络和深层(50、101和152层)残差网络中。

首先定义3*3卷积操作

def conv3x3(in_planes, out_planes, stride=1): return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False)

building block的pytorch实现:

class BasicBlock(nn.Module): expansion = 1 def __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 = downsample self.stride = stride def forward(self, x): residual=x out=self.conv1(x) out=self.bn1(out) out=self.relu(out) out=self.bn2(out) out=self.bn2(out) if self.downsample is not None: residual=self.downsample(x) out+=residual out=self.relu(out) return out

bottleneck的pytorch实现:

class Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, stride=1, downsample=None): super(Bottleneck, self).__init__() self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, stride=stride, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(planes * 4) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = 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: residual = self.downsample(x) out += residual out = self.relu(out) return out

block模块:具有2个卷积层,均为3*3卷积,后一个卷积层输入和输出的通道数相同

bottleneck模块:具有3个卷积层,第1和第3个均为1*1卷积,用于改变通道数;第二个为3*3卷积,该层输入和输出的通道数相同;第三个卷积层输出的通道数为输入的4倍。

在两个模块中,前面的卷积层的输出后进行都直接加1个relu层,只有最后一个卷积层和原输入x相加后再加一个relu层。

在以上实现中有两个需要注意的问题

  1. 在每个模块中,均有一个downsample操作,这是为了防止x和F(x)相加中通道数目不匹配所采取1*1的卷积操作。若x和F(x)通道数目一致,则downsample是空操作(None),如不一致,则为1*1的卷积操作。
  2. 在两个模块中均有一个expansion变量(block模块中值为1,bottleneck模块中值为4)。模块输出的通道数目为planes*expansion

残差网络的整体架构

图中是论文中给出的resnet-34。整个残差网络可分为:

  1. 一个7*7卷积层,该层输入通道数是3(原图的RGB三通道),输出通道数是64,同时stride=2,即分辨率下降一半;
  2. 一个最大值池化层,stride=2,同样分辨率下降一半;
  3. 残差层,可分为4个stage,同一stage内通道数目相同。在上图中,出现虚线时表明,进入了下一个stage。虚线模块完成了分辨率减少1/2(卷积时stride=2),同时通道数目增加1倍的操作,同时在虚线模块内downsample不为空,其他实线模块downsample为空。
  4. 一个平均池化层,stride=1;
  5. 全连接层

根据上述分析,残差网络实现代码为

class ResNet(nn.Module): def __init__(self, block, layers, num_classes=1000): self.inplanes = 64 super(ResNet, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False) self.bn1 = nn.BatchNorm2d(64) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=0, ceil_mode=True) # change self.layer2 = self._make_layer(block, 128, layers[1], stride=2) self.layer3 = self._make_layer(block, 256, layers[2], stride=2) self.layer4 = self._make_layer(block, 512, layers[3], stride=2) self.avgpool = nn.AvgPool2d(7) self.fc = nn.Linear(512 * block.expansion, num_classes) for m in self.modules(): if isinstance(m, nn.Conv2d): n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels m.weight.data.normal_(0, math.sqrt(2. / n)) elif isinstance(m, nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() def _make_layer(self, block, planes, blocks, stride=1): downsample = None if stride != 1 or self.inplanes != planes * block.expansion: downsample = nn.Sequential( nn.Conv2d(self.inplanes, planes * block.expansion, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(planes * block.expansion),) layers = [] layers.append(block(self.inplanes, planes, stride, downsample)) self.inplanes = planes * block.expansion for i in range(1, blocks): layers.append(block(self.inplanes, planes)) return nn.Sequential(*layers) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.maxpool(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = x.view(x.size(0), -1) x = self.fc(x) return x

具体的残差网络实现

建立resnet类以后,残差网络就非常容易实现了。典型的残差网络有18层、34层、50层、101层和152层几种,网络架构如下图所示

具体实现代码为

18层残差网络

def resnet18(pretrained=False): """Constructs a ResNet-18 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(BasicBlock, [2, 2, 2, 2]) if pretrained: model.load_state_dict(model_zoo.load_url(model_urls['resnet18'])) return model

34层残差网络

def resnet34(pretrained=False): """Constructs a ResNet-34 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(BasicBlock, [3, 4, 6, 3]) if pretrained: model.load_state_dict(model_zoo.load_url(model_urls['resnet34'])) return model

50层残差网络

def resnet50(pretrained=False): """Constructs a ResNet-50 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(Bottleneck, [3, 4, 6, 3]) if pretrained: model.load_state_dict(model_zoo.load_url(model_urls['resnet50'])) return model

101层残差网络

def resnet101(pretrained=False): """Constructs a ResNet-101 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(Bottleneck, [3, 4, 23, 3]) if pretrained: model.load_state_dict(model_zoo.load_url(model_urls['resnet101'])) return model

152层残差网络

def resnet152(pretrained=False): """Constructs a ResNet-152 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(Bottleneck, [3, 8, 36, 3]) if pretrained: model.load_state_dict(model_zoo.load_url(model_urls['resnet152'])) return model

bottleneck resnet网络_Detection学习之四-利用pytorch实现resnet相关推荐

  1. 深度学习 Day28——利用Pytorch实现好莱坞明星识别

    深度学习 Day28--利用Pytorch实现好莱坞明星识别 文章目录 深度学习 Day28--利用Pytorch实现好莱坞明星识别 一.前言 二.我的环境 三.前期工作 1.导入依赖项设置GPU 2 ...

  2. ResNet网络详解并使用pytorch搭建模型、并基于迁移学习训练

    1.ResNet网络详解 网络中的创新点: (1)超深的网络结构(突破1000层) (2)提出residual模块 (3)使用Batch Normalization加速训练(丢弃dropout) (1 ...

  3. 基于python实现resnet_【深度学习】基于Pytorch的ResNet实现

    1. ResNet理论 残差学习基本单元: 在ImageNet上的结果: 效果会随着模型层数的提升而下降,当更深的网络能够开始收敛时,就会出现降级问题:随着网络深度的增加,准确度变得饱和(这可能不足为 ...

  4. 【深度学习】——利用pytorch搭建一个完整的深度学习项目(构建模型、加载数据集、参数配置、训练、模型保存、预测)

    目录 一.深度学习项目的基本构成 二.实战(猫狗分类) 1.数据集下载 2.dataset.py文件 3.model.py 4.config.py 5.predict.py 一.深度学习项目的基本构成 ...

  5. python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片

    本篇博文在编写时参考了http://cuiqingcai.com/2652.html,向作者表示感谢 一.新的问题与工具 平时在淘宝上剁手的时候,总是会看到各种各样的模特.由于自己就读于一所男女比例三 ...

  6. 利用Pytorch实现ResNeXt网络

    目  录 1 ResNeXt网络介绍 1.1 组卷积 1.2 block 1.3 网络搭建 2 利用Pytorch实现ResNet网络 2.1 模型定义 2.2 训练结果 1 ResNeXt网络介绍 ...

  7. 利用Pytorch搭建简单的图像分类模型(之二)---搭建网络

    Pytorch搭建网络模型-ResNet 一.ResNet的两个结构 首先来看一下ResNet和一般卷积网络结构上的差异: 图中上面一部分就是ResNet34的网络结构图,下面可以理解为一个含有34层 ...

  8. ResNet网络学习笔记。

    ResNet网络学习 看b站 霹雳吧啦Wz 的视频总结的学习笔记! 视频的地址 大佬的Github代码 1.ResNet详解 ResNet 网络是在2015年由微软实验室提出,斩获当年 ImageNe ...

  9. 【深度学习】ResNet——CNN经典网络模型详解(pytorch实现)

    建议大家可以实践下,代码都很详细,有不清楚的地方评论区见~ 1.前言 ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNe ...

最新文章

  1. python转字符_python 字符转换
  2. 解决EditText不能撑满全屏的问题及EditText你应该知道的属性
  3. Azkaban 进程和任务监控(任务状态从MySQL同步到SqlServer)
  4. python在电脑哪可以找到_哪里可以找到比较靠谱的Python教程?
  5. Android常见界面控件(基础入门)
  6. Linux远程传输命令scp、rsync(tar打包归档并在系统之间传输文件)
  7. 桌面超简单小代码 bat形式
  8. 计算机专业必装软件mac,MAC电脑可运行的常用软件有哪些?
  9. 等差素数列 蓝桥杯 python
  10. testbench——信号的产生
  11. idea继承后重新方法快捷键_idea 查看类继承关系的快捷键
  12. c语言音频信号频谱分析,音频信号频谱分析(正文)-副本.pdf
  13. IC 产品的质量与可靠性测试
  14. C#事件中sender和e参数的理解
  15. Unity开发之-Unity入门简介(近万字攻略)
  16. 【Linux】VM与Linux的安装
  17. 【机器学习】numpy实现NAG(Nesterov accelerated gradient)优化器
  18. ORM-Dapper学习二.关于Dapper
  19. VS2017安装打包工具;以及无法加载此项目,setup(不兼容),该应用程序未安装、MFC的使用
  20. 【php毕业设计】基于php+mysql+apache的课程网站管理系统设计与实现(毕业论文+程序源码)——课程网站管理系统

热门文章

  1. UnicodeEncodeError:#39;ascii#39;编解码器无法在位置20编码字符u#39;\\ xa0#39;:序数不在范围内(128)
  2. 如何强制.NET应用程序以管理员身份运行?
  3. C语言小程序显示心形,如何用vc6.0编出来一个心形
  4. win11WiFi驱动如何下载 windows11WiFi驱动下载的步骤方法
  5. win11如何设置始终以管理员身份运行 windows11设置始终以管理员身份运行的方法步骤
  6. win11如何加快搜索速度 Windows11更改文件索引加快搜索速度的设置方法
  7. html标签之间去掉空白,html – 减少两个标签之间的空白差距
  8. 使用可视化SQLyog操作数据库与使用idea操作数据库的区别
  9. JavaScript获取一周前,一个月前日期
  10. 微信小程序page禁止页面上下滑动