残差连接是怎么相加的
时间: 2025-05-27 19:33:34 AIGC 浏览: 26
### 残差连接在神经网络中的相加机制
残差连接是一种特殊的跳跃连接,它通过将输入直接传递到后续层并与该层的输出相加来实现信息的有效流动[^3]。具体来说,在残差块中,输入 \( x \) 经过一系列卷积操作、批量归一化(Batch Normalization, BN)和激活函数处理后得到的结果 \( F(x) \),会被与原始输入 \( x \) 进行逐元素相加,形成最终的输出 \( y = F(x) + x \)[^2]。
#### 实现细节
1. **维度匹配**
在进行相加之前,需要确保输入 \( x \) 和输出 \( F(x) \) 的形状一致。如果两者的通道数不同,则可以通过一个 \( 1 \times 1 \) 卷积核对输入 \( x \) 进行线性变换以调整其维度[^4]。
2. **逐元素相加**
当维度匹配完成后,\( F(x) \) 和 \( x \) 将按照对应位置上的数值逐一相加。这种简单的代数运算不仅简化了计算过程,还使网络能够学习到恒等映射或接近恒等映射的功能[^4]。
3. **前向传播**
在前向传播过程中,残差连接的作用是让网络可以同时关注输入数据本身及其经过复杂转换后的特征表示。这有助于减少因层数增加而导致的信息丢失问题[^5]。
4. **反向传播**
反向传播时,由于存在直接通路 (\( x \)),即使某些中间层产生的梯度较小,也可以借助这条捷径保持较大的信号强度传回较浅层次,有效缓解了梯度消失现象。
以下是基于 PyTorch 的简单代码示例展示了一个基本的残差块:
```python
import torch.nn as nn
class BasicResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super(BasicResidualBlock, self).__init__()
# 主路径:包含两个卷积层
self.main_path = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels)
)
# 如果输入和输出尺寸不相同,则创建 shortcut connection 来适配大小
self.shortcut = nn.Sequential()
if stride != 1 or in_channels != out_channels:
self.shortcut = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride),
nn.BatchNorm2d(out_channels)
)
def forward(self, x):
identity = x # 记录下原始输入
out = self.main_path(x) # 输入经由主路径处理
out += self.shortcut(identity) # 加入快捷连接部分
out = nn.functional.relu(out) # 应用 ReLU 非线性激活
return out
```
此代码片段展示了如何构建并应用残差块内的跳越链接完成加法操作。
###
阅读全文
相关推荐



















