精华内容
下载资源
问答
  • 深度残差网络
    2022-03-05 15:33:39


    前言

    图像分类是计算机视觉任务的基石,在目标监测、图像分割等任务中需要使用骨干网咯,将浅层的视觉特征映射到深层的语义特征,以发现高层数据的分布式特征表示。在ILSVRC2015分类任务竞赛中,由何恺明提出的深度残差网络ResNet首次超越人类水平,斩获竞赛第一名的同时并拿到2016年CVPR最佳论文。

    一、提出ResNet原因

    网络是不是越深越好?直到把计算机的性能榨干为止。而在实验中可以发现,随着网络加深,训练集的错误率反而更高,这种现象被称作为“网络退化”。从下图中可以看出,无论是训练集还是验证集,56层的网络比20层的网络都更差,这是因为在运用链式法则反向传播时,梯度或消失、或爆炸。

    在这里插入图片描述

    二、深度残差模块

    1.数学理论基础

    复杂问题简单解决,公式 F ( x ) + x F(x)+x F(x)+x在不添加可学习参数的前提下提升了网络性能。极端情况下,权重层(weight layer)已经收敛不再更新任何参数,“网络退化”说明 F ( x ) F(x) F(x)通道向着变坏的方向迭代,而添加的恒等映射(Identity)仅复制上一层的输出特征,一定程度上阻碍了更坏的情况发生。有点类似物理学中的楞次定律,若权重层的网络是不断进化的,恒等映射则同样阻碍更好的情况发生。 y l = h ( x l ) + F ( x l , W l ) x l + 1 = f ( y l ) \begin{gathered} \mathbf{y}_{l}=h\left(\mathbf{x}_{l}\right)+\mathcal{F}\left(\mathbf{x}_{l}, \mathcal{W}_{l}\right) \\ \mathbf{x}_{l+1}=f\left(\mathbf{y}_{l}\right) \end{gathered} yl=h(xl)+F(xl,Wl)xl+1=f(yl)
    在这里插入图片描述

    2.深度网络结构

    只要保证 F ( x ) F(x) F(x) x x x相加时的张量维度保持一致,就可以构造出残差模块block,以卷积神经网络为例,[kernel, stride, padding]=[1×1,1,0]和[3×3,1,1]均不会改变张量维度,可以根据图像尺寸大小适当调整卷积核算子,何恺明在论文中给出了几种经典的构造方式,如:resnet50和resnet101。
    在这里插入图片描述

    三、Pytorch代码实现

    论文代码复现tips:Block模块应保证输入和输出的张量维度一致,即C=256、512、1024、2048,卷积核的运算亦不会改变特征图的尺寸。flatten展开前使用AdaptiveAvgPool2d将特征图尺寸降为[1, 4096, 1, 1],接fc层就不用考虑维度变换问题。以下代码为resnet50:

    import torch
    import torch.nn as nn
    
    class Block(nn.Module):
        def __init__(self, in_channels, out_channels):
            super(Block, self).__init__()
            self.conv1 = nn.Conv2d(out_channels, in_channels, 1, 1, 0)
            self.bn1 = nn.BatchNorm2d(in_channels)
            self.conv2 = nn.Conv2d(in_channels, in_channels,  3, 1, 1)
            self.bn2 = nn.BatchNorm2d(in_channels)
            self.conv3 = nn.Conv2d(in_channels, out_channels, 1, 1, 0)
            self.bn3 = nn.BatchNorm2d(out_channels)
            self.relu = nn.ReLU()
            
        def forward(self, input):
            x = input
            f_x = self.bn1(self.conv1(x))
            f_x = self.bn2(self.conv2(f_x))
            f_x = self.bn3(self.conv3(f_x))
            out = self.relu(x + f_x)		#精华
            return out
    
    class Resnet(nn.Module):
        def __init__(self, n_classes=1000, input_channels=3):
            super(Resnet, self).__init__()
            self.conv0 = nn.Conv2d(input_channels, 64, kernel_size=7, stride=2, padding=3)
            self.bn0 = nn.BatchNorm2d(64)
            self.relu0 = nn.ReLU()
            self.conv1 = nn.Conv2d(64, 256, 1, 1, 0)
            self.bn1 = nn.BatchNorm2d(256)
            self.relu1 = nn.ReLU()
            self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
            
            self.layer1 = self._make_layer(64, 256, 3)
            self.layer2 = self._make_layer(128, 512, 4)
            self.layer3 = self._make_layer(256, 1024, 6)
            self.layer4 = self._make_layer(512, 2048, 3)
            
            self.avgpool = nn.AdaptiveAvgPool2d(output_size=1)
            self.flatten = nn.Flatten(start_dim=1, end_dim=-1)
            self.fc = nn.Linear(4096, n_classes)
            
        def _make_layer(self, in_channels, out_channels, num):
            layers = []
            for _ in range(0, num):
                layers.append(Block(in_channels, out_channels))
            layers.append(nn.Sequential(
                nn.Conv2d(out_channels, out_channels*2, 1, 1, 0),
                nn.BatchNorm2d(out_channels*2),
                nn.MaxPool2d(2, 2, 0)))
            return nn.Sequential(*layers)
            
        def forward(self, input):
            x = self.relu0(self.bn0(self.conv0(input)))
            x = self.relu1(self.bn1(self.conv1(x)))
            x = self.maxpool(x)
            x = self.layer1(x)
            x = self.layer2(x)
            x = self.layer3(x)
            x = self.layer4(x)
            x = self.avgpool(x)
            x = self.flatten(x)
            x = self.fc(x)
            return x
        
    def main():
        ins = torch.randn(1, 3, 224, 224)
        model = Resnet()
        out = model(ins)
        print('out shape:', out.shape)
        
    if __name__ == '__main__':
        main()
    """
    out shape: torch.Size([1, 1000])
    """
    

    四、总结

    开源框架(Pytorch、PaddlePaddle)都具有Resnet模型的库函数,开发者可以直接调用函数名来训练模型,对于不同场景的任务需求甚至都有预训练好的参数文件。作者在复现代码的过程中,并非一成不变地搬运code,只是保证在每个阶段的输出维度保持一致,对于图像分类任务的精度表现,有待进一步实践验证,越来越想揭开MobileNetShffuleNet的面纱。

    更多相关内容
  • 近年来,由于计算机技术的飞速迅猛发展,特别是硬件条件的改善,计算能力不断提高,深层神经网络训练的时间大大缩短,深度残差网络也迅速成为一个新的研究热点.深度残差网络作为一种极深的网络架构,在精度和收敛等...
  • 为了提高行人检测方法的准确率,针对行人图像特征,提出一种基于深度残差网络和YOLO(you only look once)方法的行人检测方法。以加强行人特征表达为目的,通过分析行人在图像中的表达和分布特征,提出一种不影响...
  • 这是深度收缩残差网络的pytorch版本的完整实现。数据集为江南大学轴承数据集。
  • 深度残差网络

    2022-02-13 11:32:37
    在较深层数的神经网络中,梯度信息由网络的末层逐层传向网络的首层时, 传递的过程中会出现梯度接近于 0 或梯度值非常大的现象 怎么解决深层神经网络的梯度弥散和梯度爆炸现象呢?既然浅层神经网络不容易出现梯度...

    AlexNet、 VGG、 GoogLeNet 等网络模型的出现将神经网络的发展带入了几十层的阶段,网络的层数越深,越有可能获得更好的泛化能力。但是当模型加深以后,网络变得越来越难训练,这主要是由于梯度弥散梯度爆炸现象造成的。在较深层数的神经网络中,梯度信息由网络的末层逐层传向网络的首层时, 传递的过程中会出现梯度接近于 0 或梯度值非常大的现象


    怎么解决深层神经网络的梯度弥散和梯度爆炸现象呢?既然浅层神经网络不容易出现梯度现象,那么可以尝试给深层神经网络添加一种回退到浅层神经网络的机制当深层神经网络可以轻松地回退到浅层神经网络时,深层神经网络可以获得与浅层神经网络相当的模型性能
     

    一、残差网络模型

    通过在输入和输出之间添加一条直接连接的 Skip Connection 可以让神经网络具有回退的能力

    以 VGG13 深度神经网络为例, 假设观察到 VGG13 模型出现梯度弥散现象,而10 层的网络模型并没有观测到梯度弥散现象,那么可以考虑在最后的两个卷积层添加 SkipConnection,通过这种方式, 网络模型可以自动选择是否经由这两个卷积层完成特征变换,还是直接跳过这两个卷积层而选择 Skip Connection,亦或结合两个卷积层和 Skip Connection 的输出

    基于 Skip Connection 的深度残差网络(Residual Neural Network,简称 ResNet)算法,并提出了 18 层、 34 层、 50 层、 101层、 152 层的 ResNet-18、 ResNet-34、 ResNet-50、 ResNet-101 和 ResNet-152 等模型

    ResNet 通过在卷积层的输入和输出之间添加 Skip Connection 实现层数回退机制,输入𝒙通过两个卷积层,得到特征变换后的输出ℱ(𝒙),与输入𝒙进行对应元素的相加运算,得到最终输出ℋ(𝒙):
    ℋ(𝒙) = 𝒙 + ℱ(𝒙),ℋ(𝒙)叫作残差模块(Residual Block,简称 ResBlock)。由于被 Skip Connection 包围的卷积神经网络需要学习映射ℱ(𝒙) = ℋ(𝒙) - 𝒙,故称为残差网络

    为了能够满足输入𝒙与卷积层的输出ℱ(𝒙)能够相加运算,需要输入𝒙的 shape 与ℱ(𝒙)的shape 完全一致。当出现 shape 不一致时一般通过在 Skip Connection 上添加额外的卷积运算环节将输入𝒙变换到与ℱ(𝒙)相同的 shape,如图identity(𝒙)函数所示,其中identity(𝒙)以 1×1 的卷积运算居多,主要用于调整输入的通道数

    深度残差网络通过堆叠残差模块,达到了较深的网络层数,从而获得了训练稳定、性能优越的深层网络模型
     

     二、ResBlock 实现

    深度残差网络没有增加新的网络层类型,只是通过在输入和输出之间添加一条 Skip Connection, 并没有针对 ResNet 的底层实现。 在 TensorFlow 中通过调用普通卷积层即可实现残差模块。

    首先创建一个新类,在初始化阶段创建残差块中需要的卷积层、 激活函数层等

    # 残差模块类
    class BasicBlock(layers.Layer):
        def __init__(self, filter_num, stride=1):
            super(BasicBlock, self).__init__()
            # f(x)包含两个普通卷积层
            self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')
            self.bn1 = layers.BatchNormalization()
            self.relu = layers.Activation('relu')
    
            self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')
            self.bn2 = layers.BatchNormalization()
    
            # f(x) 与 x 形状不同,无法相加
            if stride != 1:  # 不相等,插入identity层
                self.downsample = Sequential()
                self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride))
            else:  # 直接相加
                self.downsample = lambda x: x
    
        # 向前传播函数
        def call(self, inputs, training=None):
            out = self.conv1(inputs)
            out = self.bn1(out)
            out = self.relu(out)
            out = self.conv2(out)
            out = self.bn2(out)
            # 输入通过identity()转换
            identity = self.downsample(inputs)
            # f(x) + x
            output = layers.add([out, identity])
            # 再通过激活函数,放在前面也行
            output = tf.nn.relu(output)
            return output

    首先新建ℱ(𝑥)卷积层,当ℱ(𝒙)的形状与𝒙不同时,无法直接相加,我们需要新建identity(𝒙)卷积层,来完成𝒙的形状转换。在前向传播时,只需要将ℱ(𝒙)与identity(𝒙)相加,并添加 ReLU 激活函数即可
     

    RseNet 通过堆叠多个 ResBlock 可以构成复杂的深层神经网络,如ResNet18,ResNet34......

    三、DenseNet

    DenseNet 将前面所有层的特征图信息通过 Skip Connection 与当前层输出进行聚合,与 ResNet 的对应位置相加方式不同, DenseNet 采用在通道轴𝑐维度进行拼接操作, 聚合特征信息

    输入𝑿0 通过H1卷积层得到输出𝑿1, 𝑿1与𝑿0 在通道轴上进行拼接,得到聚合后的特征张量,送入H2卷积层,得到输出𝑿2,同样的方法, 𝑿2与前面所有层的特征信息 𝑿1与𝑿0 进行聚合,再送入下一层。如此循环,直至最后一层的输出𝑿4和前面所有层的特征信息: {𝑿𝑖}𝑖=0, 1, 2, 3进行聚合得到模块的最终输出,  这样一种基于 Skip Connection 稠密连接的模块叫做 Dense Block

    DenseNet 通过堆叠多个 Dense Block 可以构成复杂的深层神经网络
     

    展开全文
  • 深度残差网络demo

    2018-07-24 15:24:12
    vs项目,代码难度并不是很高,使用TensorFlow原生的代码,不过是本人毕设的一套代码,读取文件夹的文件的图片为批次,然后使用批次调用深度残差网络进行训练,并进行保存。压缩包里包含了测试代码,因为本人的是文字...
  • 深度残差网络.zip

    2020-12-26 09:35:31
    当Microsoft Research发布用于图像识别的深度残差学习时,深度残差网络席卷了深度学习领域。这些网络在ImageNet和COCO 2015竞赛的所有五个主要赛道中均获得了第一名的入围作品,这些竞赛涵盖了图像分类,对象检测和...
  • 提出了一种基于改进的深度残差网络(residual network,ResNet)的表情识别算法。采用小卷积核和深网络结构,利用残差模块学习残差映射解决了随着网络深度增加网络精度下降的问题,通过迁移学习方法克服了因数据量...
  • 基于深度残差网络的单通道脑电信号身份识别,安恩莹,苏菲,在多种生物特征识别模态中,用脑电波(Electroencephalogram,EEG)进行身份识别具有抗伪造性和抗胁迫性等诸多优势。单通道脑电信号采集设��
  • 深度残差网络 ResNet

    千次阅读 2022-03-22 19:45:05
    深度残差网络(ResNet)由微软研究院的何恺明、张祥雨、任少卿、孙剑提出。研究动机是为了解决深度网络的退化问题,不同于过去的网络是通过学习去拟合一个分布,ResNet通过学习去拟合相对于上一层输出的残差。实验...

    论文链接:Deep Residual Learning for Image Recognition

    1 前言

    1.1 背景

    深度残差网络(ResNet)由微软研究院的何恺明、张祥雨、任少卿、孙剑提出。研究动机是为了解决深度网络的退化问题,不同于过去的网络是通过学习去拟合一个分布,ResNet通过学习去拟合相对于上一层输出的残差。实验表明,ResNet能够通过增加深度来提升性能,而且易于优化,参数量更少,在许多常用数据集上有非常优秀的表现。ResNet 在2015 年的ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中取得了冠军。

    配合阅读:上述作者在Identity Mappings in Deep Residual Networks中介绍了ResNet易于优化、快速收敛的原因,并且分析几种不同的残差结构

    1.2 问题与挑战

    深度网络在物体检测、语义分割等许多领域上都有重要的需求,它能够提取数据中更高层次的丰富的特征,但直接简单地堆积搭建深度的网络往往无法取得良好的效果,甚至会非常糟糕。

    • 梯度消失/梯度爆炸(Vanishing/Exploding Gradients):随着网络变深(层数增多),反向传播求取梯度的时候,容易发生梯度消失或梯度爆炸的问题。简单的理解就是,通过链式法则反向不断求梯度时,如果每一次求得的结果都小于1,那么相乘之后的结果就会趋近于0,造成梯度消失(梯度爆炸可对应大于1的情况)。该问题阻碍了算法初期的收敛,会使得训练速度变慢,甚至无法收敛。相关研究表明,通过适当的权重初始化和归一化(常用Batch Normalization,简称BN)可以有效解决这个问题。
    • 退化问题(Degradation Problem):该问题是ResNet聚焦解决的问题,指的是深度网络的性能不如浅层网络的问题,网络加深并没有带来性能的提高。网络退化不是由梯度消失/梯度爆炸/过拟合导致的,因为过拟合的表现是算法在训练集上的误差低,而在测试集上的误差高,但退化的网络在训练集与测试集上的误差都高。
    图1.1 网络退化

    1.3 思考与尝试

    对于退化问题,既然浅层网络的性能优于深度网络,那么不妨做这样的一个构建。假设我们已经有了一个浅层网络,并且由输入得到了输出,那么当构建与之相对应的深度网络时,我们直接在原浅层网络的基础上连接一系列的恒等映射层(Identity Mapping),使得输入与输出完全相同,这样一来,虽然网络的层数增加了,但输出结果仍然与浅层网络的结果一致,那么至少可以保证深度网络的性能不会比浅层网络差。但这样的做法仅在理论上成立,在实际过程中,网络训练往往难以拟合恒等映射,因为在训练过程中网络总会学习某些权重、总要做出一些改变。为此,论文作者提出了一种深度残差学习框架用于解决退化问题。

    2 ResNet 基本理论

    2.1 残差学习(Residual Learning)

    图2.1 残差块                    

     假设是需要学习得到的底层映射(不一定是整个网络的,可以是局部层次的),ResNet并没有让网络层去直接拟合,而是去拟合相对于x的残差,最后将残差与输入相加就可以得到。图2.1中,曲线表示的是恒等映射(也称为Shortcut Connection短路连接/Skip Connection),左边的网络用于拟合残差,两条路径汇合时,结果相加再激活。相加(需要保证两者的shape与channel是相同的)的操作既不会增加参数,也不会增加模型复杂度。拟合残差往往比拟合底层映射要容易,网络通常难以拟合恒等映射。在某种极端情况下,当恒等映射达到最优,即上一层的输出结果已经最佳时,残差部分的权重可以直接置为0,这时恒等映射就是底层映射。这说明拟合残差确实能够实现恒等映射,在大多数情况下,恒等映射往往无法达到最优,这时就需要通过残差模块进行修正。

    万能近似定理:人工智能领域的著名定理,指的是只要有一个隐含层的神经网络,理论上就可以拟合任何函数,不论这个函数有多复杂。

     2.2 通过短路连接实现恒等映射(Identity Mapping by Shortcuts)

    用数学公式表达图2.1中最后相加的环节就是

                        图2.2 短路连接效果的数学表示

     其中\sigma代表激活函数。偏置(bias)通常是被忽略掉的,当添加有BN层时,则完全不需要偏置,因为它不会发挥作用,反而添加了多余的参数。

    有时左侧网络与恒等映射的输出维度并不一致,这时候就需要使用一个方阵(做卷积操作)来调整恒等映射的输出维度,使得两者能够相加,这时图2.2中的式子就变为:

     【注意】该方阵仅用于匹配维度,在Identity Mappings in Deep Residual Networks中,实验表明采用恒等映射的效果是最好的,使用该方阵反而会增加了参数。

     3 网络架构

                                                            图3.1 34层的残差网络                                                                                             
    •  以34层的残差网络为例,不同的颜色将网络分成不同的块(Block),颜色块中设置多个残差块,不同的颜色块之间涉及通道维度的变化。
    • 跨越不同颜色块时,采用stride为2的卷积核取代下采样层
                                                      图3.2 Shortcut Connection                                                         

    在图3.1当中,可以发现存在两种Shortcut Connection的类型:

    • 实线类型:第一个粉色块的输出与第三个粉色块的输出channel数相同,都为64,故Shortcut Connection为恒等映射,无需进行维度匹配
    • 虚线类型:第三个粉色块的输出与第二个绿色块的输出channel数不同,前者为64,后者为128,故Shortcut Connection需要进行维度匹配

    论文作者提供了两种维度匹配方式:

    (A)通过Padding填充0,补充通道数。这种做法不会引入额外的参数。

    (B)通过1×1的卷积核改变维度

    展开全文
  • 何凯明的深度残差网络 PPT 对应相应论文的PPT 仅供学习交流使用
  • 1.领域:matlab,深度残差网络 2.内容:基于深度残差网络的人脸眼睛定位算法matlab仿真+代码仿真操作视频 3.用处:用于人脸眼睛定位算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用...
  • 【论文泛读】 ResNet:深度残差网络

    千次阅读 2021-07-25 02:40:11
    【论文泛读】 ResNet:深度残差网络 文章目录【论文泛读】 ResNet:深度残差网络摘要 Abstract介绍 Introduction残差结构的提出残差结构的一些问题深度残差网络实验结果ResNet 的探究与先进的模型比较在CIFAR-10进行...

    【论文泛读】 ResNet:深度残差网络


    论文链接: [1512.03385] Deep Residual Learning for Image Recognition (arxiv.org)

    当大家还在惊叹 GoogLeNet 的 inception 结构的时候,微软亚洲研究院的研究员已经在设计更深但结构更加简单的网络 ResNet,并且凭借这个网络子在 2015 年 ImageNet 比赛上大获全胜,除此之外,在那时的五个比赛都拿了第一名
    img
    接下来我们仔细阅读以下这篇论文

    摘要 Abstract

    更深的神经网络更难训练。我们提出了一个残差学习框架,以简化比以前使用的网络更深的网络的训练。我们明确地将层重新表述为参考层输入学习残差函数,而不是学习未引用的函数。我们提供了全面的经验证据,表明这些残差网络更容易优化,并且可以从显着增加的深度中获得准确性。在 ImageNet 数据集上,我们评估了深度高达 152 层的残差网络——比 VGG 网络深 8 倍 ,但仍然具有较低的复杂性。这些残差网络的集合在 ImageNet 测试集上实现了 3.57% 的错误率。该结果在 ILSVRC 2015 分类任务中获得第一名。我们还对具有 100 层和 1000 层的 CIFAR-10 进行了分析。 表示的深度对于许多视觉识别任务至关重要。仅由于我们极深的表示,我们在 COCO 对象检测数据集上获得了 28% 的相对改进。深度残差网络是我们向 ILSVRC & COCO 2015 竞赛提交的基础,我们还在 ImageNet 检测、ImageNet 定位、COCO 检测和 COCO 分割任务中获得了第一名。

    介绍 Introduction

    在前期的深度学习的发展中,网络深度至关重要,并且出现的VGG和GoogLeNet等深度模型更是说明了very deep的重要性

    那这样理解的话,作者就提出一个问题,那是否说明我们可以靠堆叠简单的神经网络可以达到很高的准确率呢,但是事实并非如此,作者做了一个实验,依据CIFAR-10数据集,用了一个堆叠的20-layer神经网络和56-layer神经网络,结果非常amazing

    img

    从实验结果我们可以看出来,更深的网络并不能给我们带来更优的模型,反而20-layer的模型更优一点,这出现了什么问题呢

    其实,更好的网络不是靠堆叠更多的层就可以实现的

    堆叠网络的缺点:

    • 网络难以收敛,梯度消失/爆炸在一开始就阻碍网络的收敛。

      传统解决办法:
      通过适当权重初始化+Batch Normalization 就可以很大程度上解决,这使得数十层的网络能通过具有反向传播的随机梯度下降(SGD)开始收敛。

    • 出现退化问题(degradation problem):随着网络深度的增加,准确率达到饱和(这可能并不奇怪)然后迅速下降。意外的是,这种下降不是由过拟合引起的,并且在适当的深度模型上添加更多的层会导致更高的训练误差

    由于这个退化问题,作者就进行了一个思考:假设我们训练了一个浅层网络,那么在其后面直接添加多层恒等映射层(本身)而构成的一个深层网络,那这个深层网络最起码也不能比浅层网络差。我们这样做了以后,起码我们加深模型至少不会使得模型变得更差,这样我们就可以加深我们的深度。

    残差结构的提出

    为了解决我们的退化问题,我们提出了一个残差结构

    在过去的网络结构中,我们会去拟合我们的期望的底层映射 H ( x ) H(x) H(x),但是对于我们的是拟合我们的残差 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x

    这样我们最后得到的映射是 F ( x ) + x F(x)+x F(x)+x,我们假设残差的映射比原来的更容易优化。**在极端情况下,如果一个恒等映射是最优的,那么将残差置为零比通过一堆非线性层来拟合恒等映射更容易。**并且对于我们来说,我们多加一个捷径连接(shortcut connections),在下面这种情况下,我们是用恒等映射就是自己本身,这样既不增加额外的参数也不增加计算复杂度。(默认加法不会影响太大的复杂度)这样我们的网络还是可以用带有反向传播的SGD进行我们的训练

    img

    这里有一个点是很重要的,对于我们的第二个layer,它是没有relu激活函数的,他需要与x相加最后再进行激活函数relu

    作者对ImageNet进行测试,对于我们残差网络来说,总结以下几个优点

    1. 易于优化
    2. 解决退化问题
    3. 我们可以用很深的网络,并且准确率大大提升

    最后作者试着利用残差网络在CIFAR-10数据集中搭建了超过1000层的神经网络,很好的解决了梯度消失和退化问题,并且利用残差网络ResNet-152,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。

    残差结构的一些问题

    首先我们用残差结构这种方法,我们一定要保证 F ( x ) F(x) F(x) x x x有相同的维度,简单来说,因为如此我们才可以相加,所以我们的维度必须要保持一致
    y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x
    然后对于我们来说,我们的 F F F之中至少要有两层,因为如果我们只有一层的话,我们的输出类似于线性函数 y = W 1 x + x y=W_1x+x y=W1x+x​,这就还是线性模型,如此便没有任何的优势,所以对于我们的特征映射来说,我们至少是需要两层的。

    深度残差网络

    从VGG的启发出发,我们构建一个简单的卷积神经网络,之后用一下两个设计规则设计出我们的残差网络:

    • 对于相同的输出特征图尺寸,层具有相同数量的滤波器
    • 如果特征图尺寸减半,则滤波器数量加倍,以便保持每层的时间复杂度。我们通过步长为2的卷积层直接执行下采样。
    • 最后的网络会以全局平均池化层和具有softmax的1000维全连接层结束

    请添加图片描述

    其中一个网络我们会插入捷径连接(shortcuts connection),这里面会出现一个问题,因为我们需要我们的输入和输入都有相同的维度,但是对于我们经过池化下采样的操作之后,我们的维度变了,在这里面的残差模块就有一些不同了,作者给出两种选择

    • 快捷连接仍然执行恒等映射,额外填充零输入以增加维度。此选项不会引入额外的参数
    • 用1x1的卷积核进行降维

    对于这两种做法,都有一个相同点,步长都为2

    在实现的时候

    • 对数据集进行了数据增强等方法,比如随机裁剪,尺度增强等
    • 用Batch Normalization(注意:dropout 和 BN不能同时使用)在每一个卷积核后,激活函数前。
    • 最终结果用多尺度裁剪和融合,去多尺度的平均值

    实验结果

    模型构建好后进行实验,在plain上观测到明显的退化现象,而且ResNet上不仅没有退化,34层网络的效果反而比18层的更好,而且不仅如此,ResNet的收敛速度比plain的要快得多。

    img

    img

    对于普通的模型中,我们发现,更深的模型的训练误差结果更大,作者经过判定,这不是由于梯度消失的问题,他大胆做了一个推测,随着普通模型的加深,模型的收敛会指数级降低,这个问题也是一个很好的问题。

    对于我们的残差网络来说,我们是用第一个选择,也就是用0padding填充的,所以几乎没有额外参数,根据实验结果,我们可以得出结论:带残差的深度模型收敛的更快

    ResNet 的探究

    考虑到我们能承受的模型的训练时间,我们将原来的residual结构改为了瓶颈结构。对于每个残差函数F,我们使用3层堆叠而不是2层

    这是在 Network In Network 和 GoogLeNet (Inception-v1)中提出的一种技术。结果表明,1× 1conv 可以减少网络的连接数(参数) ,同时不会大大降低网络的性能。三层是1×1,3×3和1×1卷积,其中1×1层负责减小然后增加(恢复)维度,使3×3层成为具有较小输入/输出维度的瓶颈。

    其中,这种bottleneck模型,我们会在深层残差网络会用到,比如ResNet-50/101/152中

    img

    这是在ImageNet数据集中更深的残差网络的模型

    img

    • ResNet-50:我们用3层瓶颈块替换34层网络中的每一个2层块,得到了一个50层ResNe。我们使用1x1卷积核来增加维度。该模型有38亿FLOP
    • ResNet-101/152:我们通过使用更多的3层瓶颈块来构建101层和152层ResNets。值得注意的是,尽管深度显著增加,但152层ResNet(113亿FLOP)仍然比VGG-16/19网络(153/196亿FLOP)具有更低的复杂度。

    与先进的模型比较

    对于我们的ResNet来说,与先进的方法比较,ResNet几乎超过了所有过去模型的结果,通过将网络深度增加到152层,获得了5.71% 的 top-5错误率,比 VGG-16、 GoogLeNet (Inception-v1)和 PReLU-Net 都要好得多,用六种模型集合最后在2015年ILSVRC中荣获了第一名。

    img

    在CIFAR-10进行探究

    在CIFAR-10数据集上探究是因为,我们想研究对更深的网络上会有什么样的效果。

    因为CIFAR-10图片为32x32x3,在探究的过程发现了一个很有趣的现象,当我们运用1202层的模型去训练时,我们并没有优化困难,并且我们的模型也能达到收敛,但是最后这个1202层网络的测试结果比我们的110层网络的测试结果更差,虽然两者都具有类似的训练误差。

    原因分析:
    我们认为这是因为过拟合。对于这种小型数据集,1202层网络可能是不必要的大(19.4M)。在这个数据集应用强大的正则化,如maxout或者dropout来获得最佳结果

    这是我们在CIFAR-10上的结果

    img

    模型配置

    • 我们使用的权重衰减为0.0001和动量为0.9,并采用BN中的权重初始化,但没有使用丢弃Dropout。
    • 这些模型在两个GPU上进行训练,批处理大小为128。
    • 我们开始使用的学习率为0.1,在32k次和48k次迭代后学习率除以10,并在64k次迭代后终止训练,这是由45k/5k的训练/验证集分割决定的。
    • 我们用简单数据增强进行训练:每边填充4个像素,并从填充图像或其水平翻转图像中随机采样32×32的裁剪图像。

    在PASCAL和MS COCO上的目标检测

    我们通过将 ResNet-101引入到更快的 R-CNN 中,可以获得比 VGG-16更好的性能。而 ResNet 最终在 ImageNet 检测、定位、 COCO 检测和 COCO 分割中获得第一名! ! !

    img

    img

    具体更多的实现细节都在论文的附录

    总结

    在ResNet网络中有如下几个亮点:

    (1)提出residual结构(残差结构),并搭建超深的网络结构(突破1000层)

    (2)使用Batch Normalization加速训练(丢弃dropout)

    在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。

    (1)梯度消失或梯度爆炸。

    (2)退化问题(degradation problem)。

    在ResNet论文中说通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题,residual结构(残差结构)来减轻退化问题。此时拟合目标就变为F(x),F(x)就是残差。

    参考

    展开全文
  • 将深度学习用于高光谱遥感数据的霾监测,提出一种基于深度残差网络的高光谱霾监测方法,利用深度网络提取霾光谱曲线特征,再使用残差学习等方法降低网络训练难度,得到了霾监测模型。苏州地区Hyperion高光谱数据集上...
  • 针对传统的采煤机摇臂齿轮故障诊断方法不能自主提取特征,导致齿轮故障诊断精度和效率不佳等问题,构建了基于深度残差网络(ResNet)的采煤机摇臂齿轮故障诊断模型。通过预激活残差单元模块降低模型的复杂度,使模型...
  • 深度学习之卷积神经网络(12)深度残差网络1. ResNet原理 AlexNet、VGG、GoogleLeNet等网络模型的出现将神经网络的法阵带入了几十层的阶段,研究人员发现网络的层数越深,越有可能获得更好的泛化能力。但是当模型...
  • 针对复杂背景下,图像显著区域显著值低和目标边缘表现模糊的问题,提出了基于深度残差网络和多尺度边缘残差学习的显著性检测方法。一方面提出了边缘残差块,使用边缘残差块在深度残差网络的基础上构建边缘监督网络,用于...
  • 针对人脸表情识别,传统方法主要依赖人工提取特征的优劣,算法的鲁棒性较差,而传统卷积神经网络无法提取到更深层次的图像特征,因此该文将采用深度残差网络进行人脸表情识别。ResNet网络主要由残差模块组成,将残差...
  • 深度残差网络学习多通道图片。 简单介绍一下深度残差网络:普通的深度网络随着网络深度的加深,拟合效果可能会越来越好,也可能会变差,换句话说在不停地学习,但是有可能学歪了。本次介绍的深度残差网络最后输出H...
  • 深度残差网络DRN ResNet网络原理 深的网络一般会比浅的网络效果好,如果要进一步地提升模型的准确率,最直接的方法就是把网络设计得越深越好,这样模型的准确率也就会越来越准确。 为什么不把网络层次加到成百上千...
  • 通过实验可以发现:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变得更加难以训练了。 为什么随着网络...
  • 深度学习经典网络(4)ResNet深度残差网络结构详解

    万次阅读 多人点赞 2019-07-11 22:04:36
    深度残差网络 ,它允许网络尽可能的加深,其中引入了全新的结构如图1; 图1 Shortcut Connection 残差指的是什么?  其中ResNet提出了两种mapping:一种是 identity mapping ,指的就是图1中” 弯...
  • 题目:Deep Residual Learning for Image Recognition《用于图像识别的深度残差学习》通过残差模块解决深层网络的退化问题,大大提升神经网络深度,各类计算机视觉任务均从深度模型提取出的特征中获益。 ResNet获得...
  • 深度残差网络简介     之前在一些文章里,我们介绍过BP神经网络、卷积神经网络等常见的神经网络,在这些网络里当每一次使用激活函数的时候,都会导致训练后期的梯度消失问题,因为这是由于激活...
  • 基于深度残差网络的人脸关键点检测
  • 详解ResNet(深度残差网络)

    千次阅读 2020-12-30 21:41:41
    深度残差网络(Deep residual network, ResNet)的提出是CNN图像史上的一件里程碑事件,让我们先看一下ResNet在ILSVRC和COCO 2015上的战绩: ResNet取得了5项第一,并又一次刷新了CNN模型在ImageNet上的历史: ...
  • 云计算-基于深度残差网络的人眼视觉估计算法的研究.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,130
精华内容 12,852
关键字:

深度残差网络

友情链接: 1.12.2矿石菌种mod.rar