torchvision --- Torchvision 0.26 documentation
Models and pre-trained weights --- Torchvision 0.26 documentation
VGG --- Torchvision 0.26 documentation
Torchvision 0.26 是 PyTorch 生态中专门用于计算机视觉(Computer Vision)的核心库文档。在 2026 年的背景下,它已经成为了一个高度成熟的工具包,涵盖了从数据加载、图像增强到最前沿模型调用的全流程。
该网页内容主要可以划分为以下 6 大核心板块:
1. Transforms (数据变换与增强)
这是文档中变动最频繁也最重要的部分。在 0.26 版本中,V2 Transforms 已经完全取代了旧版。
-
多模态支持 :V2 变换不仅支持图片(Image),还原生支持 视频(Video) 、边界框(Bounding Boxes) 、掩码(Masks)。
-
高性能:大部分变换支持在 GPU 上直接运行(通过 Tensor 驱动)。
-
常用操作 :包括
RandomResizedCrop、Normalize、ColorJitter以及强大的AutoAugment。
2. Models (预训练模型库)
文档提供了大量工业界和学术界主流的架构,并且附带了在 ImageNet 或其他大型数据集上的预训练权重。
-
架构涵盖:
-
分类 :从经典 ResNet 到最新的 Vision Transformers (ViT) 和 Swin Transformer。
-
检测与分割:Faster R-CNN, Mask R-CNN, DeepLabV3 等。
-
视频处理:MViT, Video ResNet。
-
-
Weights API :使用
Weights枚举类来更精确地调用特定版本的模型参数(如ResNet50_Weights.IMAGENET1K_V2)。
3. Datasets (内置数据集)
它内置了加载主流视觉数据集的接口,省去了用户手动写爬虫或解析器的麻烦。
-
经典集:MNIST, CIFAR10, ImageNet。
-
特定任务集:COCO (目标检测), Cityscapes (语义分割), Kinetics (视频)。
-
标准格式 :所有数据集都能完美配合 PyTorch 的
DataLoader使用。
4. Operators (底层算子)
这一章主要面向需要自定义高性能层的高级开发者。
-
视觉算子 :如 NMS (非极大值抑制) 、RoIAlign (感兴趣区域对齐) 、各种 IoU (交并比) 计算。
-
这些算子通常是用 C++/CUDA 实现的,速度极快,是构建目标检测算法的基石。
5. IO (输入输出)
专门负责图像和视频的高速读取与解码。
- torchvision.io :提供
read_image和read_video函数,直接将磁盘文件读取为 GPU 友好的 Tensor 格式,不再需要通过 PIL 或 OpenCV 中转。
6. Training References (训练参考脚本)
这是 0.26 文档中非常有价值的一部分,它提供了官方用来训练那些预训练模型的原始脚本。
- 如果你想复现官方的精度,或者学习如何编写专业的分布式训练代码,这些参考脚本是最佳示例。
在 Torchvision 0.26 的文档中,"Models and pre-trained weights" 页面是整个库的"核心仓库"。它不仅提供了各种先进的深度学习架构,还提供了在海量数据上训练好的"大脑"(权重)。
以下是该页面的深度解析:
1. 核心理念:模型 = 骨架 + 灵魂
文档将模型分为两个部分:
-
模型架构 (Architectures):即神经网络的结构代码(如 ResNet, ViT)。
-
预训练权重 (Pre-trained Weights):在特定数据集(如 ImageNet)上训练得到的参数。
2. 全新的 Weights API (重点)
在旧版本中,我们通常使用 pretrained=True。但在 0.26 文档中,这种方式已被弃用 ,取而代之的是更加透明和灵活的 Weights Enum API。
为什么要改?
-
版本控制:一个模型可能有多个版本的权重(比如 ResNet50 有 V1 和更强的 V2)。
-
自动配套增强:新 API 可以直接告诉你这个权重需要什么样的预处理(缩放、归一化参数)。
代码对比:
python
# ❌ 旧方式 (不推荐)
model = torchvision.models.resnet50(pretrained=True)
# ✅ 新方式 (推荐)
from torchvision.models import resnet50, ResNet50_Weights
model = resnet50(weights=ResNet50_Weights.IMAGENET1K_V2)
3. 模型大类
文档根据任务目标将模型分成了几大阵营:
| 任务类型 | 代表模型 | 应用场景 |
|---|---|---|
| 图像分类 | ResNet, EfficientNet, ViT (Vision Transformer), Swin | 识别图片里是什么 |
| 目标检测 | Faster R-CNN, SSD, RetinaNet, DETR | 找出物体的位置并打框 |
| 实例分割 | Mask R-CNN, DeepLabV3 | 像素级抠图 |
| 视频分类 | MViT, Video ResNet | 识别动作(如挥手、跑步) |
| 光流估计 | RAFT | 跟踪物体在两帧间的运动 |
4. 自动预处理 (Transforms)
这是 0.26 版本最贴心的改进。不同的预训练模型对输入图片的要求不同(有的要求 224 \\times 224,有的要求 232 \\times 232)。
文档通过 weights.transforms() 提供了自动化的预处理逻辑:
python
# 获取该权重对应的预处理步骤
weights = ResNet50_Weights.DEFAULT
preprocess = weights.transforms()
# 直接应用到图片
img_transformed = preprocess(img)
这保证了你的推理过程与官方训练过程完全一致,避免了因归一化参数不匹配导致的精度下降。
5. 性能度量指标
文档中为每个模型都列出了详细的表格,包含:
-
Acc@1 / Acc@5:在 ImageNet 上的分类准确率。
-
Params:参数量(模型占多大内存)。
-
GFLOPS:计算量(运行有多快)。
6. 如何选择模型?
-
追求速度(移动端/嵌入式) :选择
MobileNetV3或ShuffleNetV2。 -
追求精度(研究/高配服务器) :选择
ConvNeXt或ViT_H(大型视觉 Transformer)。 -
平衡性最好 :
ResNet家族或RegNet。
Torchvision 0.26 文档中关于 VGG 的部分介绍了一系列由牛津大学视觉几何组(Visual Geometry Group)开发的经典卷积神经网络架构。虽然 VGG 诞生于 2014 年,但由于其结构的规整性 和易用性,它至今仍是特征提取和迁移学习的常用基准。
以下是该文档页面的核心内容讲解:
1. VGG 的核心设计理念
VGG 最大的贡献是证明了增加网络深度并使用**极小的卷积核(3 \\times 3)**能有效提升图像识别的效果。
-
堆叠卷积层:两个 3 \\times 3 卷积层的感受野等同于一个 5 \\times 5 卷积层,但参数量更少且引入了更多非线性变换。
-
统一结构:整个网络几乎全部由 3 \\times 3 卷积、步长为 2 的 2 \\times 2 最大池化层以及最后三个全连接层组成。
2. 文档中提供的模型变体
Torchvision 提供了多种深度的 VGG 版本,主要分为两类:
标准版 (Standard)
-
VGG11: 8 个卷积层 + 3 个全连接层。
-
VGG13: 10 个卷积层 + 3 个全连接层。
-
VGG16: 13 个卷积层 + 3 个全连接层(最常用)。
-
VGG19: 16 个卷积层 + 3 个全连接层。
带批归一化版 (With Batch Normalization)
在模型名称后加上 _bn(如 vgg16_bn)。
- 优势 :在卷积层和激活函数之间加入了 Batch Norm 层,能够加速模型收敛并提高训练稳定性。在实际应用中,强烈建议优先使用带
_bn的版本。
3. 如何调用预训练权重
在 0.26 文档中,调用方式遵循新的 Weights API 规范:
python
from torchvision.models import vgg16, VGG16_Weights
# 1. 加载默认的最佳权重 (通常是 IMAGENET1K_V1)
model = vgg16(weights=VGG16_Weights.DEFAULT)
# 2. 或者加载带 Batch Normalization 的版本
from torchvision.models import vgg16_bn, VGG16_BN_Weights
model_bn = vgg16_bn(weights=VGG16_BN_Weights.IMAGENET1K_V1)
4. 关键参数与性能
文档中列出了这些模型的详细规格,帮助你根据硬件条件进行选择:
-
参数量 (Params) :VGG 是著名的"显存杀手"。VGG16 大约有 1.38 亿 个参数,远高于 ResNet50(约 2500 万),主要原因在于其最后三个巨大的全连接层。
-
计算量 (GFLOPS):计算开销也相对较大。
-
输入要求 :期望输入为 224 \\times 224 的三通道图片,且需要经过特定的均值和标准差归一化处理(可以通过
weights.transforms()自动获取)。
5. VGG 的优缺点对比
| 优点 | 缺点 |
|---|---|
| 结构极其简洁:非常适合作为初学者理解 CNN 的第一个模型。 | 体积巨大:权重文件通常超过 500MB,不适合移动端部署。 |
| 特征提取能力强:其卷积层的特征表达非常细腻,常用于感知损失(Perceptual Loss)。 | 训练速度慢:由于参数量巨大,且早期版本没有 BN,收敛较慢。 |
演示
python
import torchvision
# train_data = torchvision.datasets.ImageNet("../data_image_net", split='train', download=True,
# transform=torchvision.transforms.ToTensor())
from torch import nn
# 加载 VGG16 模型,pretrained=False 表示只加载模型结构,参数是随机初始化的
vgg16_false = torchvision.models.vgg16(pretrained=False)
# 加载 VGG16 模型,pretrained=True 表示加载模型结构的同时,也加载在 ImageNet 数据集上训练好的权重
vgg16_true = torchvision.models.vgg16(pretrained=True)
# 打印预训练模型的结构,你会看到它分为 features(卷积层)、avgpool(池化层)和 classifier(全连接层)三部分
print(vgg16_true)
# 加载 CIFAR10 数据集。注意:CIFAR10 只有 10 个类别,而原生的 VGG16 是为 ImageNet 的 1000 个类别设计的
train_data = torchvision.datasets.CIFAR10('../data', train=True, transform=torchvision.transforms.ToTensor(),
download=True)
# 方法一:利用 add_module 在 classifier 这个 Sequential 容器的末尾追加一个新的线性层
# 该操作将 1000 个输出映射到 10 个输出,原有的 1000 个输出节点变成了隐藏层的一部分
vgg16_true.classifier.add_module('add_linear', nn.Linear(1000, 10))
print(vgg16_true)
# 打印未经过修改的随机初始化模型
print(vgg16_false)
# 方法二:通过索引 [6] 直接访问 classifier 中的最后一层,并将其替换为一个新的线性层
# 这种方法直接去掉了原有的 1000 类输出层,将其替换为 10 类输出层
vgg16_false.classifier[6] = nn.Linear(4096, 10)
print(vgg16_false)
这段代码演示了如何加载经典的 VGG16 模型,并展示了两种对预训练模型进行"手术"的方法:追加新层 和直接修改现有层。这在迁移学习(Transfer Learning)中是非常基础且实用的技巧。
1. 库引用与模型加载
-
vgg16_false: 你得到的是一个"空壳"。它有复杂的 VGG 架构,但里面的权重全是乱序的数字。如果你现在用它跑预测,结果和瞎猜没区别。 -
vgg16_true: 你得到的是一个"博学的老教授"。它已经看过了数百万张图片,能够识别狗、猫、救护车等 1000 种物体。在 0.26 版本的 torchvision 中,官方更推荐使用weights=VGG16_Weights.DEFAULT。
2. VGG16 的三段式结构
当你 print(vgg16_true) 时,请特别留意其结构:
-
features: 卷积层。负责从图片中提取边缘、纹理等特征。 -
avgpool: 自适应平均池化。将特征图尺寸统一。 -
classifier: 分类器。由 7 层组成(索引 0-6)。索引为 6 的那一层通常是Linear(4096, 1000)。
3. 为什么要修改模型?
原生 VGG16 的输出维度是 1000 ,但 CIFAR10 数据集只有 10 类。如果你不修改模型,计算损失函数(Loss)时会因为维度不匹配(1000 vs 10)而直接报错报错。
4. 两种"微创手术"方案对比
| 操作方式 | 代码实现 | 逻辑效果 | 适用场景 |
|---|---|---|---|
| 追加 (Add) | add_module('name', layer) |
在最后多加一关。原来的第 1000 类输出变成了一个特征转换层。 | 当你觉得原有的 1000 类分类信息对你的新任务也有辅助作用时。 |
| 替换 (Modify) | classifier[6] = layer |
拆掉旧层,换上新层。输入依然是 4096,输出变为 10。 | 最常用。直接改变网络最后一层的输出维度,结构更简洁,计算量略小。 |
5. 数据的加载
torchvision.datasets.CIFAR10: 这里下载了 5 万张 32 \\times 32 的图片。虽然 VGG16 原生设计是处理 224 \\times 224 图片的,但在代码层面,只要全连接层的输入(那层 4096)能对上,代码就能跑通。不过,通常建议在transform里加一个Resize((224, 224))来获得更好的效果。