Skip to content

参考

基于 PyTorch 2.x torchvision 模型文档 + cs231n 卷积网络章节整理

速查

  • PyTorch 版本:2.x;torchvision ≥ 0.15 提供 weights API
  • 安装pip install torch torchvision
  • 预训练模型入口torchvision.models(含 resnet/vgg/efficientnet/mobilenet 等 40+ 架构)
  • 维度约定:图像张量 [B, C, H, W](NCHW)
  • 预处理标准:ImageNet 归一化 mean=[0.485,0.456,0.406] std=[0.229,0.224,0.225]
  • 输出尺寸公式(W - F + 2P) / S + 1

卷积层 API 速查

python
nn.Conv2d(in_channels, out_channels, kernel_size,
          stride=1, padding=0, dilation=1, groups=1, bias=True)
nn.Conv1d(in_channels, out_channels, kernel_size, ...)   # 序列/音频
nn.Conv3d(in_channels, out_channels, kernel_size, ...)   # 视频/体素
nn.ConvTranspose2d(in_channels, out_channels, kernel_size, ...)  # 上采样(分割用)

# 池化
nn.MaxPool2d(kernel_size, stride=None, padding=0)
nn.AvgPool2d(kernel_size, stride=None, padding=0)
nn.AdaptiveAvgPool2d(output_size)   # 自适应到指定尺寸(GAP 用 (1,1))
nn.AdaptiveMaxPool2d(output_size)

# 归一化(CNN 主力)
nn.BatchNorm2d(num_features)
nn.GroupNorm(num_groups, num_channels)

经典架构参数表

架构层数参数量主干特点torchvision 名
LeNet560K2 卷积 + 3 全连接(需自定义)
AlexNet860M5 卷积 + 3 全连接,ReLU+Dropoutalexnet
VGG11/13/16/1911-19133M-144M全 3×3 堆叠vgg11~vgg19
ResNet18/34/50/10118-10111M-45M残差块,工业默认resnet18~resnet101
ResNeXt50-10125M-90M分组卷积残差resnext50_32x4d
GoogLeNet/Inception v3226-24MInception 多尺度googlenetinception_v3
DenseNet1211218M密集连接densenet121
MobileNetV2/V3-3-5M深度可分离卷积,移动端mobilenet_v2mobilenet_v3
EfficientNet B0-B7-5M-66M复合缩放 + NASefficientnet_b0~efficientnet_b7
ConvNeXt-28M-650M现代化 CNN,对标 ViTconvnext_tiny~convnext_large

加载预训练模型

python
import torchvision
import torch.nn as nn

# 新 API(推荐):weights 参数指定预训练权重
model = torchvision.models.resnet50(weights="IMAGENET1K_V2")  # V2 是改进版权重
model = torchvision.models.efficientnet_b0(weights="DEFAULT")  # 用默认最新权重

# 替换分类头做迁移学习
model.fc = nn.Linear(model.fc.in_features, num_my_classes)

# 冻结主干
for p in model.parameters():
    p.requires_grad = False
model.fc.requires_grad_(True)  # 只训新头

ImageNet 预处理标准

python
from torchvision import transforms

# ImageNet 训练常用预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),                  # 或 RandomResizedCrop 训练时
    transforms.ToTensor(),                       # [0,1]
    transforms.Normalize(                        # ImageNet 统计
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225],
    ),
])

mean/std 是 ImageNet 120 万张图的统计值,几乎所有预训练模型都基于它。用自己的数据时仍建议沿用这套归一化(与预训练分布对齐),不要重算。

感受野计算

text
单层感受野 = F(核大小)
第 i 层累积感受野 RF_i = RF_{i-1} + (F_i - 1) · Π stride_j   (j < i)

经验:

  • 3×3 stride=1 堆叠:每加一层感受野 +2
  • stride=2 下采样后,后续每层感受野翻倍增长
  • ResNet50 最后一层感受野约 485×485,足够覆盖 224×224 输入

输出尺寸速算

操作输入输出
Conv3×3, S1, P1(同型)[B,C,224,224][B,C',224,224]
Conv3×3, S2, P1(下采样)[B,C,224,224][B,C',112,112]
Conv1×1, S1(通道变换)[B,C,224,224][B,C',224,224]
MaxPool2×2, S2[B,C,224,224][B,C,112,112]
AdaptiveAvgPool2d((1,1))[B,C,H,W][B,C,1,1]
ConvTranspose2d k2 s2[B,C,H,W][B,C',2H,2W]

官方资源