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

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

首先,我们把网络层看成是映射函数。(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. Google 出品的 Java 编码规范,权威又科学,强烈推荐
  2. Java,Math类中的ceil、floor和round函数源码解析以及自己重写实现
  3. javaweb学习总结——基于Servlet+JSP+JavaBean开发模式的用户登录注册
  4. redis存opc_Redis集群的三种模式
  5. python3.4学习笔记(九) Python GUI桌面应用开发工具选择
  6. 计算机视觉论文-2021-06-18
  7. Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
  8. telegram bots 开发者文档 简介
  9. NanoHTTPD服务
  10. JavaCV 第一个JavaCV程序
  11. XVII Open Cup Eastern Grand Prix - J Votter and Paul De Mort
  12. phpStorm2018安装与破解(免安装打包版)
  13. 筛选后系列填充_案例分享10——如何在筛选后的表格中粘贴数据(二)
  14. 第二十五届全国青少年信息学奥林匹克联赛初赛
  15. 《东周列国志》第七十五回 孙武子演阵斩美姬 蔡昭侯纳质乞吴师
  16. 【JavaScript笔记 · 基础篇(五)】Array全家桶(引用数据类型中的数组 / Array对象 / Array.prototype)
  17. 西门子服务器提升抱闸信号不输出,SINAMICS V90伺服抱闸接线及配置详解
  18. 五大浏览器:chrome---Blink IE--Trident firebox--Gecko safari--Webkit opera--Blink
  19. 修改网页视频播放速度
  20. java程序购买_JAVA(二) ——购买商品简单程序

热门文章

  1. 2020 年 Python 知识清单(数据科学)
  2. ros学习(一):建立工作空间
  3. 关于CAN总线的终端电阻
  4. 进存销是什么?进存销业务流程有哪些?
  5. 剧本翻译之SHUFFLE【前奏】
  6. php实现token验证,PHP如何实现Token验证
  7. 研发为剑,优声云立志做更好用的外卖打印机
  8. Kali Httrack
  9. 【商标注册】怎么注册商标?2014商标注册费用大概多少?
  10. 关于纯洁的微笑《Spring Boot(七):Mybatis 多数据源最简解决方案》文章补充说明多数据源事务的配置