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

在这里插入图片描述

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

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

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


相关推荐

  • 线程join方法用处「建议收藏」

    线程join方法用处「建议收藏」参考博客:https://www.cnblogs.com/lcplcpjava/p/6896904.html第一种情况(不使用join):ThreadJoinTestt1=newThreadJoinTest(“小明”);ThreadJoinTestt2=newThreadJoinTest(“小东”);t1.start();

    2022年5月24日
    41
  • BeanUtils.populate方法的作用

    BeanUtils.populate方法的作用一般来说,这个方法是在org.apache.commons.beanutils.BeanUtils包中的方法。该方法的函数原型为:BeanUtils.populate(Objectbean,Mapproperties)。这个方法会遍历map<key,value>中的key,如果bean中有这个属性,就把这个key对应的value值赋给bean的属性。具体使用方法,见…

    2022年7月26日
    5
  • Java服务器热部署的实现原理

    Java服务器热部署的实现原理今天发现早年在大象笔记中写的一篇笔记,之前放在ijavaboy上的,现在它已经访问不了了。前几天又有同事在讨论这个问题。这里拿来分享一下。在web应用开发或者游戏服务器开发的过程中,我们时时刻刻都在使用热部署。热部署的目的很简单,就是为了节省应用开发和发布的时间。比如,我们在使用Tomcat或者Jboss等应用服务器开发应用时,我们经常会开启热部署功能。热部署,简单点来说,就是我们将打

    2022年5月21日
    24
  • django使用celery_django serializers

    django使用celery_django serializers前言环境celery==5.0.2在安装完celery后,运行celery会报以下错误ModuleNotFoundError:Nomodulenamed'click._bashc

    2022年7月30日
    4
  • 软件缺陷报告[通俗易懂]

    软件缺陷报告[通俗易懂]1、定义概述:标识并描述发现的缺陷,具有清晰、完整和可重视问题所需的信息的文档理解:测试人员发现缺陷,记录,通过缺陷报告将缺陷报告给开发人员,并对缺陷进行跟踪管理。缺陷报告是测试人员与开发人员之间重要的沟通方式2、什么是缺陷软件缺陷就是通常说的Bug,它是指在软件中存在的影响软件正常运行的问题3、软件缺陷产生的原因1、需求不明确和变更软件需求不清晰或者开发人员对需求理解偏差,导致软件设…

    2022年9月18日
    2
  • URI和URL的区别比较与理解[通俗易懂]

    URI和URL的区别比较与理解[通俗易懂]一、URI<1>什么是URIURI,通一资源标志符(UniformResourceIdentifier,URI),表示的是web上每一种可用的资源,如HTML文档、图像、视频片段、程序等都由一个URI进行定位的。<2>URI的结构组成URI通常由三部分组成:①访问资源的命名机制;②存放资源的主机名;③资源自身的名称。<3>…

    2022年7月27日
    4

发表回复

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

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