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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构学习——skiplist跳表

    数据结构学习——skiplist跳表目录1.skiplist简介2.skiplist核心思想3.skiplist原理3.1跳表的查找3.2跳表的插入3.3跳表的删除4.skiplist简单实现1.skiplist简介Skiplist是一个用于有序元素序列快速搜索的数据结构,由美国计算机科学家WilliamPugh发明于1989年。他在论文《Skiplists:aprobabilisticalternativetobalancedtrees》中详细介绍了跳表的数据结构和插入删除等…

    2022年10月21日
    1
  • Linux 解压 zip 分卷

    Linux 解压 zip 分卷对于一个大的文件,使用分卷压缩得到如下文件:传到Linux目录下,希望解压出来,需要使用zip-F命令修复分卷,从而合成正确的一个压缩文件zip-FUCF-101.zip–outucf101.zip得到ucf101.zip,然后解压ucf101.zip即可unzipucf101.zip…

    2022年5月23日
    193
  • OpenWrt make menuconfig 构建过程「建议收藏」

    OpenWrt make menuconfig 构建过程「建议收藏」OpenWrtmakemenuconfig构建过程1.课题背景之前在《20190614OpenWrt如何添加驱动以及应用程序谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于makemenuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。2.分析过程2.1OpenWrt目录下的Makefile分析makemenuconfig的过程也…

    2022年5月12日
    45
  • Linux安装JDK1.8(看这一篇就够了) 附安装包下载地址

    文章目录Linux-jdk1.8下载地址1.都要做什么?2.安装2.1创建两个文件夹2.2使用工具上传至Linux服务器2.3解压到install文件夹中3.配置环境变量3.1编辑文件3.2将内容复制到文件中3.3检查是否配置完成3.4更新profile文件3.5重新检查4.切换版本(本地已有jdk时操作,没有请忽略!)Linux-jdk1.8下载地址点击下载jdk1.8-l…

    2022年4月6日
    55
  • linux常用的20个命令面试_linux常用命令详解pdf

    linux常用的20个命令面试_linux常用命令详解pdf什么是linux多用户,多任务,支持多线程和多CPU的操作系统linux的应用领域:免费,稳定,高效的,一般运行在大型服务器上用xshell连接虚拟机的步骤:1.setup设置虚拟机IP为10.10.10.10重启网卡:servicenetworerestart2.在Windows系统打开网络和共享中心,更改适配器设置,把vmnet1的ipv4的IP改成10.10.10.13.打开xshell,输入ssh10.10.10.10/根目录:一般根目录下只存放目录,有且只有一个根目

    2022年9月23日
    4
  • 关于pycharm下载tensorflow时报错解决「建议收藏」

    关于pycharm下载tensorflow时报错解决「建议收藏」1.查看pip工具是否需要更新2.点击settings,进入pythoninterperter,对pip进行更新3.可以双击上箭头进行更新,也可以点击加号搜索pip进行更新

    2022年8月27日
    5

发表回复

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

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