ResNet34
时间: 2025-03-18 11:03:32 浏览: 6
ResNet34 的模型结构及应用
模型结构概述
ResNet(残差网络)是一种通过引入残差模块来解决深层神经网络训练困难问题的经典架构。ResNet34 属于较浅层的 ResNet 变体之一,其主要特点是采用 34 层堆叠的基础卷积块而非瓶颈块[^1]。
具体来说,ResNet34 使用的是 BasicBlock 结构而不是 Bottleneck 结构。BasicBlock 是由两个连续的 $3 \times 3$ 卷积层组成,并且在每个阶段可能包含下采样操作 (downsample),用于调整输入张量的空间维度和通道数以匹配后续层的要求。
以下是 ResNet34 中各层的主要配置:
Layer Name | Number of Blocks | Output Channels | Downsample |
---|---|---|---|
conv1 | N/A | 64 | Yes |
layer1 | 3 | 64 | No |
layer2 | 4 | 128 | Yes |
layer3 | 6 | 256 | Yes |
layer4 | 3 | 512 | Yes |
其中 conv1
表示初始卷积层,负责将输入图像转换为固定大小的特征图;而其余四组 (layer1
, layer2
, layer3
, 和 layer4
) 则分别对应不同的分辨率级别下的特征提取过程。
实现方式
为了更好地理解如何实现 ResNet34,在 PyTorch 中可以定义如下代码片段展示该模型的核心部分:
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.clone()
output = self.conv1(x)
output = self.bn1(output)
output = self.relu(output)
output = self.conv2(output)
output = self.bn2(output)
if self.downsample is not None:
identity = self.downsample(identity)
output += identity
output = self.relu(output)
return output
def make_layers(block, in_channels, channels, num_blocks, stride=1):
layers = []
downsample = None
if stride != 1 or in_channels != block.expansion*channels:
downsample = nn.Sequential(
nn.Conv2d(in_channels=in_channels, out_channels=block.expansion*channels,
kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(block.expansion*channels))
layers.append(block(in_channels, channels, stride, downsample))
in_channels = block.expansion * channels
for i in range(1, num_blocks):
layers.append(block(in_channels, channels))
return nn.Sequential(*layers)
class ResNet34(nn.Module):
def __init__(self, image_channels=3, num_classes=1000):
super(ResNet34, self).__init__()
self.in_channels = 64
self.conv1 = nn.Conv2d(image_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)
self.bn1 = nn.BatchNorm2d(64)
self.relu = nn.ReLU()
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.layer1 = make_layers(BasicBlock, self.in_channels, 64, 3, stride=1)
self.layer2 = make_layers(BasicBlock, self.in_channels, 128, 4, stride=2)
self.layer3 = make_layers(BasicBlock, self.in_channels, 256, 6, stride=2)
self.layer4 = make_layers(BasicBlock, self.in_channels, 512, 3, stride=2)
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(512 * BasicBlock.expansion, num_classes)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = self.avgpool(x)
x = x.reshape(x.shape[0], -1)
x = self.fc(x)
return x
上述代码展示了完整的 ResNet34 定义流程以及核心组件的设计思路[^2]。
应用场景
ResNet34 被广泛应用于各种计算机视觉任务中,包括但不限于图像分类、目标检测、语义分割等领域。由于它具有较高的精度同时又不会过于复杂以至于难以部署到资源受限设备上,因此非常适合一些需要平衡性能与计算成本的应用场合[^3]。
例如,在水果识别项目中可以通过迁移学习方法利用预训练好的 ResNet34 来快速搭建高效准确率高的分类器。
相关推荐
















