论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录

  • 1.介绍
  • 2.基本原理
  • 3.两种残差块
  • 4.网络结构


  论文:Deep Residual Learning for Image Recognition
  论文链接:Deep Residual Learning for Image Recognition
  代码链接:Github

1.介绍

在这里插入图片描述
  在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题:

  • 梯度消失/梯度爆炸。
  • 退化问题。

其中,在论文中针对两个问题提出了如下解决方案:

  • 1.梯度消失/梯度爆炸:可通过数据预处理及在网络中使用 B a t c h N o r m a l i z a t i o n Batch\;Normalization BatchNormalization来解决。
  • 2.退化问题(随着网络层数的加深,效果会变差,如上图所示):本文提出了残差结构( R e s i d u a l B l o c k Residual\;Block ResidualBlock)进行解决。

  残差块设计的基本思想是,人为地让神经网络某些层跳过下一层神经元的连接,通过隔层相连来弱化每层之间的强联系,这种网络结构称为残差网络( R e s N e t s ResNets ResNets)。效果如下图所示,可见,随着网络的不断加深,效果并没有变差,而是变的更好了。
在这里插入图片描述

2.基本原理

  残差指的是输入特征 x x x与经过卷积模块提取的特征 H ( x ) H(x) H(x)之间的差值。网络深度的增加却使得模型性能下降,说明增加的层并不能学习到新的特征,甚至会导致原始特征的丢失。而若能保证即使新增加的层未学习到任何内容,但也能复制浅层网络学习到的特征(相当于浅层网络的恒等映射),此时深层网络的性能与浅层网络相同,也就解决了残差问题。
  传统的CNN网络如左图所示( C o n v + R e L U + C o n v Conv+ReLU+Conv Conv+ReLU+Conv):
在这里插入图片描述
其输出可定义为 H ( x ) = C o n v ( R e L U ( C o n v ( x ) ) ) H(x)=Conv(ReLU(Conv(x))) H(x)=Conv(ReLU(Conv(x))),而残差网络的结构如下图所示:
在这里插入图片描述
与普通CNN网络结构相比,残差网络增加了跳跃连接( s k i p c o n n e c t i o n skip\;connection skipconnection),将输入 x x x恒等映射到第二个激活函数之前与 F ( x ) = C o n v ( R e L U ( C o n v ( x ) ) ) F(x)=Conv(ReLU(Conv(x))) F(x)=Conv(ReLU(Conv(x)))之间相加(假设 w e i g h t l a y e r = C o n v weight\;layer=Conv weightlayer=Conv)。通过这种操作,使得网络在最差的情况下也能获得和输入一样的输出,即增加的层什么也不学习,仅仅复制输入的特征,至少使得网络不会出现退化的问题。

3.两种残差块

   R e s N e t ResNet ResNet中一共有两种残差块结构:
在这里插入图片描述

其中,左侧的残差结构常用于层数较少的 R e s N e t ResNet ResNet中,如例如ResNet18层和ResNet34层网络。而右侧则常用于层数较多的 R e s N e t ResNet ResNet中。这是因为右侧的残差结构能够减少网络参数与运算量。同样输入一个channel为256的特征矩阵,如果使用左侧的残差结构需要大约1170648个参数,但如果使用右侧的残差结构只需要69632个参数。

【残差结构一】
在这里插入图片描述
  上图中左侧的残差块结构用于 R e s N e t 18 − l a y e r 、 34 − l a y e r ResNet\;18-layer、34-layer ResNet18layer34layer网络中,其主分支由两个3x3的卷积层组成,而右侧的分支结构则实现 x x x的恒等映射。
  在 R e s N e t 34 − l a y e r ResNet\;34-layer ResNet34layer中有一些恒等映射使用虚线连接的残差结构,如:
在这里插入图片描述
其真实结构如上图右侧所示,此时恒等映射需要通过卷积核1x1大小、步长为2、个数为128的卷积层来调整 x x x的形状,使之能够与 F ( x ) F(x) F(x)进行相加。

【残差结构二】
在这里插入图片描述
  上图左侧的残差块结构用于 R e s N e t 50 − l a y e r 、 101 − l a y e r 、 152 − l a y e r ResNet\;50-layer、101-layer、152-layer ResNet50layer101layer152layer中,主分支中共有三个卷积层,其中,第一个卷积层用于压缩输入矩阵的通道数,第三个卷积层则将通道数还原回原始大小。
  这些网络中同样有一些恒等映射使用虚线连接的残差结构,具体实现方式如右图所示。其并不直接进行恒等映射,而是使用1x1的卷积块调整输入矩阵的通道数,使能够与 F ( x ) F(x) F(x)正常相加来实现恒等映射。例如, R e s N e t 50 − l a y e r ResNet\;50-layer ResNet50layer B o t t l e n e c k Bottleneck Bottleneck代码实现:

class Bottleneck(nn.Module):def __init__(self, inplanes, planes, stride=1, downsample=None, dilation=1):#inplanes:输入通道数;planes:输出通道数;stride:步幅;downsample:下采样层;dilation:膨胀系数super(Bottleneck, self).__init__()#1×1卷积self.conv1      = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)self.bn1        = nn.BatchNorm2d(planes)#3×3卷积self.conv2      = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=(3*dilation-1)//2, bias=False, dilation=dilation)self.bn2        = nn.BatchNorm2d(planes)#1×1卷积self.conv3      = nn.Conv2d(planes, planes*4, kernel_size=1, bias=False)self.bn3        = nn.BatchNorm2d(planes*4)#下采样(若步幅不为1或输入通道数与目标通道数不匹配,则进行下采样)self.downsample = downsampledef forward(self, x):residual = x#1×1卷积out      = F.relu(self.bn1(self.conv1(x)), inplace=True)#3×3卷积out      = F.relu(self.bn2(self.conv2(out)), inplace=True)#1×1卷积out      = self.bn3(self.conv3(out))#若不能直接将x与特征残差连接,则需下采样(对应虚线部分)if self.downsample is not None:residual = self.downsample(x)#残差连接return F.relu(out+residual, inplace=True)

downsample在网络中的实现为:

if stride != 1 or self.inplanes != planes*4:#使用1×1卷积和批量归一化进行下采样downsample = nn.Sequential(nn.Conv2d(self.inplanes, planes*4, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(planes*4))

4.网络结构

在这里插入图片描述
  下面这幅图是原论文给出的不同深度的ResNet网络结构配置,表中的残差结构给出了主分支上卷积核的大小与卷积核个数,其中, x N xN xN表示将该残差结构重复N次。
  在 R e s N e t 18 − l a y e r 、 34 − l a y e r 、 50 − l a y e r 、 101 − l a y e r 、 152 − l a y e r ResNet\;18-layer、34-layer、50-layer、101-layer、152-layer ResNet18layer34layer50layer101layer152layer中, c o n v 3 _ x 、 c o n v 4 _ x 、 c o n v 5 _ x conv3\_x、conv4\_x、conv5\_x conv3_xconv4_xconv5_x对应的残差链(指由多个残差块连接而成)结构中,第一层均使用带虚线的残差块来调整输入矩阵的形状(将输入矩阵的高和宽缩减为原来的一半,将图像通道数调整成下一层残差结构所需要的通道数)。例如, 34 − l a y e r 34-layer 34layer的结构如下图所示:
在这里插入图片描述
  而在 R e s N e t 50 − l a y e r 、 101 − l a y e r 、 152 − l a y e r ResNet\;50-layer、101-layer、152-layer ResNet50layer101layer152layer中,其 c o n v 2 _ x conv2\_x conv2_x结构的第一层也是虚线残差块结构,其需要调整输入特征矩阵的通道数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速部署一套智能化openGauss测试环境

一、openGauss介绍 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,允许用户自由地复制、使用、修改和分发软件。openGauss内核深度融合了华为在数据库领域多年的研发经验,结合企业级场景需求,持续构建竞争力…

基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

在docker的容器内如何查看Ubuntu系统版本

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境: docker 一、问题描述 由于 lsb_release -a 只能查看自己电脑(宿主机)的系统版本,如果在docker的容器内又应该如何查看Ubuntu系统版本呢&#xff…

机器学习—学习率的选择

如果你选择适当的学习率,你的学习算法将运行得更好,如果太小,它会跑得很慢,如果太大,它甚至可能不会收敛,那么如何为模型选择一个好的学习率呢? 如果绘制多次迭代的成本,注意到成本…

深度学习笔记20_数据增强

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.9 2.编译器:Pycharm 3.深度学习环境:TensorFlow 2.10.0 二、GPU设置…

LLM实践--支线:拯救Continue Pretrain的数据

背景 首先介绍下什么是Continue Pretrain(CP)。CP 和 Pretrain、SFT一样指的是 LLM 训练的一个阶段,在前大模型时代还被称作Post Pretrain。CP 是在Pretrain和SFT之间的训练阶段,目的是为模型注入领域知识,这个领域是…

mqtt客户端订阅一直重复连接?

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…

解决使用MobaXterm不能向Ubuntu上传下载文件的问题

如上图所示 解决方案 新建连接,使用root账户建立ssh会话,就是建立会话的时候,用户名使用root。ubuntu系统默认不允许远程root账户建立连接,表现就是你新建ssh会话,在第一步输入root密码的时候,密码正确会报…

一文探索RareShop:首个面向消费者的RWA NFT商品发售平台

作者:Weilin,PANews 本轮牛市中,加密消费级应用正成为一种热门趋势,比如pump.fun和Polymarket等产品已成为C端用户的明星。加密货币正日益渗透到日常消费者的产品、服务和行为中。这意味着加密货币的使用不再局限于投机交易或去中…

appium启动hbuild打包的apk异常解决

目录 一、错误信息 二、问题解决 2.1 通过以下命令获取安装包名称: 2.2 这个launcher状态下的安装包名称和active,替换原先的安装包名称 一、错误信息 通过adb shell dumpsys activity | findstr "mResume" 命令获取的安装包信息&#xff…

从零开始学习OMNeT++系列第三弹——新建一个使用INET框架的工程

上一篇学习了如何新建一个omnet的工程,这篇来学习下INET框架以及如何使用INET框架来新建一个工程。 INET框架是什么 INET框架是一个开源模型库,用于OMNeT仿真环境。它为研究者和学生在使用通信网络时提供协议、代理和其他模型。当设计和验证新协议或探…

深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c&#xff0c;解释程序的运行 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; }1.1、信息就是位上下文 源程序是由值 0 和 1 组成的位&#xff08;比特&#xff09;序列&#xff0c;8 个位被组织成一组…

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技

在数字化浪潮汹涌的今天&#xff0c;安防监控领域也迎来了技术革新的春风。今天&#xff0c;我们就来聊聊这一领域的产品——摄像头图传模组&#xff0c;以及它如何借助飞睿智能1公里WiFi无线传输技术&#xff0c;为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…

mysql--基本查询

目录 搞定mysql--CURD操作&#xff0c;细节比较多&#xff0c;不难&#xff0c;贵在多多练 1、Create--创建 &#xff08;1&#xff09;单行插入 / 全列插入 &#xff08;2&#xff09;插入否则替换 &#xff08;3&#xff09;替换 2、Retuieve--select 1&#xff09;全…

FreeRTOS - 软件定时器

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 1. 软件定时器 软件定时器也可以完成两类事情…

JDK-23与JavaFX的安装

一、JDK-23的安装 1.下载 JDK-23 官网直接下载&#xff0c;页面下如图&#xff1a; 2.安装 JDK-23 2.1、解压下载的文件 找到下载的 ZIP 文件&#xff0c;右键点击并选择“解压到指定文件夹”&#xff0c;将其解压缩到您希望的目录&#xff0c;例如 C:\Program Files\Java\…

多进程思维导图

1> 思维导图 2> 使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行&#xff08;君子作业&#xff09; #include <myhead.h> typedef struct sockaddr_in addr_in_t; typedef struct sockaddr…

毕业设计选题:基于django+vue的个人博客系统设计与开发

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 博主管理 博客文章管理 博文排行管理 博文打赏管理 博文…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…