残差网络是为了解决模型层数增加时出现梯度消失或梯度爆炸的问题而出现的。传统的神经网络中,尤其是图像处理方面,往往使用非常多的卷积层、池化层等,每一层都是从前一层提取特征,所以随着层数增加一般会出现退化等问题。残差网络采取跳跃连接的方法避免了深层神经网络带来的一系列问题。

一:对模型原理与优点的理解

首先,我们把网络层看成是映射函数。(1)在传统的前馈网络中,网络中堆叠的层可以将输入x映射为F(x),这一整体网络的输出为H(x),F(x)=H(x)。但是对于恒等映射函数f(x)=x,即网络的输入与输出相等,直接让这样的层去拟合这样的恒等映射函数会很困难,不过f(x)=0还是比较容易训练拟合的。(2)所以我们可以让输出H(x)=F(x)+x,这样如果整体网络H(x)需要是恒等映射,只需要把堆叠层拟合成F(x)=0即可。

从另一角度考虑,在以往的网络中,都试图通过堆叠不同的层找到可将输入x映射为输出H(x)的函数,而残差网络的目的并不是学习x到H(x)的映射,而是x与H(x)的不同,这也正是“残差”一词名称由来。残差F(x)=H(x)-x,所以我们尝试学习F(x)+x,而不是像(1)直接学习H(x)。(这样解释或许有些牵强,但事实的确如此。)

当然,还有一种说法是拟合H(x)-x与(1)中那样直接拟合F(x)相比更简单,这和开始部分提到的恒等映射函数不好优化这种说法是一致的。

对于模型优点原理的各种解释并不是模型的重心,毕竟这些解释建立在实验事实之上,如果这样的模型并不理想,一切解释都是徒劳的,不过这些内容有助于我们对这一类网络的构想过程的理解。

二:模型结构

ResNet的种类是很多的,如ResNet-18,ResNet-34,ResNet-50,ResNet-101,ResNet152等。但是它们的基本结构都是相同的——由多层相同的ResNet block重复堆叠而成。ResNet block特点是由若干层网络(这里表示为Layers)组成,输出为网络的输出与输入的加和。

上图表示一个ResNet block,下图为重复的结构。

这里的加是两个张量相加。所以我们要保证x与layers后的输出形状相同,否则无法相加。这取决于Layers内部结构。在图像处理方面,常用的是采取卷积核为3,padding为1的两个卷积层处理,这样可以不改变张量形状。

当然,理论上ResNet block只要保证输出形状与输入形状相同即可。所以我们可以根据实际需要以及卷积层、池化层等输出输入维度计算公式来设计ResNet block。但是一般ResNet block内部不会有太多结构,毕竟一般都是用它来实现深层网络,使用时一般会使用几个或数十个这样的block。

三:ResNet block的其它结构

(二)中讲解的结构是最ResNet block中最基本的一种,即输入与输出直接相加。但实际的连接方式可以是多种多样的。在百度百科中介绍有以下六种,其中的a对应前面(二)。后面的五种虽然稍显复杂,但总体结构基本相同,最终也都是形状相同的张量相加。

三:关于跳跃连接(skip connection),残差连接(residual connection)与捷径连接(shoutcut connection)的一些问题

这几个词在ResNet、Inception、DenseNet等文章中很常见。兔兔在前面只是说输入与输出相加,实际这个过程就是连接。有人说只要是模型内两个位置的连接即为跳跃连接,跳跃连接(skip connection)是很广泛的概念;残差连接(residual connection)是残差网络中的跳跃连接,也就是跳跃连接在残差网络中叫做残差连接(毕竟残差网络有一特点,所有的连接都是有规律的,是一块一块地连接)。而捷径连接(shortcut connection)可以理解为绕过中间的层去和后面输出连接,本质上体现的也是残差连接这个过程;也有人说捷径连接这个称呼可以理解为跳跃连接和残差连接最早定义,当时还是上个世纪,人工智能发展缓慢,人们使用这种连接主要用于全连接层网络;但是目前来看,这三种东西是用一个事物的不同称呼,只不过侧重点不同而已。

四:算法实现

如果直接使用ResNet模型,可以调用torchvision库。

from torchvision.models.resnet import resnet18
resnet18=resnet18()
print(resnet18)

上述代码可以查看模型内部结构,并且该模型可以直接进行训练,或者作为其它网络的一部分。

下面兔兔以(二)为例,简要地实现该部分,代码如下。

from torch import nn
from torch.nn import functional as F
class ResNetBlock(nn.Module):def __init__(self):super(ResNetBlock, self).__init__()self.conv1=nn.Conv2d(kernel_size=3,in_channels=4,out_channels=3,padding=1)self.conv2=nn.Conv2d(kernel_size=4,in_channels=3,out_channels=3,padding=1)self.bn1=nn.BatchNorm2d(4)self.bn2=nn.BatchNorm2d(3)def forward(self,input):x0=inputx=F.relu(self.bn1(self.conv1(x0)))x=self.bn2(self.conv2(x))x=x+x0return x0
class ResNet(nn.Module):def __init__(self,n_blocks):super(ResNet, self).__init__()self.n_blocks=n_blocksself.resnet_block=ResNetBlock()def forward(self,input):for i in range(self.n_blocks)x=self.resnet_block(input)input=xreturn input

五:总结

ResNet内部使用多个具有残差连接的残差块来解决梯度消失或梯度爆炸问题,并使得网络可以向更深层发展。

残差网络(Residual Network,ResNet)原理与结构概述相关推荐

  1. 残差网络(Residual Network)

    一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新. 可以看到,假设现在需要更 ...

  2. 【AI不惑境】残差网络的前世今生与原理

    大家好,这是专栏<AI不惑境>的第五篇文章,讲述残差网络的来龙去脉和背后的原理. 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考.如果说学习是一个从模仿,到追随,到创造 ...

  3. 目标检测学习笔记2——ResNet残差网络学习、ResNet论文解读

    ResNet残差网络学习.ResNet论文解读 一.前言 为什么会提出ResNet? 什么是网络退化现象? 那网络退化现象是什么造成的呢? ResNet要如何解决退化问题? 二.残差模块 三.残差模块 ...

  4. 深度残差网络(Deep Residual Network)ResNet

    一说起"深度学习",自然就联想到它非常显著的特点"深.深.深",通过很深层次的网络实现准确率非常高的图像识别.语音识别等能力.因此,我们自然很容易就想到:深的网 ...

  5. 残差网络的前世今生与原理 | 赠书

    本文内容节选自<深度学习之模型设计:核心算法与案例实践>,作者言有三.本书详解了数十年来深层卷积神经网络模型的主流设计思想,理论讲解细致,实战案例丰富,是熟练掌握深度学习模型使用的必备参考 ...

  6. 「AI不惑境」残差网络的前世今生与原理

    https://www.toutiao.com/a6713515733143257611/ 大家好,这是专栏<AI不惑境>的第五篇文章,讲述残差网络的来龙去脉和背后的原理. 进入到不惑境界 ...

  7. 深度学习 --- 深度残差网络详解ResNet

    本来打算本节开始循环神经网络RNN,LSTM等,但是觉得还是应该把商用比较火的网络介绍一下,同时详细介绍一下深度残差网络,因为他是基于卷积的.而后面的循环神经网络更多偏向于序列问题,偏向语音识别,自然 ...

  8. 大幅减少GPU显存占用:可逆残差网络(The Reversible Residual Network)

    点击我爱计算机视觉标星,更快获取CVML新技术 本文经授权转载自AINLP. 作者:光彩照人 学校:北京邮电大学 研究方向:自然语言处理,精准营销,风险控制 前序: Google AI最新出品的论文R ...

  9. Resnet 残差网络使用案例

    Resnet 网络 深度残差网络(Deep residual network, ResNet)的提出是CNN图像史上的一件里程碑事件,在各类数据集上都有不凡的表现,Resnet是残差网络(Residu ...

最新文章

  1. winform程序打包EXE三种方式
  2. Atitit.注册跟个登录功能的实现attilax总结obo
  3. 于明:必应发力海外业务 中国搜索营销市场暗流涌动
  4. invalidate () 方法
  5. findContours函数
  6. docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理
  7. 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)...
  8. linear-gradient线性渐变
  9. Docker(二)-在Docker中部署Nginx实现负载均衡(视频)
  10. 团队项目计划BACKLOG
  11. 【转】C#安装包(自动卸载低版本)
  12. redis搭建集群(非主从)版本5.0
  13. cmd控制远程电脑运行程序_电脑远程控制怎么,远程桌面开启教程
  14. ASP.NET 封装JS文件到DLL中并在页面中调用
  15. 自学python到什么程度可以找工作-Python学到什么程度就可以找工作?
  16. 数据结构之究竟什么是树
  17. Java菜鸟教程 标识符
  18. excel服务器2010网站,勤哲Excel服务器2010高级企业版完整安装包
  19. 数学建模论文写作方法
  20. db mysql导入_db mysql导入数据库

热门文章

  1. 2020.9.9丨遗传进化与GWAS研究
  2. Linux桌面版横评:八、中标普华桌面Linux 3.0.1
  3. Linux——Shebang符号
  4. Java多线程 理发店小测试
  5. 数据可视化之Grafana
  6. 一个计算机专业学生几年的编程经验汇总 (该系列一共 11 篇,看完之后,java 基础绝对有不小的提升!)
  7. 优先级队列 PriorityQueue
  8. hackbar2.2.9在Firefox中的安装
  9. 如何搭建一个企业级BI?
  10. android抓包工具——fiddler与charles的基本操作(弱网模拟,map local/remote、breakpoint 等)