Resnet34作为backbone的结构图
时间: 2025-01-06 16:45:54 浏览: 7
### ResNet34 Backbone 架构解析
ResNet34 属于残差网络系列中的较浅层版本,在设计上采用了多个身份块(Identity Block)。架构由卷积层、最大池化层以及一系列堆叠的身份块组成。具体来说:
- 初始阶段采用7×7的卷积核进行第一次降采样操作,随后接一个最大池化层[^3]。
```python
import torch.nn as nn
class InitialBlock(nn.Module):
def __init__(self, in_channels=3, out_channels=64):
super(InitialBlock, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=7, stride=2, padding=3, bias=False)
self.bn = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
def forward(self, x):
x = self.conv(x)
x = self.bn(x)
x = self.relu(x)
x = self.maxpool(x)
return x
```
- 接下来的主体部分则主要由不同数量的身份块构成,这些模块内部通过跳跃连接来缓解梯度消失问题,从而使得更深层数目的训练成为可能。
#### 身份块的具体实现方式如下所示:
对于ResNet34而言,“ID BLOCK × n”的含义是指连续堆叠n个相同配置的身份块。每个身份块内含有两个3×3大小的标准卷积层,并且保持输入输出通道数一致。
```python
class IdentityBlock(nn.Module):
expansion = 1
def __init__(self, inplanes, planes, stride=1, downsample=None):
super(IdentityBlock, self).__init__()
self.conv1 = conv3x3(inplanes, planes, stride)
self.bn1 = nn.BatchNorm2d(planes)
self.relu = nn.ReLU(inplace=True)
self.conv2 = conv3x3(planes, planes)
self.bn2 = nn.BatchNorm2d(planes)
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)
if self.downsample is not None:
residual = self.downsample(x)
out += residual
out = self.relu(out)
return out
```
整个ResNet34结构可以被划分为四个不同的stage,其中Stage 2到Stage 5分别包含了3、4、6、3组这样的身份块组合。这种特殊的构建模式不仅有助于提升模型表达能力,同时也有效解决了深层网络难以收敛的问题。
阅读全文