公司网站源码 带wap手机站,微信营销的模式,获客软件排名前十名,网站的ftp怎么查随着深度学习技术的不断发展#xff0c;神经网络架构变得越来越复杂#xff0c;而这些复杂网络在训练时常常遇到梯度消失、梯度爆炸以及计算效率低等问题。为了克服这些问题#xff0c;研究者们提出了多种网络架构#xff0c;包括 残差网络#xff08;ResNet#xff09;、…随着深度学习技术的不断发展神经网络架构变得越来越复杂而这些复杂网络在训练时常常遇到梯度消失、梯度爆炸以及计算效率低等问题。为了克服这些问题研究者们提出了多种网络架构包括 残差网络ResNet、加权残差连接WRC 和 跨阶段部分连接CSP。
本文将详细介绍这三种网络架构的基本概念、工作原理以及如何在 PyTorch 中实现它们。我们会通过代码示例来展示每个技术的实现方式并重点讲解其中的核心部分。
目录
一、残差网络ResNet
1.1 残差网络的背景与原理
1.2 残差块的实现
重点
二、加权残差连接WRC
2.1 WRC的提出背景
2.2 WRC的实现
重点
三、跨阶段部分连接CSP
3.1 CSP的提出背景
3.2 CSP的实现
重点
四、总结 一、残差网络ResNet
1.1 残差网络的背景与原理
有关于残差网络详情可以查阅以下博客更为详细与新手向
YOLO系列基础三从ResNet残差网络到C3层-CSDN博客
深层神经网络的训练常常遭遇梯度消失或梯度爆炸的问题导致训练效果不好。为了解决这一问题微软的何凯明等人提出了 残差网络ResNet引入了“跳跃连接skip connections”的概念使得信息可以直接绕过某些层传播从而避免了深度网络训练中的问题。
在传统的神经网络中每一层都试图学习输入到输出的映射。但在 ResNet 中网络不再直接学习从输入到输出的映射而是学习输入与输出之间的“残差”即 其中 是网络学到的残差部分 是输入。
这种方式显著提升了网络的训练效果并且让深层网络的训练变得更加稳定。
1.2 残差块的实现
下面是一个简单的残差块实现它包括了两层卷积和一个跳跃连接。跳跃连接帮助保持梯度的流动避免深层网络中的梯度消失问题。
图例如下 代码示例如下
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_size3, padding1)self.conv2 nn.Conv2d(out_channels, out_channels, kernel_size3, padding1)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_size1)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_classes10):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_classes10)
print(model)重点
残差连接的实现在 ResidualBlock 类中out self.shortcut(x) 实现了输入与输出的加法操作这是残差学习的核心。处理输入和输出通道数不一致的情况如果输入和输出的通道数不同通过使用 1x1 卷积调整输入的维度确保加法操作能够进行。
二、加权残差连接WRC
2.1 WRC的提出背景
传统的残差网络通过简单的跳跃连接将输入和输出相加但在某些情况下不同层的输出对最终结果的贡献是不同的。为了让网络更灵活地调整各层贡献加权残差连接WRC 引入了可学习的权重。公式如下 其中 是网络学到的残差部分 是输入 和 是权重。
WRC通过为每个残差连接引入可学习的权重 和 使得网络能够根据任务需求自适应地调整每个连接的贡献。
2.2 WRC的实现
以下是 WRC 的实现代码我们为每个残差连接引入了权重参数 alpha 和 beta这些参数通过训练进行优化。
图例如下 可以看到加权残差快其实就是给残差网络的两条分支加个权而已 代码示例如下
class WeightedResidualBlock(nn.Module):def __init__(self, in_channels, out_channels):super(WeightedResidualBlock, self).__init__()self.conv1 nn.Conv2d(in_channels, out_channels, kernel_size3, padding1)self.conv2 nn.Conv2d(out_channels, out_channels, kernel_size3, padding1)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_size1)else:self.shortcut nn.Identity()def forward(self, x):out F.relu(self.bn1(self.conv1(x)))out self.bn2(self.conv2(out))# 加权残差连接使用可学习的权重 alpha 和 betaout self.alpha * out self.beta * self.shortcut(x)return F.relu(out)# 示例构建一个加权残差块
model_wrc WeightedResidualBlock(3, 64)
print(model_wrc)重点 可学习的权重 alpha 和 beta我们为残差块中的两个加法项即残差部分和输入部分引入了可学习的权重。通过训练这些权重可以自动调整使网络能够根据任务需求更好地融合输入和输出。 加权残差连接的实现在 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 SplittingCSP通过分割输入特征图并将分割后的特征图分别送入不同的子网络进行处理。一般来说一条分支的子网络会比较简单一条分支的自网络则是原来主干网络的一部分。 重点 部分特征选择性连接将输入特征分为两部分。每部分特征单独经过卷积处理后通过 torch.cat() 进行拼接形成最终的输出。跨阶段部分连接CSP块通过分割输入特征并在不同阶段处理有效地减少了计算开销并且保持了网络的表达能力。 四、总结 本文介绍了 残差网络ResNet、加权残差连接WRC 和 跨阶段部分连接CSP 这三种网络架构。 finally求赞求赞求赞~