resnet34网络结构
时间: 2025-01-22 09:05:30 浏览: 74
### ResNet34 网络架构详解
ResNet34 属于较浅层的残差网络之一,采用了基础的 `BasicBlock` 结构而非更深层网络使用的瓶颈结构 (BottleNeck)[^2]。该网络由多个堆叠的基础模块构成,每个基本块内含有两个卷积层,并且通过恒等映射(即捷径连接)将输入直接传递到输出端。
#### 主要组成部分
- **初始层**:首先是7×7大小、步幅为2的卷积操作,紧接着是一个最大池化层用于降低空间维度。
- **四个阶段的重复单元**:
- 第一阶段不改变尺寸;
- 后续三个阶段分别执行两次下采样以逐步减少特征图的空间分辨率并增加通道数;
具体来说:
| 阶段 | 卷积核数量 | 迭代次数 |
| --- | -------- | ------ |
| conv2_x | 64 | 3次 |
| conv3_x | 128 | 4次 |
| conv4_x | 256 | 6次 |
| conv5_x | 512 | 3次 |
每组中的第一个残差块会应用带有步长等于2的最大池化或适当调整后的卷积来进行降维处理。
#### 特殊设计——跳跃连接
为了克服传统CNN随深度增长而导致性能下降的问题,ResNet引入了所谓的“跳跃连接”。这些额外路径允许梯度几乎无损地反向传播回早期层,从而有效解决了训练极深模型时遇到的梯度消失难题[^4]。
当主支路与旁路形状匹配时可以直接相加以形成最终输出;如果不一致,则需利用1x1卷积变换使两者具有相同的维度以便后续加法运算[^5]。
```python
import torch.nn as nn
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_channels, out_channels, stride=1, downsample=None):
super(BasicBlock, self).__init__()
# 定义两层卷积及其激活函数
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
self.conv2 = nn.Conv2d(out_channels, out_channels * self.expansion, kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels * self.expansion)
self.downsample = downsample
def forward(self, x):
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.downsample is not None:
identity = self.downsample(x)
out += identity
out = self.relu(out)
return out
```
上述代码展示了如何构建一个简单的 `BasicBlock` 类型残差单元,其中包含了必要的组件如批量归一化层和 ReLU 激活函数。对于那些需要调整宽度或高度的情况,还会提供一个可选参数 `downsample` 来指定相应的转换方式。
阅读全文
相关推荐

















