精华内容
参与话题
问答
  • ResNet

    千次阅读 2018-08-13 23:41:59
    ###看文章的时候为什么优化残差更容易这个问题困扰了我很久,所以下面主要记录这个问题的理解以及resnet脉络的整理。 Motivation: 1.神经网络的结构并不是越深越好,随着网络的加深伴随着严重的梯度下降和梯度...

    ###看文章的时候为什么优化残差更容易这个问题困扰了我很久,所以下面主要记录这个问题的理解以及resnet脉络的整理。

    Motivation:

    1.神经网络的结构并不是越深越好,随着网络的加深伴随着严重的梯度下降和梯度爆炸的问题,目前batch normalization等方法可以解决梯度消失和梯度爆炸的问题。但是使用了各种normalization的方法也不能是深层网络的效果好于浅层网络。

    2.理论上,若A为浅层网络,B为深层网络,且B的浅层结构完全复制于A,后几层为线性层(identity mapping),那么B网络的效果应该是和A的相同的。但是实验发现,A网络的训练准确率反而比浅层网络要低,这说明在实际应用时,高层的这种线性关系很难学到,也就是出现了文中提到的degradation problem(退化)。训练集准确率下降的原因肯定不是过拟合,因为过拟合的话训练集的准确率应该很高。由此出发,我们将这种线性关系加到网络的学习中,最后学出来的网络效果应该大于等于浅层网络的效果,也可以认为,学习这种线性映射会更加容易。

    Residual learning:

    identity mapping:x->x

    residual mapping:F\left ( x \right )=H(x)-x

    H\left ( x \right ) :desired underlying mapping——期望拟合的特征图,一个building block要拟合的就是这个特征图,未使用残差网络时,F\left ( x \right ) 的目标是拟合H\left ( x \right )。使用参差网络后F\left ( x \right )的目标是拟合H\left ( x \right )-x,后者比前者更容易优化!

    解释:

    假设我们认为deeper层相较于shallower层的有一些层是冗余的,那我们的学习目标应该是使这些层变成线性层,这样才能不影响网络的性能。那么拟合的目标就变成了:H\left ( x \right )=x,即F(x)=0,这要比之前的F(x)=x更容易拟合!

     

     

    展开全文
  • resnet

    2020-09-21 10:59:34
    resnet 文章目录resnet思路 思路 神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失(假如采用Sigmoid函数,对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25...

    resnet

    文章目录

    思路

    image-20200905153024536

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

    随着网络的加深,累计的参数变多,越容易导致梯度下降或者梯度爆炸,于是现象就是更深的网络有着更强大的表达,但是随着网络的增加,最终的效果却不好,于是resnet的思路就是在进行网络加深的时候进行一个类似短路的操作,保证最终的效果

    image-20200905155943036

    通过这样的结构,中间网络的参数减小,导致更深层的网络的实现成为可能。

    例子:

    class ResBlk(nn.Module):
        """
        resnet block
        """
    
        def __init__(self, ch_in, ch_out):# ch_in, ch_out不一定一致,假设ch_in为64,ch_out为256
            """
            :param ch_in:
            :param ch_out:
            """
            super(ResBlk, self).__init__()
    
            self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1)
            self.bn1 = nn.BatchNorm2d(ch_out)
            self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
            self.bn2 = nn.BatchNorm2d(ch_out)
    
            self.extra = nn.Sequential()
            if ch_out != ch_in:#如果输入的channel与输出的channel不相同,将输入channel变为输出channel
                # [b, ch_in, h, w] => [b, ch_out, h, w]
                self.extra = nn.Sequential(
                    nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=1),
                    nn.BatchNorm2d(ch_out)
                )
    
    
        def forward(self, x):
            """
            :param x: [b, ch, h, w]
            :return:
            """
            out = F.relu(self.bn1(self.conv1(x)))
            out = self.bn2(self.conv2(out))
            # short cut.
            # extra module: [b, ch_in, h, w] => [b, ch_out, h, w]
            # element-wise add:
            out = self.extra(x) + out
    
            return out
    
    
    

    image-20200921103445055

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

    image-20200921103736298

    其中weight指conv层,BN指Batch Normalization层,ReLU指激活层,addition指相加;

    参考:https://blog.csdn.net/chenyuping333/article/details/82344334

    展开全文
  • resnet简单了解

    千次阅读 2019-10-17 16:41:28
    ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。...

    ResNet简介

    ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同(即让这部分冗余层不起作用)。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。将原网络的几层改成一个残差块,残差块的具体构造如下图所示:在这里插入图片描述
    可以看到x是这一层残差块的输入,也称作F(x)为残差,x为输入值,F(x)是经过第一层线性变化并激活后的输出,该图表示在残差网络中,第二层进行线性变化之后激活之前,F(x)加入了这一层输入值x,然后再进行激活后输出。而这种在第二层输出并激活前加入x,这条路径称作shortcut连接。
    简单来说一个残差块的输出是:out = G(w_2F(w_1x)+x)
    F和G分别是两层的激活函数relu

    直观来说当shortcut中间层是冗余的其实就相当于不同层权重相乘随着层数增加逐渐趋于0(或者说是dF(x)=0)即dout = dG(y)*dy=dG(y)*(w_2*dF(w_1*x)+1) =dG(y)->1从而避免了冗余层造成的梯度消失。

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 11,135
精华内容 4,454
关键字:

resnet