深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解

随着深度学习技术的不断发展,神经网络架构变得越来越复杂,而这些复杂网络在训练时常常遇到梯度消失、梯度爆炸以及计算效率低等问题。为了克服这些问题,研究者们提出了多种网络架构,包括 残差网络(ResNet) 、加权残差连接(WRC) 和 跨阶段部分连接(CSP)。

本文将详细介绍这三种网络架构的基本概念、工作原理以及如何在 PyTorch 中实现它们。我们会通过代码示例来展示每个技术的实现方式,并重点讲解其中的核心部分。

目录

一、残差网络(ResNet)

[1.1 残差网络的背景与原理](#1.1 残差网络的背景与原理)

[1.2 残差块的实现](#1.2 残差块的实现)

重点

二、加权残差连接(WRC)

[2.1 WRC的提出背景](#2.1 WRC的提出背景)

[2.2 WRC的实现](#2.2 WRC的实现)

重点

三、跨阶段部分连接(CSP)

[3.1 CSP的提出背景](#3.1 CSP的提出背景)

[3.2 CSP的实现](#3.2 CSP的实现)

重点

四、总结


一、残差网络(ResNet)

1.1 残差网络的背景与原理

有关于残差网络,详情可以查阅以下博客,更为详细与新手向:

YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客

深层神经网络的训练常常遭遇梯度消失或梯度爆炸的问题,导致训练效果不好。为了解决这一问题,微软的何凯明等人提出了 残差网络(ResNet),引入了"跳跃连接(skip connections)"的概念,使得信息可以直接绕过某些层传播,从而避免了深度网络训练中的问题。

在传统的神经网络中,每一层都试图学习输入到输出的映射。但在 ResNet 中,网络不再直接学习从输入到输出的映射,而是学习输入与输出之间的"残差",即

其中 是网络学到的残差部分, 是输入。

这种方式显著提升了网络的训练效果,并且让深层网络的训练变得更加稳定。

1.2 残差块的实现

下面是一个简单的残差块实现,它包括了两层卷积和一个跳跃连接。跳跃连接帮助保持梯度的流动,避免深层网络中的梯度消失问题。

图例如下:

代码示例如下:

python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义残差块
class ResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.bn2 = nn.BatchNorm2d(out_channels)
        
        # 如果输入和输出的通道数不同,则使用1x1卷积调整尺寸
        if in_channels != out_channels:
            self.shortcut = nn.Conv2d(in_channels, out_channels, kernel_size=1)
        else:
            self.shortcut = nn.Identity()

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))  # 第一层卷积后激活
        out = self.bn2(self.conv2(out))        # 第二层卷积
        out += self.shortcut(x)                # 残差连接
        return F.relu(out)                     # ReLU激活

# 构建ResNet
class ResNet(nn.Module):
    def __init__(self, num_classes=10):
        super(ResNet, self).__init__()
        self.layer1 = ResidualBlock(3, 64)
        self.layer2 = ResidualBlock(64, 128)
        self.layer3 = ResidualBlock(128, 256)
        self.fc = nn.Linear(256, num_classes)

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = F.adaptive_avg_pool2d(x, (1, 1))  # 全局平均池化
        x = torch.flatten(x, 1)                # 展平
        x = self.fc(x)                         # 全连接层
        return x

# 示例:构建一个简单的 ResNet
model = ResNet(num_classes=10)
print(model)
重点
  1. 残差连接的实现 :在 ResidualBlock 类中,out += self.shortcut(x) 实现了输入与输出的加法操作,这是残差学习的核心。
  2. 处理输入和输出通道数不一致的情况:如果输入和输出的通道数不同,通过使用 1x1 卷积调整输入的维度,确保加法操作能够进行。

二、加权残差连接(WRC)

2.1 WRC的提出背景

传统的残差网络通过简单的跳跃连接将输入和输出相加,但在某些情况下,不同层的输出对最终结果的贡献是不同的。为了让网络更灵活地调整各层贡献,加权残差连接(WRC) 引入了可学习的权重。公式如下

其中 是网络学到的残差部分, 是输入, 和 是权重。

WRC通过为每个残差连接引入可学习的权重 和 ,使得网络能够根据任务需求自适应地调整每个连接的贡献。

2.2 WRC的实现

以下是 WRC 的实现代码,我们为每个残差连接引入了权重参数 alpha 和 beta,这些参数通过训练进行优化。

图例如下:

可以看到,加权残差快其实就是给残差网络的两条分支加个权而已

代码示例如下:

python 复制代码
class WeightedResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(WeightedResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.bn2 = nn.BatchNorm2d(out_channels)
        
        # 权重初始化
        self.alpha = nn.Parameter(torch.ones(1))  # 可学习的权重
        self.beta = nn.Parameter(torch.ones(1))   # 可学习的权重

        # 如果输入和输出的通道数不同,则使用1x1卷积调整尺寸
        if in_channels != out_channels:
            self.shortcut = nn.Conv2d(in_channels, out_channels, kernel_size=1)
        else:
            self.shortcut = nn.Identity()

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        
        # 加权残差连接:使用可学习的权重 alpha 和 beta
        out = self.alpha * out + self.beta * self.shortcut(x)
        return F.relu(out)

# 示例:构建一个加权残差块
model_wrc = WeightedResidualBlock(3, 64)
print(model_wrc)
重点
  1. 可学习的权重 alpha 和 beta:我们为残差块中的两个加法项(即残差部分和输入部分)引入了可学习的权重。通过训练,这些权重可以自动调整,使网络能够根据任务需求更好地融合输入和输出。

  2. 加权残差连接的实现 :在 forward 方法中,out = self.alpha * out + self.beta * self.shortcut(x) 表示加权残差连接,其中 alpha 和 beta 是可学习的参数。

三、跨阶段部分连接(CSP)

3.1 CSP的提出背景

虽然 ResNet 和 WRC 提供了有效的残差学习和信息融合机制,但在一些更复杂的网络中,信息的传递依然面临冗余和计算开销较大的问题。为了解决这一问题,跨阶段部分连接(CSP) 提出了更加高效的信息传递方式。CSP通过选择性地传递部分信息而不是所有信息,减少了计算量并保持了模型的表达能力。

3.2 CSP的实现

CSP通过分割输入特征,并在不同阶段进行不同的处理,从而减少冗余的信息传递。下面是 CSP 的实现代码。

CSP思想图例如下:

特征分割(Feature Splitting) :CSP通过分割输入特征图,并将分割后的特征图分别送入不同的子网络进行处理。一般来说,一条分支的子网络会比较简单,一条分支的自网络则是原来主干网络的一部分。

重点
  1. 部分特征选择性连接 :将输入特征分为两部分。每部分特征单独经过卷积处理后,通过 torch.cat() 进行拼接,形成最终的输出。
  2. 跨阶段部分连接:CSP块通过分割输入特征并在不同阶段处理,有效地减少了计算开销,并且保持了网络的表达能力。

四、总结

本文介绍了 残差网络(ResNet) 、加权残差连接(WRC) 和 跨阶段部分连接(CSP) 这三种网络架构。

finally,求赞求赞求赞~

相关推荐
IpdataCloud7 分钟前
批量查IP的API接口怎么选?免费API配额瓶颈与离线库本地批量方案实测
网络·网络协议·tcp/ip
HDU-Dade26 分钟前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
2601_967987371 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
在所不辞兄1 小时前
【零基础学智能仿真-63】ABACUS作业工具与MCP接口
人工智能·深度学习·神经网络·机器学习·智能仿真
楚山之石1 小时前
【Medical Image Analysis】深度学习医学图像合成综述:伪CT、合成MRI与合成PET的架构、性能与临床边界
图像处理·人工智能·学习·mr·mri
blackappleD1 小时前
百度 Unlimited OCR 2 拆解:SR-SWA 如何让百页文档的 KV 缓存不再涨
人工智能·llm
数字新视界1 小时前
国产动环数据库在智能机房环境监控中的应用与优势分析
大数据·人工智能·数据中心·机房管理·模块化机房
holly就是我1 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
雨中飘荡的记忆2 小时前
额度又见底了?这个开源项目,给 AI 编程助手接上 61 家"加油站"
人工智能
天远Date Lab2 小时前
零信任架构实战:基于天远企业年报信息核验构建自动化商业保理财务与社保穿透评估网关
人工智能·架构·自动化