深度学习pytorch——经典卷积网络之ResNet(持续更新)

错误率前五的神经网络(图-1):
图-1

可以很直观的看到,随着层数的增加Error也在逐渐降低,因此深度是非常重要的,但是学习更好的网络模型和堆叠层数一样简单吗?通过实现表明(图-2),并不是如此,会出现梯度消失和梯度爆炸的现象,甚至比堆叠之前的训练效果更差,这种现象被称为梯度退化。
图-2

如何保证梯度不退化,即随着堆叠层数的增加,训练模型不会比堆叠之前还要差?深度残差网络(Deep Residual Learning,ResNet)的提出很好的解决了这一问题,并且不仅没有增加额外的参数,也没有增加计算的复杂度。

ResNet在普通网络的基础上插入了短路(shortcut connection)(图-3),将这个网络变成了ResNet。
图-3

以上的叙述知识思想层面的,将思想转化为实操,离不开背后的数学原理(图-4)。
图-4

我们将最后的输出设置为 H(x) ,我们将堆叠的非线性层去拟合F(x) = H(x) - x ,原来的映射就变成了F(x) + x (F(x)必须和x的维度相同,如果不相同可是使用1*1卷积或者增加padding)。相当于我们在一些非线性对叠层之间插入了一个短路(shortcut connection),如果堆叠之后的模型的训练Error比之前还要差,就会直接走短路通道,如果堆叠之后的模型比之前好了,就进行堆叠,至于在几个堆叠层之间插入一个短路,这取决于训练的参数。

使用ResNet模型并不需要建立新的求解器,我们可以直接使用公共库,代码演示如下:

python 复制代码
class ResBlk(nn.Module):
    """
    resnet block
    """

    def __init__(self, ch_in, ch_out):
        """
        :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)

        #如果shortcut的输入和输出层的channel不一样,可以用一个1*1的卷积让他们变成一样

        self.extra = nn.Sequential()
        if ch_out != ch_in:
            # [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)))  #激活函数,也可以在上面的网络(第25行)写nn.ReLU
        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

这个代码来自于课时72 ResNet与DenseNet-2_哔哩哔哩_bilibili

中间关于这个思想的解释来自于我自己对Deep Residual Learning for Image Recognition 论文的理解,如果有什么问题,欢迎各位大佬指正,我将会感激不尽。

相关推荐
阿里云云原生3 分钟前
Qoder 全新「上下文压缩」功能正式上线,省 Credits !
人工智能
我星期八休息17 分钟前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
蒋星熠27 分钟前
如何在Anaconda中配置你的CUDA & Pytorch & cuNN环境(2025最新教程)
开发语言·人工智能·pytorch·python·深度学习·机器学习·ai
Hcoco_me41 分钟前
什么是机器学习?
人工智能·机器学习
Code_流苏41 分钟前
AI热点周报(9.7~9.13):阿里Qwen3-Next震撼发布、Claude 增强记忆与服务抖动、OpenAI 聚焦模型规范化...
人工智能·gpt·ai·openai·claude·qwen3-next·架构创新
合作小小程序员小小店42 分钟前
机器学习介绍
人工智能·python·机器学习·scikit-learn·安全威胁分析
这张生成的图像能检测吗1 小时前
(综述)视觉任务的视觉语言模型
人工智能·计算机视觉·语言模型·自然语言处理·视觉语言模型
weiwei228441 小时前
Torch核心数据结构Tensor(张量)
pytorch·tensor
聚客AI1 小时前
🚫万能Agent兜底:当规划缺失工具时,AI如何自救
人工智能·llm·agent
Juchecar1 小时前
一文讲清 nn.Module 中 forward 函数被调用时机
人工智能