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。注意到他有两种模块BasicBlock和Bottleneck。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

在这里插入图片描述

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

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

赞 (2)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • codeblocks mingw安装配置问题

    codeblocks mingw安装配置问题整了一上午!1.64位os可以用mingw-322.官网下载mingw,安装,位置无所谓,continue之后右键第三项,mark,然后install选项,apply3.path配置,win10以前的版本要手写变量,记得用半角英文分号,win10直接复制就行4.编译器配置,第一次自己搞最头疼最头疼最头疼最头疼最头疼的地方!第一步,setting,然后comp

    2022年6月22日
  • HTML与XML关系分析

    HTML与XML关系分析

    2021年12月14日
  • error LNK2019: 无法解析的外部符号_error lnk2019无法解析的外部符号

    error LNK2019: 无法解析的外部符号_error lnk2019无法解析的外部符号废话不多说,直接上错误图片原本是生成一个静态链接库,然后在主函数中进行库函数的调用,编写静态库时,没存在此问题,在主函数中一调用就报错。添加库连接,附加依赖项——也无法彻底解决此问题。原来是从VisualStudio2010开始,VisualStudio要求项目到项目引用。如果你的项目没有项目到项目引用,那么你可能收到此链接器错误。添加项目到项目引用以修复此错误。…

    2022年9月28日
  • 常数变易法的原理解释_微分方程常数变易法

    常数变易法的原理解释_微分方程常数变易法高数看到常数变易法,不懂为什么要把C变成u,看了篇文章,感觉懂了转载自http://www.cnblogs.com/lookof/archive/2009/01/06/1370065.html注:本方法是对崔士襄教授写的《“常数变易法”来历的探讨》论文的解释。思路并非本人原创。特此注明。背景详见本人前一篇博文。      我们来看下面的式子:

    2022年10月24日
  • 微信自动发送消息

    微信自动发送消息前提:今天加入微信辅助大军,奈何要一直去群里发广告,又懒又烦!!!于是乎,想到能不能自动去打广告~可以的~哈哈方案:最近在看api文档,就最先想到能不能java模拟发送信息,但是又没头绪(放弃)然后百度了相关信息,得出①脚本精灵录制(直接趴,这不是自己编程该有的风格)②微信网页版(js脚本)大致思路:1、遍历好友列表(避免发错

    2022年6月4日
  • 花了半个月,终于把Python库全部整理出来了,非常全面[通俗易懂]

    花了半个月,终于把Python库全部整理出来了,非常全面

    2022年2月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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