resnet50结构
时间: 2024-12-27 12:27:22 浏览: 4
### ResNet50 网络架构详解
#### 1. 基本概念
ResNet(残差网络)通过引入跳跃连接解决了深层神经网络中的梯度消失问题,使得训练更深的网络成为可能。不同版本的ResNet主要区别在于其深度和使用的构建模块。
#### 2. 构建模块
ResNet50 使用的是瓶颈层 (Bottleneck) 结构来构建网络[^3]。这种设计可以减少参数数量并提高计算效率。具体来说:
- **卷积层**:每个 Bottleneck 单元由三个连续的卷积操作组成,分别是 1×1, 3×3 和 1×1 的卷积核大小。
- **通道数变化**:第一个 1×1 卷积用于降维;中间的 3×3 卷积保持维度不变;最后一个 1×1 卷积恢复原始特征图尺寸。
```python
class Bottleneck(nn.Module):
expansion = 4
def __init__(self, inplanes, planes, stride=1, downsample=None):
super(Bottleneck, self).__init__()
self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False)
self.bn3 = nn.BatchNorm2d(planes * self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
self.stride = stride
def forward(self, x):
residual = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
if self.downsample is not None:
residual = self.downsample(x)
out += residual
out = self.relu(out)
return out
```
#### 3. 整体结构
整个 ResNet50 包含多个阶段,每个阶段重复应用上述定义的基础单元。通常情况下,ResNet50 总共有 50 层,其中包括初始的7x7卷积层以及随后四个阶段的不同数目堆叠的基本单元[^1]。
| 阶段 | 输出形状 | 迭代次数 |
|------|----------------|----------|
| conv1| H/2 × W/2 × 64 | |
| layer1 | H/4 × W/4 × 256 | 3次 |
| layer2 | H/8 × W/8 × 512 | 4次 |
| layer3 | H/16 × W/16 × 1024 | 6次 |
| layer4 | H/32 × W/32 × 2048 | 3次 |
其中 `H` 表示输入图像高度,`W` 表示宽度。
#### 4. 实现细节
为了适应不同的输入分辨率,在某些地方会采用步长为2的最大池化或带有较大步幅的卷积来进行下采样处理。此外,当遇到维度不匹配的情况时,则需要额外添加线性投影映射以确保加法运算能够顺利执行。
阅读全文