ResNet残差连接
时间: 2025-01-10 11:49:46 AIGC 浏览: 80
### ResNet 中的残差连接概念
残差网络(ResNet)的核心创新之一是引入了残差连接,这解决了深层神经网络训练过程中遇到的梯度消失或梯度爆炸问题[^1]。传统卷积神经网络随着层数增加,会出现退化现象——即当网络变得更深时,准确率反而降低。为应对这一挑战,ResNet提出了通过添加跳跃连接(skip connections 或 shortcut connections),允许信息绕过某些层直接传递给后续层。
#### 数学表示
设 \( H(x) \) 表示期望学习的理想映射,则原始堆叠层试图拟合此映射;而在ResNet中,改为让这些层近似于剩余函数 \( F(x)=H(x)-x \),因此最终输出变为:
\[ y = F(x)+x \]
这里 \( x \) 和 \( y \) 的维度需相同才能相加。如果两者形状不同,则可通过线性投影变换匹配尺寸[^4]。
### 实现细节
为了更好地理解如何实现上述机制,在PyTorch框架下构建一个简单的ResNet单元如下所示:
```python
import torch.nn as nn
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_planes, planes, stride=1):
super(BasicBlock, self).__init__()
# 定义两个连续的3×3卷积操作
self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
# 如果输入通道数与输出不一致则创建一条捷径分支用于调整大小
self.shortcut = nn.Sequential()
if stride != 1 or in_planes != self.expansion * planes:
self.shortcut = nn.Sequential(
nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(self.expansion*planes)
)
def forward(self, x):
out = nn.ReLU()(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += self.shortcut(x) # 添加残差路径
out = nn.ReLU()(out)
return out
```
这段代码定义了一个基础版本的基础块 `BasicBlock` ,其中包含了两次卷积运算及其后的批标准化处理,并实现了必要的快捷链接逻辑以支持跨层的数据流动[^5]。
阅读全文
相关推荐



















