残差网络 订阅
残差网络是由来自Microsoft Research的4位学者提出的卷积神经网络,在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题 [1]  。 展开全文
残差网络是由来自Microsoft Research的4位学者提出的卷积神经网络,在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题 [1]  。
信息
提出时间
2015年
提出者
Kaiming He,Xiangyu Zhang,
类    型
卷积神经网络
 
Shaoqing Ren,Jian Sun [1]
中文名
残差网络
外文名
Residual Network, ResNet
残差网络背景
该网络出自论文《Deep Residual Learning for Image Recognition》我们都知道增加网络的宽度和深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,比如说一个深的网络A和一个浅的网络B,那A的性能至少都能跟B一样,为什么呢?因为就算我们把B的网络参数全部迁移到A的前面几层,而A后面的层只是做一个等价的映射,就达到了B网络的一样的效果。一个比较好的例子就是VGG,该网络就是在AlexNex的基础上通过增加网络深度大幅度提高了网络性能。对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。退化问题说明了深度网络不能很简单地被很好地优化。作者通过实验:通过浅层网络等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。
收起全文
精华内容
下载资源
问答
  • 残差网络
    2020-07-13 22:05:29

    神经网络的学习主要蕴含在权重和阈值中,多层网络使用上面简单感知机的权重调整规则显然不够用了,BP神经网络算法即误差逆传播算法(error BackPropagation)正是为学习多层前馈神经网络而设计,BP神经网络算法是迄今为止最成功的的神经网络学习算法。
    在神经网络的训练中,理论上是网络深度加深,理论模上可以取得更好的效果。但实验发现,随着网络深度加深,神经网络中存在退化问题
    这种退化问题和过拟合不同,过拟合表现的是训练误差小而测试效果误差大,而现在是训练误差和测试误差都大(需要在巨大的参数空间中执行优化,随意增加层数会导致更大的训练误差)

    RestNet

    RestNet中最重要的就是残差学习单元

    深度学习对于网络深度遇到的主要问题是梯度消失和梯度爆炸,传统对应的解决方案则是数据的初始化(normlized initializatiton)和(batch normlization)正则化,但是这样虽然解决了梯度的问题,深度加深了,却带来了另外的问题,就是网络性能的退化问题,深度加深了,错误率却上升了,而残差用来设计解决退化问题,其同时也解决了梯度问题,更使得网络的性能也提升了。
    残差网络的优点:
    很容易训练,值得是前向和反向都可以保证,线性使得网络加深,可以达到1000层精度提升可以被移植到其他问题
    残差元的主要设计有两个,快捷连接和恒等映射,快捷连接使得残差变得可能,而恒等映射使得网络变深,而恒等映射主要有两个:快捷连接为恒等映射和相加后的激活函数。残差映射也更容易优化。

    • 恒等残差块——The identity block是ResNets中使用的标准块,对应于输入激活与输出激活具有相同维度

    普通网络和残差网络的差别:
    对于残差元来说,前向过程是线性的,而且后面的输入等于输入加上每一次的残差元的结果,而普通的网络,则为每一层卷积的连乘运算;
    残差网络的第一大特点,反向更新解决梯度消失的问题。残差网络在反向传播的时候,则只求链式法则前面的部分,即从第L层的梯度可以基本上保持稳定的传递到第l层反向过程。
    BN的主要思路是对每次前向传播的过程中对数据进行正态分布的归一化调整

    在这里插入图片描述

    更多相关内容
  • 研究者们深入研究其本质并在此基础上提出了很多关于深度残差网络的改进,如宽残差网络,金字塔型残差网络,密集型残差网络,注意力残差网络等等.本文从残差网络的设计出发,分析了不同残差单元的构造方式,介绍了...
  • 针对人脸表情识别,传统方法主要依赖人工提取特征的优劣,算法的鲁棒性较差,而传统卷积神经网络无法提取到更深层次的图像特征,因此该文将采用深度残差网络进行人脸表情识别。ResNet网络主要由残差模块组成,将残差...
  • 残差网络是何凯明大神的神作,效果非常好,深度可以达到1000层。但是,其实现起来并没有那末难,在这里以tensorflow作为框架,实现基于mnist数据集上的残差网络,当然只是比较浅层的。 如下图所示: 实线的...
  • 低分辨率图像输入网络,通过多个多尺度残差模块,在每个模块进行多尺度特征提取、特征融合,构建残差输出到下一个模块,通过所有模块后再次构建残差,最终经过亚像素卷积输出高分辨率图像。实验结果表明,多重残差的引入使...
  • 残差网络 网络随着深度的变深,映射出来的特征越抽象,包含的信息越少(信息论的角度讲,由于DPI(数据处理不等式)的存在,在前向传输的过程中,随着层数的加深,Feature Map包含的图像信息会逐层减少),那么如果...
  • 针对全卷积神经网络多次下采样操作导致的道路边缘细节信息损失和道路提取不准确的问题,本文提出了多尺度特征融合的膨胀卷积残差网络高分一号影像道路提取方法。首先,通过目视解译的方法制作大量的道路提取标签数据;...
  • 残差网络.rar

    2019-06-09 14:26:12
    本文档中包含ResNet50的源文章,网络结构图以及参数文件(h5,可直接使用),帮助大家了解残差网络
  • 深度残差网络.zip

    2020-12-26 09:35:31
    当Microsoft Research发布用于图像识别的深度残差学习时,深度残差网络席卷了深度学习领域。这些网络在ImageNet和COCO 2015竞赛的所有五个主要赛道中均获得了第一名的入围作品,这些竞赛涵盖了图像分类,对象检测和...
  • 为解决现有基于深度学习的行人重识别算法中网络深度过深,网络层间的特征关系利用率、时间效率低等问题,提出了一种基于压缩激励残差网络(SE-ResNet)与特征融合的改进算法。通过引入压缩激励(SE)模块,在特征通道上对...
  • 提出了一种基于改进的深度残差网络(residual network,ResNet)的表情识别算法。采用小卷积核和深网络结构,利用残差模块学习残差映射解决了随着网络深度增加网络精度下降的问题,通过迁移学习方法克服了因数据量...
  • resESPCN 使用残差网络的超分辨率重建ESPCN
  • 针对传统配电绝缘杆障碍物覆盖检测方法存在检测精准度低的问题,提出一种新的基于多尺度残差网络的配电绝缘杆障碍物覆盖检测方法。构建闪络模型,计算外施电路电压,以此研究配电绝缘杆的障碍物覆盖表面闪络机理。...
  • 1.领域:matlab,深度残差网络 2.内容:基于深度残差网络的人脸眼睛定位算法matlab仿真+代码仿真操作视频 3.用处:用于人脸眼睛定位算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用...
  • 为了提高模型在道口环境下的车辆图像的特征提取和识别能力,提出了一种基于改进残差网络的车辆分类方法。首先以残差网络为基础模型,改进了残差块中激活函数的位置,并将残差块中的一般卷积用分组卷积代替,引入注意力...
  • 基于残差网络的训练模型,准确率可以达到99%,测试集有86%
  • 如果对代码有疑问可以看一下我的博客《Pytorch 实现自己的残差网络图片分类器》和压缩包中的README.docx。也欢迎大家在博客下面提问或者指出文中的错误,谢谢大家。
  • CBAM_keras_model_keras_densenet_残差网络_inceptionnet_注意力机制.zip
  • 为了提高行人检测方法的准确率,针对行人图像特征,提出一种基于深度残差网络和YOLO(you only look once)方法的行人检测方法。以加强行人特征表达为目的,通过分析行人在图像中的表达和分布特征,提出一种不影响...
  • 用于伪 3d 残差网络的 Tensorflow 实现。 作者 yfxc 电子邮件 张量流 1.10+(不支持2.0) 介绍 Pseudo-3d-residual-network 主要用于动作识别,论文网址: : 这是张量流版本。 准备自己的数据集。 假设您将要...
  • 残差网络的空间自适应计算时间该代码实现了基于残差网络的深度学习架构,该架构可动态调整图像区域的已执行层数。 该体系结构是端到端可训练的,确定性的且与问题无关的。 随附的代码将此应用于CIFAR-10和ImageNet...
  • 利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输出的数值更稳定。 1.全连接层的批量归一化 前两条公式是一个全连接层的普通实现方式,批量归一化的过程处在两条公式之间...
  • 伪三维残差网络(P-3D)的pytorch版本,支持预训练模型...........................................
  • TensorFlow中的可逆残差网络TensorFlow实现,这是一个残差网络系列,可以通过对其残差块的Lipschitz常数实施强制使其变为可逆状态。安装首先,我们需要使用virtualenv创建我们的Python 3.6虚拟环境,并安装存储在...
  • 使用keras自定义残差网络,以MNIST数据集分类为例,为帮助读者了解残差网络的实现,仅使用简单的全连接层
  • 基于LSTM与改进残差网络优化的异常流量检测方法.docx
  • 采用更深层的残差神经网络(ResNet)替代VGG-19网络作为特征提取工具,首先将ResNet-50中的特殊附加层结构和卷积层特征进行融合,得到鲁棒性更强的目标表征特征。然后对特征进行相关滤波操作,根据最大响应值确定目标位置...
  • 基于残差网络和度量学习的素描人脸识别.pdf
  • 详解ResNet残差网络

    2021-05-25 09:55:02
    那么,网络的精度会随着网络的层数增多而增多吗?在深度学习中,网络层数增多一般会伴着下面几个问题 计算资源的消耗 模型容易过拟合 梯度消失/梯度爆炸问题的产生 问题1可以通过GPU集群来解决,对于一个企业资源...

    在VGG中,卷积网络达到了19层,在GoogLeNet中,网络史无前例的达到了22层。那么,网络的精度会随着网络的层数增多而增多吗?在深度学习中,网络层数增多一般会伴着下面几个问题

    1. 计算资源的消耗
    2. 模型容易过拟合
    3. 梯度消失/梯度爆炸问题的产生

    问题1可以通过GPU集群来解决,对于一个企业资源并不是很大的问题;问题2的过拟合通过采集海量数据,并配合Dropout正则化等方法也可以有效避免[4];问题3通过Batch Normalization也可以避免。貌似我们只要无脑的增加网络的层数,我们就能从此获益,但实验数据给了我们当头一棒。

    作者发现,随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。

    当网络退化时,浅层网络能够达到比深层网络更好的训练效果,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差,或者说如果一个VGG-100网络在第98层使用的是和VGG-16第14层一模一样的特征,那么VGG-100的效果应该会和VGG-16的效果相同。所以,我们可以在VGG-100的98层和14层之间添加一条直接映射(Identity Mapping)来达到此效果。

    从信息论的角度讲,由于DPI(数据处理不等式)的存在,在前向传输的过程中,随着层数的加深,Feature Map包含的图像信息会逐层减少,而ResNet的直接映射的加入,保证了  层的网络一定比  层包含更多的图像信息。

    基于这种使用直接映射来连接网络不同层直接的思想,残差网络应运而生。

    1. 残差网络

    1.1 残差块

    残差网络是由一系列残差块组成的(图1)。一个残差块可以用表示为:

     

    残差块分成两部分直接映射部分和残差部分。  是直接映射,反应在图1中是左边的曲线;  是残差部分,一般由两个或者三个卷积操作构成,即图1中右侧包含卷积的部分。

    图1:残差块

    图1中的Weight在卷积网络中是指卷积操作,addition是指单位加操作。

    在卷积网络中,  可能和  的Feature Map的数量不一样,这时候就需要使用  卷积进行升维或者降维(图2)。这时,残差块表示为:

     

    其中  。其中  是  卷积操作,但是实验结果  卷积对模型性能提升有限,所以一般是在升维或者降维时才会使用。

    图2:1*1残差块

    一般,这种版本的残差块叫做resnet_v1,keras代码实现如下:

    def res_block_v1(x, input_filter, output_filter):
        res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x)
        res_x = BatchNormalization()(res_x)
        res_x = Activation('relu')(res_x)
        res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
        res_x = BatchNormalization()(res_x)
        if input_filter == output_filter:
            identity = x
        else: #需要升维或者降维
            identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
        x = keras.layers.add([identity, res_x])
        output = Activation('relu')(x)
        return output

    1.2 残差网络

    残差网络的搭建分为两步:

    1. 使用VGG公式搭建Plain VGG网络
    2. 在Plain VGG的卷积网络之间插入Identity Mapping,注意需要升维或者降维的时候加入  卷积。

    在实现过程中,一般是直接stack残差块的方式。

    def resnet_v1(x):
        x = Conv2D(kernel_size=(3,3), filters=16, strides=1, padding='same', activation='relu')(x)
        x = res_block_v1(x, 16, 16)
        x = res_block_v1(x, 16, 32)
        x = Flatten()(x)
        outputs = Dense(10, activation='softmax', kernel_initializer='he_normal')(x)
        return outputs

     

    1.3 为什么叫残差网络

    在统计学中,残差和误差是非常容易混淆的两个概念。误差是衡量观测值和真实值之间的差距,残差是指预测值和观测值之间的差距。对于残差网络的命名原因,作者给出的解释是,网络的一层通常可以看做  , 而残差网络的一个残差块可以表示为  ,也就是  ,在单位映射中,  便是观测值,而  是预测值,所以  便对应着残差,因此叫做残差网络。

    2. 残差网络的背后原理

    残差块一个更通用的表示方式是

     

     

    现在我们先不考虑升维或者降维的情况,那么在[1]中,  是直接映射,  是激活函数,一般使用ReLU。我们首先给出两个假设:

    • 假设1:  是直接映射;
    • 假设2:  是直接映射。

    那么这时候残差块可以表示为:

    对于一个更深的层  ,其与  层的关系可以表示为

    这个公式反应了残差网络的两个属性:

    1.  层可以表示为任意一个比它浅的l层和他们之间的残差部分之和;
    2.  , 是各个残差块特征的单位累和,而MLP是特征矩阵的累积。

    根据BP中使用的导数的链式法则,损失函数 关于  的梯度可以表示为

    上面公式反映了残差网络的两个属性:

    1. 在整个训练过程中,  不可能一直为  ,也就是说在残差网络中不会出现梯度消失的问题。
    2.  表示  层的梯度可以直接传递到任何一个比它浅的  层。

    通过分析残差网络的正向和反向两个过程,我们发现,当残差块满足上面两个假设时,信息可以非常畅通的在高层和低层之间相互传导,说明这两个假设是让残差网络可以训练深度模型的充分条件。那么这两个假设是必要条件吗?

    2.1 直接映射是最好的选择

    对于假设1,我们采用反证法,假设  ,那么这时候,残差块(图3.b)表示为

     

    对于更深的L层

     

    为了简化问题,我们只考虑公式的左半部分  ,损失函数  对  求偏微分得

     

    上面公式反映了两个属性:

    1. 当  时,很有可能发生梯度爆炸;
    2. 当  时,梯度变成0,会阻碍残差网络信息的反向传递,从而影响残差网络的训练。

    所以  必须等1。同理,其他常见的激活函数都会产生和上面的例子类似的阻碍信息反向传播的问题。

    对于其它不影响梯度的  ,例如LSTM中的门机制(图3.c,图3.d)或者Dropout(图3.f)以及[1]中用于降维的  卷积(图3.e)也许会有效果,作者采用了实验的方法进行验证,实验结果见图4

    图3:直接映射的变异模型

    图4:变异模型(均为110层)在Cifar10数据集上的表现

    从图4的实验结果中我们可以看出,在所有的变异模型中,依旧是直接映射的效果最好。下面我们对图3中的各种变异模型的分析

    1. Exclusive Gating:在LSTM的门机制中,绝大多数门的值为0或者1,几乎很难落到0.5附近。当  时,残差块变成只有直接映射组成,阻碍卷积部分特征的传播;当  时,直接映射失效,退化为普通的卷积网络;
    2. Short-cut only gating:  时,此时网络便是[1]提出的直接映射的残差网络;  时,退化为普通卷积网络;
    3. Dropout:类似于将直接映射乘以  ,所以会影响梯度的反向传播;
    4.  conv:  卷积比直接映射拥有更强的表示能力,但是实验效果却不如直接映射,说明该问题更可能是优化问题而非模型容量问题。

    所以我们可以得出结论:假设1成立,即

     

    2.2 激活函数的位置

    [1] 提出的残差块可以详细展开如图5.a,即在卷积之后使用了BN做归一化,然后在和直接映射单位加之后使用了ReLU作为激活函数。

    图5:激活函数在残差网络中的使用

    在2.1节中,我们得出假设“直接映射是最好的选择”,所以我们希望构造一种结构能够满足直接映射,即定义一个新的残差结构  :

     

    上面公式反应到网络里即将激活函数移到残差部分使用,即图5.c,这种在卷积之后使用激活函数的方法叫做post-activation。然后,作者通过调整ReLU和BN的使用位置得到了几个变种,即5.d中的ReLU-only pre-activation和5.d中的 full pre-activation。作者通过对照试验对比了这几种变异模型,结果见图6。

    图6:基于激活函数位置的变异模型在Cifar10上的实验结果

    而实验结果也表明将激活函数移动到残差部分可以提高模型的精度。

    该网络一般就在resnet_v2,keras实现如下:

    def res_block_v2(x, input_filter, output_filter):
        res_x = BatchNormalization()(x)
        res_x = Activation('relu')(res_x)
        res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
        res_x = BatchNormalization()(res_x)
        res_x = Activation('relu')(res_x)
        res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
        if input_filter == output_filter:
            identity = x
        else: #需要升维或者降维
            identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
        output= keras.layers.add([identity, res_x])
        return output
    
    def resnet_v2(x):
        x = Conv2D(kernel_size=(3,3), filters=16 , strides=1, padding='same', activation='relu')(x)
        x = res_block_v2(x, 16, 16)
        x = res_block_v2(x, 16, 32)
        x = BatchNormalization()(x)
        y = Flatten()(x)
        outputs = Dense(10, activation='softmax', kernel_initializer='he_normal')(y)
        return outputs

     

    3.残差网络与模型集成

    Andreas Veit等人的论文[3]指出残差网络可以从模型集成的角度理解。如图7所示,对于一个3层的残差网络可以展开成一棵含有8个节点的二叉树,而最终的输出便是这8个节点的集成。而他们的实验也验证了这一点,随机删除残差网络的一些节点网络的性能变化较为平滑,而对于VGG等stack到一起的网络来说,随机删除一些节点后,网络的输出将完全随机。

    图7:残差网络展开成二叉树

    Reference

    [1] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

    [2] He K, Zhang X, Ren S, et al. Identity mappings in deep residual networks[C]//European Conference on Computer Vision. Springer, Cham, 2016: 630-645.

    [3] Veit A, Wilber M J, Belongie S. Residual networks behave like ensembles of relatively shallow networks[C]//Advances in Neural Information Processing Systems. 2016: 550-558.

    [4]. Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: a simple way to prevent neural networks from overfitting. In JMLR, 2014.

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,755
精华内容 17,102
关键字:

残差网络