resnet18与resnet50

resnet18与resnet50ResNet18的18层代表的是带有权重的18层,包括卷积层和全连接层,不包括池化层和BN层。Resnet论文给出的结构图参考ResNet详细解读结构解析:首先是第一层卷积使用7∗77∗7大小的模板,步长为2,padding为3。之后进行BN,ReLU和maxpool。这些构成了第一部分卷积模块conv1。然后是四个stage,代码中用make_layer()来生成stage…

大家好,又见面了,我是你们的朋友全栈君。

ResNet18的18层代表的是带有权重的 18层,包括卷积层和全连接层,不包括池化层和BN层。

Resnet论文给出的结构图

这里写图片描述

参考ResNet详细解读

结构解析:

  1. 首先是第一层卷积使用7∗77∗7大小的模板,步长为2,padding为3。之后进行BN,ReLU和maxpool。这些构成了第一部分卷积模块conv1。

  2. 然后是四个stage,代码中用make_layer()来生成stage,每个stage中有多个模块,每个模块叫做building block,resnet18= [2,2,2,2],就有8个building block。注意到他有两种模块BasicBlockBottleneck。resnet18和resnet34用的是BasicBlock,resnet50及以上用的是Bottleneck。无论BasicBlock还是Bottleneck模块,都用到了shortcut connection连接方式:

    这里写图片描述

    • BasicBlock架构中,主要使用了两个3×3的卷积,然后进行BN,之后的out += residual这一句在输出上叠加了输入xx(注意到一开始定义了residual = x

      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.conv2(out)
              out = self.bn2(out)
      
              if self.downsample is not None:
                  residual = self.downsample(x)
      
              out += residual
              out = self.relu(out)
      
              return out
      
    • Bottleneck模块使用1×1,3×3,1×1的卷积模板,使用Bottleneck结构可以减少网络参数数量。他首先用1×1卷积将通道数缩减为一半,3×3卷积维持通道数不变,1×1卷积将通道数放大为4倍。则总体来看,经过这个模块后通道数变为两倍。

      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, bias=False)
              self.bn1 = nn.BatchNorm2d(planes)
              self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
                                     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
      
  3. 最后是avgpool和一个全连接层,映射到1000维上(因为ImageNet有1000个类别)。

结构图和更多细节:

参考https://www.jianshu.com/p/085f4c8256f1

https://blog.csdn.net/weixin_40548136/article/details/88820996

resnet18

在这里插入图片描述

resnet50

在这里插入图片描述

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141208.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)


相关推荐

  • c++ auto类型_auto C++

    c++ auto类型_auto C++编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如int)不同。auto让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说auto定义的变量必须有初始值。有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式

  • 看完这篇HTTP,跟面试官扯皮就没问题了

    看完这篇HTTP,跟面试官扯皮就没问题了我是一名程序员,我的主要编程语言是Java,我更是一名Web开发人员,所以我必须要了解HTTP,所以本篇文章就来带你从HTTP入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得05年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学xxx家里有网,每…

  • windows磁盘阵列[通俗易懂]

    windows磁盘阵列[通俗易懂]磁盘阵列磁盘有两个参数:容量,速度。笔记本最高转速5400转每分台式机最高转速7200转每分1.什么是RAIDRAID全称:RemdundantArrayofinexpensivesDisks廉价冗余磁盘阵列,通过对块磁盘组成一种模式,来提高吞吐量和可靠性2.磁盘阵列功能整合闲置磁盘空间提高磁盘读取文件提高容错功能磁盘阵列的…

  • win10php环境配置教程,win10php环境搭建详细教程

    win10php环境配置教程,win10php环境搭建详细教程大家在将系统更新为Win10系统后,对php环境搭建方法并不是很清楚。那么win10php环境搭建要怎么操作呢?其实win10php环境搭建的方法跟Win7/Win8.1系统的php环境搭建是相同道理的。如果还不懂win10php环境搭建的话,就看看小编带来的win10php环境搭建详细教程吧!首先,到微软官网下载符合系统位数的Apache和PHP一、安装并配置ApacheApache版本:Apa…

  • 培根密码加解密_二进制密码在线解密

    培根密码加解密_二进制密码在线解密0x00介绍培根密码实际上就是一种替换密码,根据所给表一一对应转换即可加密解密它的特殊之处在于:可以通过不明显的特征来隐藏密码信息,比如大小写、正斜体等,只要两个不同的属性,密码即可隐藏0x01代码实现脚本很简单,就是建立对应关系,对密文,或者明文进行相应的替换即可需要注意的是输入的都应该是全小写字母或全大写字母,在脚本里也有说明python脚本如下:#…

    2022年10月25日
  • 6种不同画法画平行线_9.2 平行线和它的画法(练习)-2019-2020学年七年级数学下册同步精品课堂(青岛版)…[通俗易懂]

    6种不同画法画平行线_9.2 平行线和它的画法(练习)-2019-2020学年七年级数学下册同步精品课堂(青岛版)…[通俗易懂]资料简介:第九章平行线9.2平行线和它的画法精选练习答案一.选择题(共4小题)1.(2018春•沧州期中)在同一平面内,不重合的两条直线的位置关系是(  )A.平行B.相交C.平行或相交D.平行、相交或垂直【答案】C【详解】解:在同一平面内,不重合的两条直线只有两种位置关系,是平行或相交,所以在同一平面内,不重合的两条直线的位置关系是:平行或相交.故选:C.2.(2019春•铁西区校级月考)下列…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号