• resnet


    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

  • 相关阅读:
    移动端--基于Android Studio的项目文件结构(一)【转】
    java知识体系粗略梳理
    简单的使用hibernate插入数据的例子
    触发器
    存储过程和函数
    视图
    索引的设计和使用
    数据类型的选择
    表类型(存储引擎)的选择
    MySQL中的常用函数
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13704426.html
Copyright © 2020-2023  润新知