Torchvision 0.26:深度学习视觉库全面解析

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 驱动)。

  • 常用操作 :包括 RandomResizedCropNormalizeColorJitter 以及强大的 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_imageread_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. 如何选择模型?

  • 追求速度(移动端/嵌入式) :选择 MobileNetV3ShuffleNetV2

  • 追求精度(研究/高配服务器) :选择 ConvNeXtViT_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) 时,请特别留意其结构:

  1. features: 卷积层。负责从图片中提取边缘、纹理等特征。

  2. avgpool: 自适应平均池化。将特征图尺寸统一。

  3. 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)) 来获得更好的效果。
相关推荐
Narrastory2 小时前
Note:强化学习(三)
人工智能·深度学习·强化学习
做个文艺程序员2 小时前
Spring Boot 封装 OpenClAW 服务层最佳实践【OpenClAW + Spring Boot 系列 第2篇】
java·人工智能·spring boot·开源
长安第一美人2 小时前
算能 BM1688 低延迟推流:Qt+WebSocket 直出 H5/HDMI
开发语言·网络·嵌入式硬件·websocket·交互
qyr67892 小时前
全球多旋翼无人机动力系统市场分析报告
大数据·人工智能·数据分析·市场报告·多旋翼无人机动力系统
思绪无限2 小时前
YOLOv5至YOLOv12升级:石头剪刀布手势识别系统的设计与实现(完整代码+界面+数据集项目)
深度学习·yolo·目标检测·yolov12·yolo全家桶·石头剪刀布手势识别系统
Techblog of HaoWANG2 小时前
目标检测与跟踪(15)-- conda 环境与 roslaunch 节点解释器不一致问题的排查与工程化修复
人工智能·目标检测·计算机视觉·机器人·conda
2501_947908202 小时前
2026钢铁冶金重载机器人怎么选?五大品牌深度对比与焊接应用方案
人工智能·机器人
kaikaile19952 小时前
复杂网络基本模型的 MATLAB 实现
网络·matlab
爱编程的小吴2 小时前
PyTorch+Transformer大模型入门到精通:LLM训练、推理、量化、部署全攻略
人工智能·pytorch·transformer