残差神经网络(ResNet)

残差神经网络的主要贡献是发现了退化现象,并针对退化现象发明了快捷连接(shortcut connection),极大的消除了深度过大的神经网络训练困难问题。

1.神经网络越深准确率越高

假设一个层数较少的神经网络已经达到了较高准确率,可以在这个神经网络之后拼接一个恒等变换的网络层,这些恒等变换的网络层对输入数据不做任何转换,就能得到一个深度较大的神经网络,并且深度较大的神经网络的准确率等于拼接之前的神经网络准确率,准确率没有理由降低。
层数较多的神经网络,可由较浅的神经网络和恒等变换网络拼接而成。

2.退化现象

随着网络层不断的加深,模型的准确率先是不断提高,达到最大值,然后随着网络深度的继续增加,模型准确率毫无征兆的出现大幅度的降低。
退化现象归因于:深度神经网络难以实现恒等变换。
随着网络的深度不断加大,竟无法实现线性转换。显然在神经网络中增加线性转换分支称为更好的选择,于是ResNet团队在resnet模块中增加了快捷连接分支,在线性转换和非线性转换之间寻求一个平衡。

3.ResNet网络架构

带有快捷连接(Shortcut Connection)的残差模块
残差神经网络(ResNet)_第1张图片

#实现残差模块
class ResidualBlock(nn.Module):
    def __init__(self,inchannel,outchannel,stride=1,shortcut=None):
        super(ResidualBlock,self).__init__()
        self.left=nn.Sequential(
            nn.Conv2d(inchannel,outchannel,3,stride,1,bias=False),
            nn.BatchNorm2d(outchannel),
            nn.ReLU(inplace=True),
            nn.Conv2d(inchannel,outchannel,3,stride,1,bias=False),
            nn.BatchNorm2d(outchannel)
        )
        self.right=shortcut

    def forward(self, x):
        out = self.left(x)
        residual = x if self.right is None else self.right(x)
        out += residual
        return F.relu(out)

你可能感兴趣的:(面试,机器学习算法,百面深度学习,神经网络,python,深度学习)