ResNet——Deep Residual Learning for Image Recognition(论文阅读)

news2025/4/8 8:49:39

1.什么是ResNet

ResNet是一种残差网络,咱们可以把它理解为一个子网络,这个子网络经过堆叠可以构成一个很深的网络。下面是ResNet的结构。

2.为什么要引入ResNet 

理论上来说,堆叠神经网络的层数应该可以提升模型的精度。但是现实中真的是这样吗?

我们知道,网络越深,咱们能获取的信息越多,而且特征也越丰富。但是根据实验表明,随着网络的加深,优化效果反而越差,测试数据和训练数据的准确率反而降低了。这是由于网络的加深会造成梯度爆炸和梯度消失的问题。

为了让更深的网络也能训练出好的效果,何凯明大神提出了一个新的网络结构——ResNet。这个网络结构的想法主要源于VLAD(残差的想法来源)和Highway Network(跳跃连接的想法来源)。  

 实验数据证明了一开始随着模型层数的增加,模型的精度会达到饱和。如果再增加网络的层数的话,就会开始退化了。从这个实验数据中,我们可以看到在训练轮次相同的情况下,56层的网络误差,居然比20层的网络还要高。这个现象是由于深层网络训练难度太高导致的。我们给这个现象起名叫做退化。这个现象经常被和过拟合搞混淆,但是过拟合其实是会让训练误差变得越来越小,而测试误差变高。退化则是让训练误差和测试误差都变高。

与此同时,深度神经网络还有一个难题:我们以一个最简单的神经网络为例,在反向传播的过程中我们可以推导出每一层的误差项都依赖它后面一层的误差项,在层数很多的情况下,我们很难保证每一层的权值和梯度的大小。举一个最经典的例子,如果我们用sigmoid函数作为我们的激活函数,它的导数的最大值只有0.25,梯度在传播的过程中越来越趋近于零。误差就没有办法传播到底层的参数了,这就是梯度消失。虽然batch normalization和layer normalization,可以缓解梯度消失的问题,但是我们有没有什么办法,既可以解决退化的问题,又能顺便给梯度开个后门。

3.ResNet详读

先来想一想为什么深层神经网络会出现退化的问题呢?假设我们的神经网络在层数为L的时候达到了最优的效果。这个时候我们把这个网络构建的更深,那么第L层之后的每一层理论上来说应该是一个恒等映射,但是拟合一个恒等映射是很难的,所以我们可不可以考虑换一个思路。如果我们用H(x)来表示我们想让这个神经网络学到的映射。用x来表示我们已经学到的内容,那么现在我们可不可以让我们的神经网络去拟合H(x)和x之间的残差呢?也就是说如果我们选择优化的不是H(x),而是把H(x)拆分为x和H(x)-x两个部分,我们选择去优化H(x)-x,我们给这个残差取名叫F(x),F(x)通常包含着卷积和激活之类的操作。我们把F(x)和x相加之后,仍然能得到我们想要的HX,我们把这样从输入额外连一条线到输出来,表示将输入输出相加的操作叫做skip connection。如果让F(x)趋近于零,那么就相当于我们构造了一个恒等映射,那为什么这种方法可以有效解决退化和梯度消失的问题呢?我们假设第L层的输入是xl,那它这一层的输出就是f(xl)+xl,同时它也是第l+1层的输入xl+1。那我们现在可以根据这个规律去推导一下第l+2层的输入,到了这一步我们是不是就不难发现,我们可以得到任意一个更深的层数L和一个更浅的层数l之间的关系的表达式。

首先是任意一层的输入xL可以写成比它更浅的任意层的输入xl和两层之间所有参差的和,我们这样是不是可以初步推测出和普通的神经网络相比,残差网络在前向传播的时候可以让任意低层的信息更容易传播到高层。根据这个式子,我们也可以推导出损失函数。关于xL的梯度,我们从这里可以发现损失函数关于xL的梯度可以直接传播到任意一个更浅的层,后面的这一堆不可能一直等于-1,也就是说残差网络中不会出现梯度消失的问题。作者何凯明的观点是这样的属性。让残差网络无论是正向传播还是反向传播都可以将信号直接传播到任意一层。

注意:如果残差映射(F(x))的结果的维度与跳跃连接(x)的维度不同,那咱们是没有办法对它们两个进行相加操作的,必须对x进行升维操作,让他俩的维度相同时才能计算。
升维的方法有两种:

  • 全0填充;
  • 采用1*1卷积

4.深度残差学习

在堆叠的几层网络上使用残差连接。整个网络的架构如图:

其中,左边是VGG-19的模型,中间是原始网络,右边是残差网络。残差网络的参数比VGG-19要少。

5.实现

在ImageNet上的测试设置如下: 图片使用欠采样放缩到 [256∗480] [256*480],以提供尺寸上的数据增强。对原图作水平翻转,并且使用 [224∗224] [224*224]的随机采样,同时每一个像素作去均值处理。在每一个卷积层之后,激活函数之前使用BN。使用SGD,mini-batch大小为256。学习率的初始值为0.1,当训练误差不再缩小时降低学习率为原先的1/10继续训练。训练过程进行了600000次迭代。

6.实验部分

Table1中给出了不同层数的ResNet架构。

 

ImageNet Classification

Plain Networks

分别使用18层的plain nets和34层的plain nets,结果显示34层的网络有更高的验证误差。下图比较了整个过程的训练和测试误差:

注:细实线代表训练误差,粗实线代表验证误差。左侧为plain nets,右侧为ResNet。 这种优化上的困难不是由于梯度消失造成的,因为在网络中已经使用了BN,保证了前向传播的信号有非零的方差。猜想深层的神经网络的收敛几率随着网络层数的加深,以指数的形式下降,导致训练误差很难降低。

Residual Networks

测试18层和34层的ResNet。注意到34层的训练和测试误差都要比18层的小。这说明网络退化的问题得到了部分解决,通过加深网络深度,可以提高正确率。注意到18层的plain net和18层的ResNet可以达到相近的正确率,但是ResNet收敛更快。这说明网络不够深的时候,SGD还是能够找到很好的解。

Identity vs. Projection Shortcuts

比较了三种选择: (A)zero-padding shortcuts用来增加维度(Residual block的维度小于输出维度时,使用0来进行填充),所有的shortcut无参数。 (B)projection shortcuts用来增加维度(维度不一致时使用),其他的shortcut都是恒等映射(identity)类型。 (C)所有的shortcut都是使用projection shortcuts。 Table3中给出了实验结果:

结果表明,这三种选择都有助于提高正确率。其中,B比A效果好,原因可能是A中zero-padded的维度没有使用残差学习。C比B效果好,原因可能是projection shortcuts中引入的参数。但是ABC中的结果表明,projection shortcuts对于解决网络的退化问题是没有作用的,对于正确率的提升作用也十分有限。所以,从减少模型参数,降低复杂度的角度考虑,使用Identity shortcuts就已经足够了。

Deeper Bottleneck Architectures.

在探究更深层网络性能的时候,处于训练时间的考虑,我们使用bottleneck design的方式来设计building block。对于每一个残差函数 F F,使用一个三层的stack代替以前的两层。这三层分别使用1x1,3x3,1x1的卷积。其中,1 × 1卷积用来降维然后升维,即利用1 × \times1卷积解决维度不同的问题。3 × 3对应一个瓶颈(更少的输入、输出维度)。Fig.5 展示了这种设计。

50、101和152层的ResNet相对于32层网络有更高的准确率。Table3和4中给出了测试结果。

注:使用集成方法的152层网络能达到3.75%的错误率。

CIFAR10 and Analysis

在CIFAR10数据集上的测试表明,ResNet的layer对于输入信号具有更小的响应。

 对于更深的网络,比如超过1000层的情况,虽然能够进行训练,但是测试的正确率并不理想。原因可能是过拟合,因为超过1000层的网络对于这个小数据集来说,容量还是过大。

总结

ResNet和Highway Network的思路比较类似,都是将部分原始输入的信息不经过矩阵乘法和非线性变换,直接传输到下一层。这就如同在深层网络中建立了许多条信息高速公路。ResNet通过改变学习目标,即不再学习完整的输出 F(x) ,而是学习残差 H(x)−x ,解决了传统卷积层或全连接层在进行信息传递时存在的丢失、损耗等问题。通过直接将信息从输入绕道传输到输出,一定程度上保护了信息的完整性。同时,由于学习的目标是残差,简化了学习的难度。根据Schmidhuber教授的观点,ResNet类似于一个没有gates的LSTM网络,即旁路输入 x 一直向之后的层传递,而不需要学习。有论文表示,ResNet的效果类似于对不同层数网络进行集成方法。

Inplimentation

这里简单分析一下ResNet152在PyTorch上的实现。 源代码:https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py

 

 

 

 

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

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

相关文章

SwiftUI中UIViewRepresentable的使用(UIKit与SwiftUI的桥梁)

UIViewRepresentable是一个协议,用于创建一个SwiftUI视图,该视图包装了一个UIKit视图。通过实现UIViewRepresentable协议,我们可以在SwiftUI中使用自定义的UIKit视图,并与SwiftUI进行交互。 实现UIViewRepresentable 创建一个遵…

DT浏览器很好用

简单的浏览器,又是强大的浏览器,界面简洁大方,操作起来非常流畅😎,几乎不会有卡顿的情况。 搜索功能也十分强大👍,能够快速精准地找到想要的信息。 而且还有出色的兼容性,各种网页都…

qt 实现模拟实际物体带速度的移动(水平、垂直、斜角度)——————附带完整代码

文章目录 0 效果1 原理1.1 图片旋转1.2 物体带速度移动 2 完整实现2.1 将车辆按钮封装为一个类:2.2 调用方法 3 完整代码参考 0 效果 实现后的效果如下 可以显示属性(继承自QToolButton): 鼠标悬浮显示文字 按钮显示文字 1 原理 类继承…

单链表经典算法题 1

前言 学习了单链表,我们就做一些题来巩固一下。还有就是解题方法不唯一,我就只讲述为自己的方法。 目录 前言 1.移除链表元素 思路 代码 2.反转链表 思路 代码 3.链表的中间节点 思路 代码 总结 1.移除链表元素 思路 我们创建一个新的表…

FM全网自动采集聚合影视搜索源码

源码介绍 FM 全网聚合影视搜索(响应式布局),基于 TP5.1 开发的聚合影视搜索程序,本程序无数据库,本程序内置P2P 版播放器,承诺无广告无捆绑。片源内部滚动广告与本站无关,谨防上当受骗,资源搜索全部来自于网络。 环境…

Java面向对象之static关键字,可变参数,递归,数组常见算法,对象数组,方法参数

第一章.static关键字 1.static的介绍以及基本使用 1.概述:static是一个静态关键字 2.使用:a.修饰一个成员变量:static 数据类型 变量名b.修饰一个方法:修饰符 static 返回值类型 方法名(形参){方法体return 结果}3.调用静态成员:类名直接调用(不用new对象)4.静态成员特点:a.静…

智慧守护 畅游无忧——北斗应急呼叫柱,为景区安全加码

在大自然的怀抱中,中型及大型公园、景区以其壮丽风光吸引着成千上万的游客前来探索,成为了人们休闲娱乐的好去处。然而,广袤的区域、复杂的地形和分散的人流也给安全保障带来了前所未有的挑战。传统的巡逻方式难以覆盖每一个角落,…

2.nginx常用命令

使用nginx命令需要进入nginx目录里面执行。 /usr/local/nginx/sbin/ 查看nginx的版本号 启动nginx ./nginx 关闭nginx ./nginx -s stop 查看nginx的是否运行的命令 重新加载nginx 针对配置目录中配置文件nginx.cnf修改后需要重新加载 /usr/local/nginx/conf/nginx.cnf …

WebSocket 详解--spring boot简单使用案例

一、什么是WebSocket WebSocket 是一种网络通信协议,专为在单个 TCP 连接上进行全双工通信而设计。WebSocket 允许客户端和服务器之间的消息能够实时双向传输。这与传统的 HTTP 请求-响应模式有很大的不同。 二、WebSocket 的关键特性 双向通信:WebSocke…

vi/vim使用命令

你是否在编辑文件时以为键盘坏了,为什么不能删除呢,为什么不能敲代码呢,等你初识vi,会觉得这个东西为什么设计得这么难用,这篇教程带你熟练得用上这款经典的工具 Vi 是在 Unix 系统上广泛使用的编辑器,Vim …

java原子变量

在Java中,原子变量是一种特殊的变量,它们提供了一种不需要显式加锁的情况下进行线程安全的操作。Java.util.concurrent.atomic包提供了原子变量类,如AtomicInteger,AtomicLong等,它们利用底层硬件的原子操作来保证线程…

VRChat 2024年裁员原因与背景深度分析

VRChat,作为2022年元宇宙/VR社交领域的巨头,近期在2024年宣布裁员计划,其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露,VRChat的创始人因缺乏经验和过度自信…

HTTP 概述

HTTP 概述 HTTP 是一种用于获取资源(如 HTML 文档)的协议。 它是 Web 上任何数据交换的基础,它是一种客户端-服务器协议,这意味着请求由接收方(通常是 Web 浏览器)发起。 一个完整的文档是从获取的不同子文…

10 SpringBoot 静态资源访问

我们在开发Web项目的时候,往往会有很多静态资源,如html、图片、css等。那如何向前端返回静态资源呢? 以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要把静态资源放在该目录下…

N32G45XVL-STB之移植LVGL(8.4.0)

目录 概述 1 系统软硬件 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 下载V8.4.0 3 移植LVGL 3.1 硬件驱动实现 3.2 添加LVGL库文件 3.3 移植和硬件相关的代码 3.3.1 驱动接口相关文件介绍 3.3.2 重新接口函数 3…

Lecture3——线性最优化(Linear Optimization)

一,本文重点 线性最优化(LP)和标准线性最优化(Standard LP form)的定义如何将LP转换为Standard LP用Python解决LP问题将非线性最优化问题(NLP)转换为LP 二,定义 1,线性…

Java多线程面试重点-1

0. 什么是并发?什么是并行? 并发:把时间分成一段一段,每个线程轮流抢占时间段。 如果时间段非常短,线程切换非常快,被称为伪并行。并行:多个线程可以同时运行。 并发与并行造成的影响&#xff…

k8s之kubelet证书时间过期升级

1.查看当前证书时间 # kubeadm alpha certs renew kubelet Kubeadm experimental sub-commands kubeadm是一个用于引导Kubernetes集群的工具,它提供了许多命令和子命令来管理集群的一生周期。过去,某些功能被标记为实验性的,并通过kubeadm a…

vue3 前端验证码-删除最后一个,焦点聚焦在前一个值上,并不会删除值

删除最后一个数字&#xff0c;焦点聚焦在前一个值上&#xff0c;并不会删除值 <inputv-for"(box, index) in boxes":key"index"ref"inputRefs":value"box"input"onInputChange(index)"keyup"onKeyDown($event, inde…

WARNING: pip is configured with locations that require TLS/SSL

在pycharm中运行pip下载软件包遇到该问题&#xff1a;WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available 原因&#xff1a;没有安装openssl&#xff1b; 到https://slproweb.com/products/Win32OpenSSL.ht…