精华内容
下载资源
问答
  • 残差网络结构
    千次阅读
    2020-02-16 23:05:48

    一、残差网络基本结构

    (1) 传统的深度学习遇到的困难
    1. 梯度消失问题:随着网络深度的增加,网络会出现梯度消失/梯度爆炸的情况,阻碍收敛的过程
    2. 退化问题:精确率出现饱和的情况是层数的增加引起的,并不是过拟合,表明更深的网络并未出现更高的训练错误率。
    3. 深度学习提高网络精度常用初始化权值、局部感受野、权值共享等技术,但是层数较深时,依然面对反向传播时梯度消失这类困难。
    (2) 深度残差网络思路
    1. 引入skip connect 打破了网络的对称性,减轻了神经网络的退化
    2. 认为可以混合利用不同层级的特征进一步抽取深层特征。
    3. 类似的工作在文章《Highway》和《Training Very Deep Networks》
    4. 深度残差的目标:更深层次的网络应该也是利于优化的,层数越多准确率越高,训练方法与传统的深度网络相比不会有很大变化
    (3)残差结构(左图)和残差瓶颈结构(右图)

    残差瓶颈结构:1 * 1 卷积 ——> 3 * 3卷积 ——> 1 * 1 卷积
    在这里插入图片描述
    首端和末端的1x1卷积用来削减和恢复维度,相比于原本结构,只有中间3x3成为瓶颈部分。
    开始的1 * 1 卷积主要目的是为了减少参数的数量,从而减少计算量,且在降维之后可以更加有效、直观地进行数据的训练和特征提取。这里用32 个1*1 的卷积核进行降维,准确的说是32组1 * 1 * 64大小的卷积核,那么与原始图片卷积后生成32 * 56 * 56大小的特征图,降低了图片的厚度(通道),保持图片的宽高不变,所以参数量也降低了。最后再用1 * 1 卷积恢复维度。
    Alt注意:

    1. H(x) = F(x) + x , F(x) 就表示残差,x表示输入。F(x)和x维度要一致。
    2. 残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。“残差”蕴含了有关模型基本假设的重要信息。如果回归模型正确的话, 我们可以将残差看作误差的观测值。它应符合模型的假设条件,且具有误差的一些性质。利用残差所提供的信息,来考察模型假设的合理性及数据的可靠性称为残差分析。
    (4)三种网络结构进行对比

    Alt
    说明:

    在残差网络虚线处feature map的维度增加了,作者提出了两种选择:

    1. 直接通过zero padding 来增加维度(channel)。
    2. 乘以W矩阵投影到新的空间。是用1x1卷积实现的,直接改变1x1卷积的filters数目。这种会增加参数。

    二、残差网络实现

    (1) 简单残差结构的实现

    # 这个例子可以用来了解残差块的基本原理
    import torch
    import torch.nn as nn
    import numpy as np
    
    
    class ResNet(nn.Module):
        def __init__(self):
            super(ResNet, self).__init__()
            self.conv = nn.Conv2d(3, 6, 3, 1, padding=1)
    
        def forward(self, x):
            # 这里的维度要一致
            return x.repeat(1, 2, 1, 1) + self.conv(x)
    
    if __name__ == '__main__':
        net = ResNet()
        x = torch.randn(1, 3, 6, 6)
        print(net(x).shape)
    

    (2) 完整残差结构(残差块)实现

    """
    3 * 3 卷积 ————> 3 * 3 卷积
    """
    import torch.nn as nn
    import torch.nn.functional as F
    
    
    class BasicBlock(nn.Module):
        expansion = 1
       
        def __init__(self, in_feature, out_feature, stride=1):
            super(BasicBlock, self).__init__()
            self.conv1 = nn.Conv2d(in_feature, out_feature, kernel_size=3, stride=stride, padding=1)
            self.bn1 = nn.BatchNorm2d(out_feature)
            self.conv2 = nn.Conv2d(out_feature, out_feature, kernel_size=3, stride=1, padding=1)
            self.bn2 = nn.BatchNorm2d(out_feature)
            self.shortcut = nn.Sequential()
            """
            经过处理后的x要与x的维度相同(尺寸和深度)
            如果不相同,需要添加卷积+BN来变换为同一维度
            """
            if stride != 1 or in_feature != self.expansion * in_feature:
                self.shortcut = nn.Sequential(
                    nn.Conv2d(in_feature, self.expansion*in_feature, kernel_size=1, stride=stride),
                    nn.BatchNorm2d(self.expansion * in_feature)
                )
            
        def forward(self, x):
            out = F.relu(self.bn1(self.conv1(x)))
            out = self.bn2(self.conv2(out))
            out += self.shortcut(x)
            out = F.relu(out)
            return out
    

    (3) 残差瓶颈结构实现

    """
    1*1 卷积 ————> 3 * 3 卷积 ————>  1 * 1 卷积
    """
    import torch.nn as nn
    import torch.nn.functional as F
    
    
    class Bottleneck(nn.Module):
        # 前面1x1和3x3卷积的filter个数相等,最后1x1卷积是其expansion倍
        expansion = 4
        def __init__(self, in_feature, out_feature, stride=1):
            super(Bottleneck, self).__init__()
            self.conv1 = nn.Conv2d(in_feature, out_feature, kernel_size=1, stride=stride)
            self.bn1 = nn.BatchNorm2d(out_feature)
            self.conv2 = nn.Conv2d(out_feature, out_feature, kernel_size=3, padding=1, stride=stride)
            self.bn2 = nn.BatchNorm2d(out_feature)
            self.conv3 = nn.Conv2d(out_feature, self.expansion*out_feature, kernel_size=1, padding=1, stride=stride)
            self.bn3 = nn.BatchNorm2d(self.expansion*out_feature)
            self.shortcut = nn.Sequential()
            if stride != 1 or in_feature != self.expansion*out_feature:
                self.shortcut = nn.Sequential(
                    nn.Conv2d(in_feature, self.expansion*out_feature, kernel_size=1, stride=stride),
                    nn.BatchNorm2d(self.expansion*out_feature)
                )
        def forward(self, x):
            out = F.relu(self.bn1(self.conv1(x)))
            out = F.relu(self.bn2(self.conv2(out)))
            out = self.bn3(self.conv3(out))
            out += self.shortcut(x)
            out = F.relu(out)
            return out
    
    更多相关内容
  • 针对车辆检测任务,设计更高效、精确的网络模型是行业研究的热点,深层网络模型具有比浅层网络模型更好的特征提取能力,但构建深层网络模型时将导致梯度消失、模型过拟合等问题,应用残差网络结构可以缓解此类问题。...
  • 2,基础残差网络ResNet和ResNext 2.1ResNet和ResNext 2.2 ResNet18到ResNet153家族 2.3 ResNetV1和ResNetV2(激活和BN放哪里是正确的) 1,CNN的发展史 从上图的上半段可以看出,在1*1的卷积的应用在增加...

    目录

    1,CNN的发展史

    2,基础残差网络ResNet和ResNext

    2.1 ResNet和ResNext

    2.2 ResNet18到ResNet153家族

    2.3  ResNetV1和ResNetV2(激活和BN放哪里是正确的)


    1,CNN的发展史

        从上图的上半段可以看出,在1*1的卷积的应用在增加网络的深度和宽度后,残差连接的出现,成为了模型设计中的一个新的标准,同时也衍生出了很多新的网络。下面介绍一下,基于残差连接的经典网络。

    2,基础残差网络ResNet和ResNext

    2.1 ResNet和ResNext

           网络 ResNeXt,同时采用 VGG 堆叠的思想Inception split-transform-merge 思想,但是可扩展性比较强,可以认为是在增加准确率的同时基本不改变或降低模型的复杂度。ResNeXt是网络ResNet在宽度上的一个扩充。下图左边是ResNet,右边是ResNeXt网络结构

          ResNeXt的基本模块包含了32个分支,每个分支一模一样。每个矩形框中的参数分别表示输入维度,卷积大小,输出维度。它主要是通过1*1的卷积 层进行降维然后再升维。  

          下图中是ResNet-50 和 ResNeXt-50 的内部结构,最后两行说明二者之间的参数复杂度差别不大。 

            50 的原因: 1+9+12+18+9+1=50 只算卷积层,不计算池化层

    备注:基础思想 Inception结构

    2.2 ResNet18到ResNet153家族

          出镜率比较高的是 ResNet50和ResNet101,这两个运用比较多一些;

          上面一共提出了5种深度的ResNet,分别是18,34,50,101和152,首先看表2最左侧,我们发现所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代ResNet50或者101的每部分。

            拿101-layer那列,我们先看看101-layer是不是真的是101层网络,首先有个输入7x7x64的卷积,然后经过3 + 4 + 23 + 3 = 33个building block,每个block为3层,所以有33 x 3 = 99层,最后有个fc层(用于分类),所以1 + 99 + 1 = 101层,确实有101层网络;

            注:101层网络仅仅指卷积或者全连接层,而激活层或者Pooling层并没有计算在内; 这里我们关注50-layer和101-layer这两列,可以发现,它们唯一的不同在于conv4_x,ResNet50有6个block,而ResNet101有23个block,查了17个block,也就是17 x 3 = 51层。

    2.3  ResNetV1和ResNetV2(激活和BN放哪里是正确的)

          ResNet残差网络,想必大家一定很熟悉了,那么先考考大家,下面(1)-(5)的结构哪个是我们常用的ResNet结构?

           其中weight指conv层,BN指Batch Normalization层,ReLU指激活层,addition指相加;根据ResNet的描述,似乎以上五组都符合,那么2016年ResNet原文是哪一个结构呢?以及其他四组结构也都work么?我们不禁有了这两个疑问,伴随着疑问我们一一揭开谜题;

            针对第一个问题,ResNet原文中使用的结构是(1)。原文中的结构的特点有两个:1)BN和ReLU在weight的后面;2)最后的ReLU在addition的后面;

           对于特点1),属于常规范畴,我们平时也都这个顺序:Conv->BN->ReLU




           对于特点2),为什么ReLU放在addition后面呢?按照常规,不是应该是图(3)这种么,那么我们接下来引出的问题就是:    

           图(3)的结构work么?

            对于每个图右侧部分我们称作“residual”分支,左侧部分我们称作“identity”分支,如果ReLU作为“residual”分支的结尾,我们不难发现“residual”分支的结果永远非负,这样前向的时候输入会单调递增,从而会影响特征的表达能力,所以我们希望“residual”分支的结果应该在(-∞, +∞);这点也是我们以后设计网络时所要注意的。

           对于图(3)不OK的情况,那如果把BN也挪到addition后面呢?如图(2),同时也保证了“residual”分支的取值范围?

           这里BN改变了“identity”分支的分布,影响了信息的传递,在训练的时候会阻碍loss的下降;这里大家肯定又有个问题:

    为什么“identity”分支发生变化,会影响信息传递,从而影响训练呢?

    这里简单回顾ResNet的公式:

        因此 图(2)也不OK

        在分析图(4)和图(5)之前,我们引出一个概念:”Post-activation”激活之后和”Pre-activation”激活之前,”Post-activation”激活之后的意思是激活函数处于卷积层和BN层之后。

    ”Pre-activation”激活之前的意思是激活函数处于卷积层之前。

        其中Post和Pre的概念是相对于weight(conv)层来说的,那么我们不难发现,图(1), (2), (3)都是”Post-activation”,图(4), (5)都是”Pre-activation”,那么两种模式哪一个更好呢?这里我们就用实验结果说话。

         上图是5种结构在Cifar10上的实验结果,一共实验了两种网络ResNet110和ResNet164。

         从实验结果上,我们可以发现图(4)的结构与ResNet原结构伯仲之间,稍稍逊色,然而图(5)的结构却好于ResNet原结构。图5的结构好的原因在于两点:1)反向传播基本符合假设,信息传递无阻碍;2)BN层作为pre-activation,起到了正则化的作用;

          最后我们通常把图5的结构称作ResNetV2,这里我们给出ResNetV1和ResNetV2结构:

            上面两个结构提升好的原因在于两点:1)反向传播基本符合假设,信息传递无阻碍;2)BN层作为pre-activation,起到了正则化的作用; 

    该部分内容参考的博文为:

    深度学习经典网络(4)ResNet深度残差网络结构详解_青衫憶笙-CSDN博客_resnet网络结构

    展开全文
  • DenseNet网络增加网络的宽度,主要是通过用其他通道的信息补偿,从而增加网络的宽。 DenseNet网络通过各层之间进行concat,可以在输入层保持非常小的通道数的配置下,实现高性能的网络。 先列下DenseNet的几个优点...

    目录

    1, DenseNet

    1.1 ,  DenseNet如何改变网络的宽度

    1.2, DenseNet结构块

    1.3,基于 DenseNet结构块的神经网络结构

    1.4,DenseNet结构和ResNet之间的关系

    2,CliqueNet


    1, DenseNet

    1.1 ,  DenseNet如何改变网络的宽度

          DenseNet网络增加网络的宽度,主要是通过用其他通道的信息补偿,从而增加网络的宽。              DenseNet网络通过各层之间进行concat,可以在输入层保持非常小的通道数的配置下,实现高性能的网络。

    先列下DenseNet的几个优点,感受下它的强大:
    1、减轻了vanishing-gradient(梯度消失)
    2、加强了feature的传递
    3、更有效地利用了feature
    4、一定程度上较少了参数数量

    1.2, DenseNet结构块

          作者把所有层连接起来,dense block的结构图如下所示:在传统的卷积神经网络中,如果L层,那么就会有L个连接,但在DenseNet中,会有L(L+1)/2个连接;

          先放一个dense block的结构图。在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L+1)/2个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图:x0是input,H1的输入是x0(input),H2的输入是x0和x1(x1是H1的输出)……
        

     dense block的结构图

         梯度消失问题在网络深度越深的时候越容易出现,原因输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此减轻梯度消失现象,这样更深网络不是问题。另外作者还观察到这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用。

         DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。
        另外这里每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck

    (瓶颈结构,可以参考1*1的卷积作用章节的内容)layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,

     不同深度的DenseNet结构如下表所示

    1.3,基于 DenseNet结构块的神经网络结构

          下图是一个DenseNet的结构图,在这个结构图中包含了3个dense block。作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有size的问题。

           由于在DenseNet中需要对不同层的feature map进行concat操作,所以需要不同层的feature map保持相同的feature size.为了使用Down sampling,作者将DenseNet分为多个Denseblock。在同一个Denseblock中feature size相同大小,在不同Denseblock之间设置transition layers实现Down sampling。

     结论:
          向前:每一层都可以看到所有的之前的输入,对于网络已经学习到的『知识』(即已有feature map),以及原始输入,都可以直接access到,然后再添加自己的『知识』到全局知识库。鼓励了特征的重用,特征重用就可以减少不必要的计算量。另外,多层之间可以很好地进行交互,每一层都接受前面所有层的输出,具有多层特征融合的特性;
          向后:跳跃结构,可以很近地连接到最后的loss,训练起来很容易,直接接受最终loss的监督,深层监督,解决梯度消失的问题,并且,能起到正则化的作用缓解过拟合;

    因为有稠密直连的过程,所以各个feature都要存下来,实际上很容易爆显存,另外,这种稠密连接也意味着反向传播计算梯度更加复杂,每一步训练并不一定会更快。
     

    1.4,DenseNet结构和ResNet之间的关系

       ResNet这里的L表示层,xL表示L层的输出,HL表示一个非线性变换。所以对于ResNet而言,L层的输出是L-1层的输出加上对L-1层输出的非线性变换。

          DenseNet的。[x0,x1,…,xL-1]表示将0到L-1层的输出feature map做concatenation。concatenation是做通道的合并,就像Inception那样。而前面resnet是做值的相加,通道数是不变的。HL包括BN,ReLU和3*3的卷积。

     在实际应用中,使用DenseNet结构和ResNet在数据集Imagenet分类数据集上,达到同样的性能,DenseNet所需要的参数不到ResNet参数的一半左右。

    2,CliqueNet

           DenseNet 通过复用不同层级的特征图,减少了不同层间的相互依赖性,且最终的预测会利用所有层的信息而提升模型鲁棒性。但是 Yunpeng Chen 等研究者在论文 Dual Path Networks 中表示随着网络深度的增加,DenseNet 中的密集型连接路径会线性地增加,因此参数会急剧地增加。这就导致了在不特定优化实现代码的情况下需要消耗大量的 GPU 显存。而在北大杨一博等研究者提出来的 CliqueNet 中,每个 Clique Block 只有固定通道数的特征图会馈送到下一个 Clique Block,这样就大大增加了参数效率。

          CliqueNet 最大的特点是其不仅有前传的部分,同时还能根据后面层级的输出对前面层级的特征图做优化。这种网络架构受到了循环结构与注意力机制的启发,即卷积输出的特征图可重复使用,经过精炼的特征图将注意更重要的信息。在同一个 Clique 模块内,任意两层间都有前向和反向连接,这也就提升了深度网络中的信息流。  

          CliqueNet旨在进一步提高网络特征的利用率。该网络的思想是:在一个block中,每一层即是其他层的输入,也是其他层的输出

    论文:Convolutional Neural Networks with Alternately Updated Clique

    论文地址:https://arxiv.org/abs/1802.10419

    实现地址:https://github.com/iboing/CliqueNet

        CliqueNet 的每一个模块可分为多个阶段,但更高的阶段需要更大的计算成本,因此该论文只讨论两个阶段。第一个阶段如同 DenseNet 那样传播,这可以视为初始化过程。而第二个阶段如下图所示每一个卷积运算的输入不仅包括前面所有层的输出特征图,同样还包括后面层级的输出特征图。第二阶段中的循环反馈结构会利用更高级视觉信息精炼前面层级的卷积核,因而能实现空间注意力的效果。

    如上所示在第一阶段中,若输入 0、1、2 号特征图的拼接张量,卷积运算可得出特征图 3。在第二阶段中,特征图 1 会根据第一阶段输出的 2、3、4 号拼接特征图计算得出,我们可将其称为已更新特征图 1。第二阶段的特征图 3 在输入第一阶段的输出特征图 4 和已更新特征图 1、2 的情况下得出。

    由此可以看出,每一步更新时,都利用最后得到的几个特征图去精炼相对最早得到的特征图。因为最后得到的特征图相对包含更高阶的视觉信息,所以该方法用交替的方式,实现了对各个层级特征图的精炼。

       CliqueNet 是一个包含4个网络层的block示意图,unfold的形式结合后面的Table1和公式1会更容易理解。两个概念:一个是block,一个block可以包含多个stage;另一个是stage,表示参数更新的不同阶段。在上图中一个block包含两个stage,stage-I是首次更新,stage-II是第二次更新。熟悉DenseNet网络结构的同学应该可以看出Stage-I的操作和DenseNet是一样的,也就是说前面层的输出concate在一起作为当前层的输入。Stage-II的输入则可以从公式1和Table1看出规律:其他层最新的输出。

    Table1是一个包含5个网络层的block示意图,X代表层输出,右上角的(1)或(2)表示stage-I或stage-II。Stage-I的操作和DenseNet类似,Stage-II则是不断用top layer中最新的其他4个层输出作为另一个层的输入去更新对应的权重W
    这里写图片描述

     Table1

          前面介绍的这些操作可以用公式来表达,如下所示,公式1表示Clique Block的操作,Xi(k)中的(k)表示stage k,和Table1对应。该公式和前面Figure1和Table1结合看容易理解,公式分两部分,前半部分是相同stage的前面层输出集合作为当前层的输入,后半部分是前stage的后面层输出集合作为当前层的输入。注意这两部分不是前面介绍的两个stage的含义。

     是对stage-I和stage-II的特征做可视化,可以看出stage-II的特征更加集中在目标区域

    这里写图片描述

     CliqueNet结构在实际总的应用:

          下图中表示包含3个block的CliqueNet,每个block都会有两个输出:X0和stage-II的输出,这二者通过concate后再接一个global pooling层,作为预测的一部分。因此每个block的输出是该block的输入和该block的stage-II的输出的concate结果。X0表示第一个block的输入,后续每个block的输入是前一个block的stage-II输出经过transition层后得到的结果。文章中提到的一个亮点是:We adopt a multiscale feature strategy to compose the final representation with the block features in different map sizes. 指的就是这里不同block的输入做concate去预测结果。另外要提到的是连接两个block的transition操作,文章采用的是attentional transition(类似SE-Net网络的做法),目的是使得传给下一个block的特征质量更高。
    这里写图片描述

    展开全文
  • 说到深度学习一般网络结构越深网络的效果就会越好。因为越深的网络可以得到更多的语义信息。 上图可以看出来随着网络结构的加深网络的分类,识别效果也就越好。事实是这样吗?人们对chan常规的网络直接堆叠很多层...

    说到深度学习一般网络结构越深网络的效果就会越好。因为越深的网络可以得到更多的语义信息。

    上图可以看出来随着网络结构的加深网络的分类,识别效果也就越好。事实是这样吗?人们对chan常规的网络直接堆叠很多层,经对图像jin进行检测,训练集,测试集的误差结果如下图:

    通过下图可以看出来随着网络的加深50层的效果要比20层的效果差很多。通过实验可以发现:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变得更加难以训练了。

    问题:为什么随着网络的加深跟踪效果会越来越差呢?

    网络是由输入层,隐藏层,输出层组成,误差值的定义为:

    根据误差结果,利用著名的“链式法则”求偏导,使结果误差反向传播从而得出权重w调整的梯度。

    通过不断迭代,对参数矩阵进行不断调整后,使得输出结果的误差值更小,使输出结果与事实更加接近。

    从上面的过程可以看出,神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失(假如采用Sigmoid函数,对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25,层数越多,衰减越厉害),导致无法对前面网络层的权重进行有效的调整。

    为解决以上问题就需要我们的深度残差网络(Deep Residual Network,简称DRN)

    前面已经提到随着网络的加深,我们的网络的准确率会不断地提升然后达到饱和,最后会逐渐地降低。如下图所示·:

          那么我们作这样一个假设:假设现有一个比较浅的网络已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。

           ResNet引入了残差网络结构(residual network),通过这种残差网络结构,可以把网络层弄的很深(据说目前可以达到1000多层),并且最终的分类效果也非常好,残差网络的基本结构如下图所示,很明显,该图是带有跳跃结构的:

           回想前面的假设,如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。

           在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。

    34层网络结构:

     

    从图中我们可以看出来他们的捷径有实线还有虚线,他们之间的区别是什么?

    • 实线的Connection部分,表示通道相同,如上图的第一个粉色矩形和第三个粉色矩形,都是3x3x64的特征图,由于通道相同,所以采用计算方式为H(x)=F(x)+x
    • 虚线的的Connection部分,表示通道不同,如上图的第一个绿色矩形和第三个绿色矩形,分别是3x3x64和3x3x128的特征图,通道不同,采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操作,用来调整x维度的

    除了上面提到的两层残差学习单元,还有三层的残差学习单元,如下图所示:

    两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),其目的主要就是为了降低参数的数目。左图是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,右图是第一个1x1的卷积把256维通道降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,右图的参数数量比左图减少了16.94倍,因此,右图的主要目的就是为了减少参数量,从而减少计算量

     

    最后经检验,深度残差网络的确解决了退化问题,如下图所示,左图为平原网络(plain network)网络层次越深(34层)比网络层次浅的(18层)的误差率更高;右图为残差网络ResNet的网络层次越深(34层)比网络层次浅的(18层)的误差率更低。

     

    展开全文
  • 深度学习经典网络(4)ResNet深度残差网络结构详解

    万次阅读 多人点赞 2019-07-11 22:04:36
    残差网络,想必大家一定很熟悉了,那么先考考大家,下面(1)-(5)的结构哪个是我们常用的ResNet结构?   其中weight指conv层,BN指Batch Normalization层,ReLU指激活层,addition指相加;根据ResNet的...
  • 图片转自https://blog.csdn.net/Seven_year_Promise/article/details/69358681 对应代码: 代码中有些注释,自己看的。
  • 残差网络.rar

    2019-06-09 14:26:12
    本文档中包含ResNet50的源文章,网络结构图以及参数文件(h5,可直接使用),帮助大家了解残差网络
  • 提出了一种基于改进的深度残差网络(residual network,ResNet)的表情识别算法。采用小卷积核和深网络结构,利用残差模块学习残差映射解决了随着网络深度增加网络精度下降的问题,通过迁移学习方法克服了因数据量...
  • 如何理解残差网络(resnet)结构和代码实现(Pytorch)笔记分享
  • ResNet深度残差网络结构学习笔记

    千次阅读 2021-03-25 16:03:16
    ResNet深度残差网络结构引入问题ResNet介绍ResNet结构两种ResNet设计问题解决常用ResNet结构基于ResNet101的Faster RCNNResNet的公式 引入问题 面对复杂问题时,越深的网络往往会有更好的性能,但会发现,随着网络的...
  • 1、残差网络resnet、残差稠密网络densenet的含义。 2、残差稠密网络在卷积神经网络中的应用,利用残差稠密块和跳跃连接组成的生成器,鉴别器由卷积层堆叠而成。
  • 经典卷积网络--ResNet残差网络

    千次阅读 2022-05-15 22:41:15
      ResNet 即深度残差网络,由何恺明及其团队提出,是深度学习领域又一具有开创性的工作,通过对残差结构的运用,ResNet 使得训练数百层的网络成为了可能,从而具有非常强大的表征能力,其网络结构如图所示。...
  • 深度残差网络

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

    2021-05-14 15:14:38
    那么,网络的精度会随着网络的层数增多而增多吗?在深度学习中,网络层数增多一般会伴着下面几个问题 计算资源的消耗 模型容易过拟合 梯度消失/梯度爆炸问题的产生 问题1可以通过GPU集群来解决,对于一个企业资源并...
  • ResNet是神经网络中非常著名的网络结构,其中引入了残差连接和批标准化(BN层,Batch Normalization),使得网络深度能够达到百层甚至千层(但上千层的网络效果并不好),实现优良的网络效果。
  • (1)回顾一下深度残差网络结构  在下图中,(a)-(c)分别是三种残差模块,(d)是深度残差网络的整体示意图。BN指的是批标准化(Batch Normalization),ReLU指的是整流线性单元激活函数(Rectifier Linear Unit),...
  • 残差网络(ResNet)

    千次阅读 2020-11-19 18:01:47
    残差网络(ResNet) 之前介绍了训练和设计深度模型提供了两类重要思路之一:批量归一化BN 现在开始学习另一个思路:残差网络(ResNet),开始学习~???? 1. 理解 先思考一个问题:对神经网络模型添加新的层,充分训练...
  • 深度学习:残差网络

    2022-02-07 21:26:45
    残差网络的定义、作用与原理
  • 那么,网络的精度会随着网络的层数增多而增多吗?在深度学习中,网络层数增多一般会伴着下面几个问题 计算资源的消耗 模型容易过拟合 梯度消失/梯度爆炸问题的产生 问题1可以通过GPU集群来解决,对于一个企业资源...
  • 残差网络是何凯明大神的神作,效果非常好,深度可以达到1000层。但是,其实现起来并没有那末难,在这里以tensorflow作为框架,实现基于mnist数据集上的残差网络,当然只是比较浅层的。 如下图所示: 实线的...
  • 深度学习 个人对残差网络的理解

    千次阅读 2020-07-10 18:58:23
    残差网络是Microsoft Research的4位大佬提出的,在2015年的ImageNet大规模视觉识别竞赛中获得了图像分类和物体识别的优胜。 论文:Deep Residual Learning for Image Recognition 残差网络的特点以及优点: 残差...
  • Tensorflow2实现残差网络

    千次阅读 2020-04-29 14:37:22
    今天记录一下利用Tensorflow2来实现残差网络残差网络缓解了在深度神经网络中增加深度带来的梯度消失问题,使在实际效果中加深神经网络得到更好的训练结果理论成真。其主要由输入部分,多个残差块,全连接部分网络...
  • 残差网络ResNet获得了2016年IEEE Conference on CVPR的最佳论文奖,现在在谷歌学术的引用次数已高达38295次。 深度残差收缩网络是深度残差网络的一种新的改进版本,其实是深度残差网络、注意力机制和软阈值函数的...
  • CNN经典网络之残差网络(ResNet)剖析

    千次阅读 2020-10-19 11:43:22
    残差网络(Residual Network, ResNet)是在2015年继AlexNet、VGG、GoogleNet 三个经典的CNN网络之后提出的,并在ImageNet比赛classification任务上拔得头筹,ResNet因其简单又实用的优点,现已在检测,分割,识别等...
  • 针对已有文本识别网络由于深度不够而识别准确率较低的问题,文中提岀一种改进的端到端文本识别网络结构。首先,将文本作为序列,采用残差模块将文本按列切分成特征向量输入循环层。这种残差结枃増加了卷积网络的深度...
  • DenseNet1、前言1.1、残差块2、残差网络:ResNet2.1、ResNet的网络结构3、残差网络:DenseNet3.2、设计理念3.3、网络结构 1、前言 在VGG中,卷积网络达到了19层,在GoogLeNet中,网络史无前例的达到了22层。那么,...
  • 一说起“深度学习”,自然就联想到它非常显著的特点“深、深、深”(重要的事说三遍),通过很深层次的网络实现准确率非常高的图像识别、语音识别等能力。因此,我们自然很容易就想到:深的网络一般会比浅的网络效果...
  • 一文读懂残差神经网络

    千次阅读 2021-11-30 17:34:05
    由于神经网络具有很强的拟合能力,我们期望训练一个很深的前馈神经网路,来完成任务。直观上看,更深的神经网络,在非线性激活函数的加持下,拥有更大的假设空间,因此当然“更有可能”包含了一个最优解。但是在实际...
  • 针对传统配电绝缘杆障碍物覆盖检测方法存在检测精准度低的问题,提出一种新的基于多尺度残差网络的配电绝缘杆障碍物覆盖检测方法。构建闪络模型,计算外施电路电压,以此研究配电绝缘杆的障碍物覆盖表面闪络机理。...

空空如也

空空如也

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

残差网络结构