导读

ResNet在ILSVRC 2015竞赛中大放异彩,其核心模块residual block使得卷积网络模型深度提高一个数量级,到达上百、上千层。在今天cv领域我们也经常用到它或它的变种,paper《Deep Residual Learning for Image Recognition

论文中第一张图点出了论文要解决的问题:

左边是训练误差,右边是测试误差,可见将20层网络简单地加深到56层后,并没有带来精度的提升,反而会导致模型的退化。(这里不是过拟合,因为其训练误差也增大了)

那么为什么加深网络会带来退化问题呢?理论上来说,即使新增的网络层什么都没学到,保持恒等输出(所有的weight都设为1),那网络的精度也应该等于原有未加深时的水平,如果新增的网络层学习到了有用特征,那么加深过后的模型精度必然会大于未加深的原网络。

实际上,让新增的网络层在训练过程中每一层都通过了线性修正单元relu处理,而这样的处理方式必然带来特征的信息损失,让其保持什么都不学习的恒等状态,恰恰很困难,因此,简单的堆叠layer必然会带来退化问题。

ResNet解决思想:既然让新增的层保持恒等映射很困难,那就额外增添一条路(identity)来保持恒等,如下图所示,

解释一下这个图,这里假设原有网络结构的映射为H(X),输出为X,,这里又添加了两个layer,在网络中的映射称为F(x)。既然新增layer保持不了恒等性,那我们可以通过跳跃连接来直接跳过它们来保持恒等;这里的融合操作只是单纯的相加,新结构的输出为F(x) + x ,原来结构的输出为x,这一目了然,即使最坏的情况,新加的层不会使网络更优,也不会出现退化的情况,相反新加的层如果提取到了更有用的特征,则模型效果会变好,真正实现了网络的精度加深后 >= 加深前,我们只需要优化F(x),使其趋于0即可,而使得F(x)接近0是相对比较容易的(无论是从权重初始化的角度还是通过激活函数) 虽然新增的F(x)不容易保持恒等,但让其尽量靠近0,还是相对容易做到的,这种训练方式称为残差学习,这种结构块也称为Residual Block残差块。正是残差结构的出现,使得残差网络能很好的加深网络层数,同时解决退化问题。

网络结构

论文列出了VGG、未加残差连接与加残差连接的网络结构示意图(我这里截一部分网络结构图)

在上图中实线代表普通的残差连接,虚线表示需要变换张量形状的残差连接,对于通道数不一致的情况,作者给出两种方法:一是往多出来的通道数里填0;二是使用1x1的卷积,对于大小的减半,都使用步幅为2的操作来实现减半。

这是不同层数的ResNet架构,可以看到是由一些残差块堆叠而成,与AlexNet、VGG这些不同,使用了Average pool代替了全连接层,同时也没有使用droput操作,之后再连接一层1000个神经元的全连接层,最后再接上一个Softmax。。

下图中左侧图是18-layer、34-layer残差块的连接结构,右侧则是50、101、152的残差结构,为了减少运算复杂度,输入进来先降维,再升维,这样由于其输入输出维度不同,需要1x1卷积进行维度转换:

实验分析

实现细节

与AlexNet一致的数据处理有:像素归一化(减去每像素平均)、标准颜色增强、裁剪成 224x224;其他操作:随机缩放图像短边至 [256, 480] 中的均匀随机值、随机翻转

在测试中,采用标准的10-crop测试(对图像裁剪10次,把输入分别输入网络,取结果的平均值)为了得到最好的结果,采用VGG中的全卷积模式,在多个尺度平均分数。(图像尺寸最短边被重整为{224,256,384,480,640})。感觉是为了打比赛弄的操作,现在一般不用

激活函数前加入BN操作,参数初始化使用 He Initialization,使用SGD优化算法,mini-batch为256。学习率初始为0.1,当错误率下降遇到瓶颈时(曲线不再下降时)便降低10倍,我们使用权重衰减0.0001以及momentum设为0.9。不使用dropout(没有使用全连接)。

作者做了一些消融实验和对比实验,

不同深度的ResNet对比:

可以看见,随着网络层数的增加,精度提升,表明残差块结构对深层神经网络的退化现象有效。

我们看一个消融实验:

这个实验作者想比较当输入输出维度不一样时,哪种结构的残差连接效果更好,A: 使用0填充来增添维度 B:当有维度变换时,使用1x1的卷积,没有则用恒等连接 C: 全部使用1x1的卷积;作者认为,B相对A更好,是因为通道数变化时0填充的部分没有残差学习,C相对B更好,是因为参数更多了,但精度没有很多改变,因此使用的B。

论文总结

  1. 解决了随着网络结构的加深,模型出现退化的情况,利用残差结构让网络能够更深、收敛速度更快、优化更容易,同时参数相对之前的模型更少、复杂度更低;
  2. 网络结构在卷积层后没有连接几个全连接层,没有使用dropout,而是一个全局池化
  3. 激活层前使用BN

代码实现

手动搭建了ResNet18、ResNet34、ResNet50、ResNet101、ResNet152,并在和之前AlexNet、VGG同样的数据集上训练与测试,代码在github

论文日记三:ResNet的更多相关文章

  1. oracle入坑日记<三>用户详解(角色理解)

    1   用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...

  2. [论文理解]关于ResNet的进一步理解

    [论文理解]关于ResNet的理解 这两天回忆起resnet,感觉残差结构还是不怎么理解(可能当时理解了,时间长了忘了吧),重新梳理一下两点,关于resnet结构的思考. 要解决什么问题 论文的一大贡 ...

  3. 【社交系统ThinkSNS+研发日记三】基于 Laravel Route 的 ThinkSNS+ Component

    [社交系统ThinkSNS+研发日记系列] 一.<ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1> 二.<基于 Laravel 开发 Th ...

  4. 【LaTeX排版】LaTeX论文排版<三>

    A picture is worth a thousand words(一图胜千言).图在论文中的重要性不言而喻,本文主要讲解图的制作与插入. 1.图像的插入     图像可以分为两大类:位图和向量图 ...

  5. Python学习日记(三十八) Mysql数据库篇 六

    Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...

  6. Python学习日记(三十六) Mysql数据库篇 四

    MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...

  7. Python学习日记(三十四) Mysql数据库篇 二

    外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...

  8. Python学习日记(三十三) Mysql数据库篇 一

    背景 Mysql是一个关系型数据库,由瑞典Mysql AB开发,目前属于Oracle旗下的产品.Mysql是目前最流行的关系型数据库管理系统之一,在WEB方面,Mysql是最好的RDBMS(Relat ...

  9. Linux管理日记(三)

    23. 时间同步 同步时间可以使用 root 执行如下命令完成: rdate -s time.nist.gov 如果需要自动同步,可以采用crontab自动调度,每小时执行一次:  编辑 cronta ...

  10. Linux(Ubuntu)使用日记(三)------git安装使用

    1. 安装 首先,确认你的系统是否已安装git,可以通过git指令进行查看,如果没有,在命令行模式下输入sudo apt-get install git命令进行安装. 2.  配置 git confi ...

随机推荐

  1. 网络框架重构之路plain2.0(c++23 without module) 环境

    接下来本来就直接打算分享框架重构的具体环节,但重构的代码其实并没有完成太多,许多的实现细节在我心中还没有形成一个定型.由于最近回归岗位后,新的开发环境需要自己搭建,搭建的时间来说花了我整整一天的时间才 ...

  2. 云原生2.0网关API标准发展趋势

    摘要:Gateway API希望取代Ingress API. 本文分享自华为云社区<云原生2.0网关API标准发展趋势>,作者:华为云云原生团队 . 云原生网关API标准背景及发展现状 G ...

  3. VUE3企业级项目基础框架搭建流程(1)

    开发环境和技术栈 操作系统 windows11 开发工具 vscode.phpstudy(小皮):nginx1.15.11, mysql5.7.26, php7.4,Navicat for MySQL ...

  4. ROS2的安装与使用(超详细图文教程)

    ROS2的安装与使用(超详细图文教程) 如果前面的虚拟机以及Ubuntu22.04镜像都安装好了,根据目录直接跳到ROS2的安装. 资料参考于:古月居 VMware虚拟机的安装 安装地址: 对于不了解 ...

  5. 尝试CentOS8---部署集群(生产环境7.9为好)

    一.LVS集群简介 什么是集群 通过网络将很多服务器集中起来,提供同一种服务,在客户端看来就像是只有一个服务器 二.LVS-NAT集群 1.环境准备 启动3台虚拟机,禁用selinux和firewal ...

  6. [Pytorch框架] 4.3 fastai

    文章目录 4.3 fastai 4.3.1 fastai介绍 fastai库 fast.ai课程 Github 4.3.2 fastai实践 MNIST 4.3.3 fastai文档翻译 import ...

  7. [OpenCV-Python] 24 模板匹配

    文章目录 OpenCV-Python:IV OpenCV中的图像处理 24 模板匹配 24.1 OpenCV 中的模板匹配 24.2 多对象的模板匹配 OpenCV-Python:IV OpenCV中 ...

  8. Python + 超级鹰 识别图形验证码

    前言: 一.下载 1.进入官网:http://www.chaojiying.com/,注册完成后,进行登录 2.点击开发文档,点击Python语言示例 3.进行示例下载 4.解压后的文件 注:关注公众 ...

  9. 沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 沁恒 CH32V208 ...

  10. 深入理解 slab cache 内存分配全链路实现

    本文源码部分基于内核 5.4 版本讨论 在经过上篇文章 <从内核源码看 slab 内存池的创建初始化流程> 的介绍之后,我们最终得到下面这幅 slab cache 的完整架构图: 本文笔者 ...