ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PyTorch深度学习入门:张量、自动求导与手写数字识别实战

PyTorch深度学习入门:张量、自动求导与手写数字识别实战 2026年了还有人在问“深度学习到底怎么入门”“PyTorch 和 TensorFlow 该怎么选”。如果你也是这类问题这次我们直接来看 PyTorch 这条线从底层算法原理、框架核心机制到源码怎么读、项目怎么落地一条路走完。PyTorch 目前在深度学习、机器学习、计算机视觉领域的地位基本可以用“事实标准”来形容。无论是发论文、跑开源项目还是做工业部署大多数最新模型的首发实现都优先使用 PyTorch。这篇教程要做的不是念文档而是把真正影响你上手效率的知识点拆开讲张量运算、自动求导、数据集加载、模型训练闭环再配合一个完整的手写数字识别项目把整个流程串起来。先给一个总的判断PyTorch 的入门门槛并没有想象中高真正劝退初学者的往往不是框架本身而是环境配置、CUDA 版本、数据加载方式、训练循环写法这些细节。这篇文章会把最容易踩坑的部分单独拎出来讲并给出可复制的命令和代码。文章适合下面几类读者刚学完 Python 基础、准备进入深度学习方向的初学者需要把论文代码跑起来但频繁报错的研究生以及做机器学习或计算机视觉项目、想快速验证 idea 的开发者。1. PyTorch 核心能力速览在动手安装之前先用一张表看清 PyTorch 的能力边界。能力项说明项目类型开源深度学习框架由 Meta 主导维护社区生态庞大主要功能张量计算、自动求导、神经网络构建、模型训练与推理、分布式训练、TorchScript / ONNX 部署支持平台Windows、Linux、macOS支持 x86 架构部分版本支持 ARM 环境GPU 支持NVIDIA CUDA、部分 AMD ROCm 版本CPU 模式也可以完成学习和推理支持语言Python 为主同时提供 C 接口LibTorch上手难度中等比 TensorFlow 1.x 时代的静态图模式友好很多适用场景深度学习教学、研究实验、计算机视觉、自然语言处理、强化学习、模型部署是否支持批量任务原生支持 DataLoader 批量加载训练和推理均可批量执行是否支持接口调用支持 Python API也支持导出 ONNX / TorchScript 提供推理服务启动方式命令行 Python 脚本无强制 GUIJupyter Notebook 可用于交互式实验这里要强调一点PyTorch 不等于深度学习本身。深度学习是算法和理论PyTorch 是实现这些算法的工具。先搞清楚这个边界后面看源码时就不会被框架细节带偏。2. 适用场景、学习路径与合规边界2.1 PyTorch 适合解决什么问题从实际项目角度看PyTorch 最擅长的是以下几类工作第一计算机视觉任务。图像分类、目标检测、语义分割、人脸识别、图像生成等主流模型比如 ResNet、YOLO、SAM、Stable Diffusion 系列的实现大多数基于 PyTorch。如果你要做视觉方向PyTorch 基本是必选工具。第二自然语言处理任务。从早期的 RNN/LSTM到 Transformer、BERT、GPT 系列HuggingFace Transformers 库底层就是 PyTorch。做大模型微调、文本分类、机器翻译绕不开 PyTorch 生态。第三科研与算法验证。PyTorch 的动态图机制允许你像写普通 Python 一样调试网络结构改一行代码立刻能看到效果这在论文复现和算法实验阶段非常高效。第四工业部署的前置环节。PyTorch 模型可以导出为 ONNX、TorchScript再通过 TensorRT、ONNX Runtime、OpenVINO 等工具部署到服务器或边缘设备。先学会 PyTorch后续学部署工具链会顺畅很多。2.2 学习路径建议一个比较高效的学习顺序是Python 基础 - 深度学习基础理论神经网络、反向传播、损失函数、优化器- PyTorch 张量与自动求导 - 用 PyTorch 搭建神经网络 - 完成一个完整训练项目 - 学习数据集处理与模型保存加载 - 接触部署与性能优化。这个顺序基本对应 PyTorch 官方教程的路线也符合“先跑通、再深入、后优化”的工程实践套路。不建议一上来就啃源码更不建议跳过基础理论直接看大模型代码。根基不稳后面看注意力机制、分布式训练、混合精度训练时会非常吃力。2.3 版权、隐私与安全边界PyTorch 本身是开源框架遵循 BSD 风格许可证可以自由使用、修改和分发。但在使用 PyTorch 训练模型、处理数据时有几个边界必须注意训练数据来源必须合法。不要使用未经授权的图片、视频、音频、文本数据尤其是涉及个人肖像、隐私信息、商业版权的内容。模型生成内容要标注 AI 属性。如果用 PyTorch 做图像生成、文本生成、声音合成对外发布时需遵守平台规则和相关法规。人脸识别、声音克隆、伪造检测等敏感方向必须在合法授权范围内用于测试和研究不得用于欺诈、假冒或侵犯他人权益。自己训练的模型如果准备商用要确认数据授权链条完整特别是爬取的数据集。这些不是空话。PyTorch 只是工具工具本身没有倾向性但使用场景决定合规边界。后面涉及具体案例时也建议只在本地测试环境跑通流程。3. 环境准备与前置条件安装 PyTorch 之前先检查自己的机器状态。这里给出一套通用的环境检查清单具体版本号以实际安装时的最新稳定版为准。3.1 硬件要求学习 PyTorch 基础、跑 MNIST、CIFAR-10 这类小规模数据集纯 CPU 环境完全够用。一张入门级 NVIDIA 显卡可以明显加速训练但并不是必需项。做计算机视觉大模型训练或微调时才需要关注显存容量。显卡选择方面NVIDIA GPU 的 CUDA 生态最完整。如果使用 AMD 显卡可以关注 ROCm 版本的 PyTorch但安装复杂度更高很多第三方库的兼容性也弱一些。纯 Mac 用户可以使用 MPS 后端进行 GPU 加速不过生态里部分算子支持不完整。如果你不确定自己的显卡能不能跑 CUDA可以用下面的命令检查。nvidia-smi如果命令正常输出显卡型号和驱动信息说明 NVIDIA 驱动已安装。如果提示找不到命令需要先安装或更新显卡驱动。3.2 Python 版本与依赖管理PyTorch 对 Python 版本有明确要求通常支持当前主流的 3.8 到 3.11 或更高版本。具体支持范围以 PyTorch 官网发布的 whl 包为准。这里强烈建议使用 Anaconda 或 Miniconda 管理 Python 环境避免多个项目之间依赖冲突。conda create -n pytorch python3.10 conda activate pytorch创建独立环境的好处是以后跑其他深度学习项目时不会因为你装了一个新库把 PyTorch 环境搞坏。3.3 CUDA 与 cuDNNCUDA 是 NVIDIA GPU 的并行计算平台cuDNN 是深度神经网络的加速库。PyTorch 的 GPU 版安装包会自带对应的 CUDA 运行库但显卡驱动需要满足最低版本要求。这里容易踩一个坑CUDA 驱动版本和 CUDA 运行版本是两个概念。PyTorch 安装时指定的 CUDA 版本是运行库版本比如 cu118、cu121、cu124它们会随 pip 包一起安装。而nvidia-smi显示的 CUDA Version 是驱动支持的最高版本。只要驱动版本不落后于 PyTorch 需要的 CUDA 版本就能正常使用 GPU。建议直接在命令行执行python -c import torch; print(torch.cuda.is_available())输出True说明 GPU 可用输出False则需要检查驱动或重新安装对应版本的 PyTorch。4. PyTorch 安装与启动方式PyTorch 的安装方式主要有三种pip 安装、conda 安装、源码编译。对绝大多数人来说pip 或 conda 安装就够了。源码编译耗时很长而且容易遇到环境依赖问题不建议初学阶段尝试。4.1 pip 安装进入 PyTorch 官网首页选择操作系统、安装方式、CUDA 版本后官网会自动生成对应的安装命令。如果不需要 GPU 加速直接安装 CPU 版即可体积更小、安装更快。CPU 版安装命令pip install torch torchvision torchaudioCUDA 版安装命令示例以官方生成命令为准pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124国内用户如果下载速度慢可以尝试配置国内 PyPI 镜像但要注意 PyTorch 官方源和 PyPI 镜像中默认 torch 版本可能不同建议优先使用官方源。安装完成过后检查版本python -c import torch; print(torch.__version__)4.2 conda 安装如果你使用 Anaconda 管理环境也可以通过 conda 安装conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidiaconda 安装会自动处理 CUDA 相关依赖对手动配置不熟悉的用户更省心缺点是更新频率通常比 pip 慢一些。4.3 验证安装结果安装完成之后跑一段简单的张量运算来验证环境是否正常import torch x torch.tensor([[1.0, 2.0], [3.0, 4.0]]) y torch.tensor([[5.0, 6.0], [7.0, 8.0]]) z x y print(z) if torch.cuda.is_available(): device torch.device(cuda) x_gpu x.to(device) print(GPU 可用执行设备, torch.cuda.get_device_name(0)) else: print(当前环境未检测到 GPU使用 CPU 执行。)这段代码同时验证了张量运算和 GPU 可用性。如果你看到矩阵乘法结果输出说明 PyTorch 已经能正常工作了。4.4 关于“源码解读”的启动方式很多同学想直接阅读 PyTorch 源码但不清楚从哪看起。PyTorch 的 Python 层源码存放在 GitHub 仓库的torch目录下C 底层实现、CUDA 算子、自动求导引擎则在aten和torch/csrc目录中。初学阶段不建议直接看 C 部分先从 Python 层的 API 入手理解接口行为再逐步深入到算子实现。阅读源码的第一步其实是学会定位源码位置。在 Python 中执行import torch import inspect print(inspect.getfile(torch.Tensor))inspect.getfile可以查看一个类或函数所在的源文件路径。用这种方式你可以在本地直接打开 PyTorch 的 Python 源码进行阅读和调试。这个方法在解读框架源码时非常实用。5. PyTorch 核心机制从张量到自动求导安装完成后不要急着开项目。先花一点时间理解 PyTorch 的四个核心概念张量、自动求导、神经网络模块和优化器。这四个概念是后续所有代码的基础。5.1 张量Tensor张量是 PyTorch 中最基本的数据结构可以理解为多维数组。标量是 0 维张量向量是 1 维张量矩阵是 2 维张量图像数据通常是 4 维张量形状为(批量大小, 通道数, 高度, 宽度)。创建张量的常见方式import torch # 从列表创建 a torch.tensor([1, 2, 3]) print(a) # 全零张量 zeros torch.zeros(2, 3) print(zeros) # 随机张量标准正态分布 randn torch.randn(3, 3) print(randn) # 与 NumPy 互转 import numpy as np np_array np.array([1.0, 2.0, 3.0]) torch_array torch.from_numpy(np_array) print(torch_array)张量支持与 NumPy 类似的操作索引、切片、变形、拼接、矩阵乘法。和 NumPy 的关键区别是PyTorch 张量可以放在 GPU 上执行并且具备自动求导能力。5.2 自动求导Autograd自动求导是 PyTorch 的核心杀手锏。训练神经网络时需要根据损失函数对模型参数求梯度然后通过梯度下降更新参数。PyTorch 会自动记录张量上的所有运算并在调用backward()时自动计算梯度。最简单的自动求导示例import torch x torch.tensor(2.0, requires_gradTrue) y x ** 2 3 * x 1 y.backward() print(x.grad) # dy/dx 2*x 3 7这里requires_gradTrue告诉 PyTorch 需要追踪这个张量的运算backward()触发反向传播梯度保存在x.grad中。如果不需要计算梯度可以用torch.no_grad()包裹推理代码减少内存消耗和计算开销with torch.no_grad(): y_pred model(x_test)5.3 神经网络模块nn.ModulePyTorch 通过torch.nn模块提供神经网络的构建组件。所有自定义网络模型都应该继承nn.Module并在__init__中定义子层在forward中定义前向传播逻辑。一个最简单的线性模型示例import torch.nn as nn class LinearModel(nn.Module): def __init__(self): super().__init__() self.linear nn.Linear(784, 10) def forward(self, x): return self.linear(x) model LinearModel() print(model)这里定义了一个输入维度 784、输出维度 10 的线性层对应 MNIST 手写数字识别任务的输入输出形状。后续做实战项目时会基于这个结构扩展成多层感知机。5.4 损失函数与优化器损失函数用于衡量模型预测值与真实标签之间的差距优化器负责根据梯度更新模型参数。import torch.optim as optim criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001)这里CrossEntropyLoss常用于分类任务Adam是目前深度学习中最常用的优化器之一。训练循环中每轮迭代执行五个步骤前向传播、计算损失、梯度清零、反向传播、更新参数。# 前向传播 outputs model(images) # 计算损失 loss criterion(outputs, labels) # 梯度清零 optimizer.zero_grad() # 反向传播 loss.backward() # 更新参数 optimizer.step()这五行代码是 PyTorch 训练循环的标准套路。无论多复杂的模型核心逻辑都是这个骨架。6. 项目实战基于 PyTorch 的 MNIST 手写数字识别理论部分讲完了现在用一个完整的项目把整个流程串起来。MNIST 是一个手写数字图片数据集包含 60000 张训练图片和 10000 张测试图片每张图片是 28x28 的灰度图。这个项目适合作为 PyTorch 的第一个实战练习。6.1 项目目标训练一个神经网络模型输入一张手写数字图片输出该图片对应的数字类别0-9。要求模型在测试集上的准确率达到 95% 以上。对于 MNIST 任务来说这个目标用简单的全连接网络就能达到。6.2 数据集加载PyTorch 的torchvision库提供了常用数据集的下载接口import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoader # 数据预处理将 PIL 图像转为张量并归一化到 [-1, 1] transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) # 下载并加载训练集 train_dataset torchvision.datasets.MNIST( root./data, trainTrue, downloadTrue, transformtransform ) # 下载并加载测试集 test_dataset torchvision.datasets.MNIST( root./data, trainFalse, downloadTrue, transformtransform ) train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size64, shuffleFalse)DataLoader是 PyTorch 的批量数据加载器batch_size64表示每次迭代拿 64 张图片shuffleTrue表示每个 epoch 开始前打乱数据顺序。注意第一次运行时会下载数据集需要保证网络可用。如果下载速度慢或者下载失败可以手动从官方源下载数据集文件放入./data/MNIST/raw/目录然后再运行代码。这是初学阶段最容易遇到的一个坑。6.3 模型定义这里构造一个简单的多层感知机MLP模型class MLP(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(28 * 28, 256) self.fc2 nn.Linear(256, 128) self.fc3 nn.Linear(128, 10) self.relu nn.ReLU() def forward(self, x): x x.view(x.size(0), -1) # 展平为 (batch_size, 784) x self.relu(self.fc1(x)) x self.relu(self.fc2(x)) x self.fc3(x) return x model MLP()x.view(x.size(0), -1)的作用是把 28x28 的二维图片展平成一维向量因为全连接层需要接收一维输入。这里可以看到 PyTorch 动态图的优势forward函数就是普通 Python 代码中间可以插入任意张量操作调试非常直观。6.4 训练循环完整训练代码如下device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) num_epochs 5 for epoch in range(num_epochs): running_loss 0.0 for images, labels in train_loader: images, labels images.to(device), labels.to(device) outputs model(images) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() running_loss loss.item() print(fEpoch [{epoch 1}/{num_epochs}], Loss: {running_loss / len(train_loader):.4f})如果你的机器有 NVIDIA GPUdevice会自动选择cuda训练速度会比 CPU 快很多。如果没有 GPU代码也能在 CPU 上正常运行只是耗时更长。6.5 模型评估训练完成后在测试集上评估模型准确率correct 0 total 0 with torch.no_grad(): for images, labels in test_loader: images, labels images.to(device), labels.to(device) outputs model(images) _, predicted torch.max(outputs.data, 1) total labels.size(0) correct (predicted labels).sum().item() print(f测试集准确率: {100 * correct / total:.2f}%)torch.no_grad()在推理阶段关闭自动求导可以节省大量内存。这里torch.max(outputs.data, 1)返回每个样本预测分数最高的类别索引也就是模型的预测结果。如果准确率稳定在 95% 以上说明整个 PyTorch 训练闭环已经跑通了。6.6 模型保存与加载训练好的模型需要保存方便后续推理和部署# 保存模型权重 torch.save(model.state_dict(), mnist_mlp.pth) # 加载模型权重 model MLP() model.load_state_dict(torch.load(mnist_mlp.pth, weights_onlyTrue)) model.eval()这里建议使用weights_onlyTrue参数。PyTorch 2.6 版本开始torch.load的weights_only默认值发生了变化如果不显式指定加载旧版本 pickle 格式的模型文件时可能遇到兼容性问题。更稳妥的做法是训练完成后只保存state_dict也就是模型权重而不是整个模型对象。7. 性能观察CPU、GPU 与精度格式跑完第一个项目后需要建立性能意识。深度学习训练和推理的耗时、显存占用、精度选择直接影响后续项目能不能跑起来。7.1 训练时间对比同一个 MNIST 任务CPU 和 GPU 的差异主要体现在矩阵运算规模上。数据量小、模型层数少时CPU 和 GPU 的差距不明显因为 CPU 和 GPU 之间的数据传输也要耗时。模型变大、数据量增大后GPU 的并行计算优势才会完全体现。建议第一次训练时分别用 CPU 和 GPU 跑一遍记录每个 epoch 的耗时。这比看任何理论分析都直观。7.2 显存占用观察在训练循环中加入 GPU 显存信息输出可以实时观察显存占用变化if torch.cuda.is_available(): print(f显存分配: {torch.cuda.memory_allocated() / 1024 ** 2:.2f} MB) print(f显存缓存: {torch.cuda.memory_reserved() / 1024 ** 2:.2f} MB)显存占用和以下因素直接相关模型参数量、批量大小、输入分辨率、优化器状态数量。如果训练时报CUDA out of memory优先降低batch_size其次降低输入图片分辨率。7.3 FP32、FP16、BF16、TF32 的选型深度学习中训练和推理默认使用 FP3232 位浮点数。但近年来FP16、BF16、TF32 越来越多地出现在模型训练和部署中。这些精度格式直接影响显存占用、计算速度和模型精度在做深度学习模型部署时必须了解。精度格式位数指数位尾数位主要用途FP3232 位8 位23 位默认训练精度兼容性最好FP1616 位5 位10 位混合精度训练和推理计算快但范围有限BF1616 位8 位7 位大模型训练常用动态范围接近 FP32TF3219 位8 位10 位NVIDIA Ampere 架构 GPU 的加速模式FP16 和 BF16 都是 16 位浮点数但 BF16 保留了和 FP32 一样的指数位因此动态范围更大不容易出现数值溢出。所以大模型训练更多用 BF16常规视觉任务用 FP16 居多。使用 PyTorch 混合精度训练可以用torch.cuda.amp模块from torch.cuda.amp import autocast, GradScaler scaler GradScaler() for images, labels in train_loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() with autocast(): outputs model(images) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()混合精度的思路是前向传播和反向传播用 FP16 计算梯度更新用 FP32 保存兼顾速度与稳定。使用混合精度时需要额外处理梯度缩放否则小梯度可能被 FP16 的精度范围截断导致训练失败。如果你的显卡支持 TF32可以开启 TF32 加速矩阵运算精度损失相对较小但速度提升明显。开启方式torch.backends.cuda.matmul.allow_tf32 True torch.backends.cudnn.allow_tf32 True实测项目中做深度学习模型部署和推理优化时FP16 和 BF16 的选型会直接影响显存占用。例如同样的模型FP16 权重比 FP32 权重省一半显存。这也是为什么现在的模型部署工具链几乎都支持半精度推理。7.4 降低显存和资源占用的通用策略优先顺序建议降低批量大小 - 降低输入分辨率 - 使用梯度累积 - 开启混合精度训练 - 使用梯度检查点。梯度累积是批量大小受限时的常用替代方案本质是在多个小批量上累计梯度后统一更新参数。实现方式accumulation_steps 4 optimizer.zero_grad() for i, (images, labels) in enumerate(train_loader): outputs model(images) loss criterion(outputs, labels) loss loss / accumulation_steps loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()这样可以用 4 个 16 的批量模拟出一个 64 的批量效果显存压力大幅降低。8. 常见问题与排查方法PyTorch 入门过程中很多错误是重复出现的。这里整理一份高频问题排查表。问题现象可能原因排查方式解决方案import torch报错或内核崩溃Python 版本不兼容、torch 包损坏检查 Python 版本重新安装 torch创建新环境并重新安装 PyTorchtorch.cuda.is_available()返回 False驱动版本过低、CUDA 版本不匹配、安装的是 CPU 版执行nvidia-smi查看驱动查看torch.__version__安装对应 CUDA 版本的 PyTorch或升级驱动训练时报CUDA out of memory批量大小过大、输入尺寸过大、显存不足查看nvidia-smi的显存占用降低 batch_size、降低分辨率、使用混合精度数据集下载卡住或失败网络问题、官方源连接不稳定检查下载链接是否可访问手动下载数据集放入本地目录torch.load报错权重不匹配模型结构与权重文件定义不一致打印模型结构检查每层形状统一模型定义和保存时的结构损失值不下降学习率过高或过低、数据未归一化、模型结构错误打印每一层的输出形状调整学习率、检查数据预处理训练时每个 epoch 都很慢使用 CPU 训练、GPU 未生效、batch_size 太小检查 device 输出、使用 GPU 训练调整设备、增大 batch_size使用torch.load出现安全警告或兼容性报错PyTorch 2.6 以上weights_only参数变化查看 PyTorch 版本加载时显式指定weights_onlyTrue批量任务过程中程序中断数据加载线程问题、显存不足、无断点续跑查看日志定位中断位置增加异常捕获和日志记录定期保存 checkpoint除了上面的表格还有两个值得单独说明的常见问题。第一个是安装 PyTorch 时下载速度极慢。PyTorch 的安装包体积较大几个 GB 的 CUDA 版本很常见。如果网络不佳可以优先选择 CPU 版本完成学习后续有 GPU 需要再单独安装 CUDA 版。或者使用 conda 创建环境后通过国内镜像源安装。第二个是环境混乱导致依赖冲突。很多初学者在一个 Python 环境里反复安装库最后 torch 版本和其他依赖不兼容整个环境无法使用。最有效的解决方案是发现问题直接用 conda 新建一个干净环境不要在一棵树上吊死。conda create -n pytorch_new python3.10 conda activate pytorch_new pip install torch torchvision torchaudio这个思路同样适用于后续的模型测试和项目隔离。9. 最佳实践与学习建议接触 PyTorch 一段时间后你会发现大部分问题其实不是框架问题而是工程习惯问题。下面这些建议来自实际项目中的高频体验可以帮你少走弯路。9.1 从小参数开始测试无论跑什么模型第一次运行都先用小批量、小尺寸、低 epoch 数验证代码路径。比如把batch_size改为 2把图片缩放到小尺寸把 epoch 设为 1。代码能完整跑完一遍再逐步增加参数规模。直接上大参数跑大概率会浪费大量时间在错误排查上。9.2 保留一套最小可运行配置新建项目时先备份一份“能跑通的最简代码”。后续改模型结构、加数据集增强、调损失函数无论怎么改只要出问题就回到最小配置重新跑。这套配置是你的安全网。9.3 目录结构要清晰一个典型的深度学习项目目录project/ ├── data/ # 数据集存放位置 ├── models/ # 模型定义代码 ├── checkpoints/ # 训练过程中的模型权重保存 ├── logs/ # 训练日志 ├── utils/ # 工具函数 ├── train.py # 训练脚本 ├── test.py # 测试脚本 └── config.py # 配置文件数据集、模型权重、日志分开存放不仅方便管理也方便后续做批量实验时对比不同配置的效果。9.4 保存 checkpoint 而不是只保存最终权重训练长任务时每隔若干个 epoch 保存一次 checkpoint包含模型权重、优化器状态、当前 epoch 数、最佳准确率。训练中断时可以从中断处继续不用从头开始。checkpoint { epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), best_acc: best_acc, } torch.save(checkpoint, fcheckpoints/checkpoint_epoch_{epoch}.pth)9.5 接口调用与批量任务的落地思路如果以后要把 PyTorch 模型接入实际业务常见做法是先把训练好的模型导出为 ONNX 或 TorchScript再通过 FastAPI、Flask 等服务框架封装成 HTTP 接口。批量任务的处理思路是使用队列和缓存目录输入图片放入输入目录后台进程批量推理结果写入输出目录并在每条记录上标记状态。通用接口调用示例模板import requests url http://127.0.0.1:8000/predict payload { image_path: ./data/test_images/0.jpg } response requests.post(url, jsonpayload, timeout30) print(response.json())如果模型直接加载到 PyTorch 服务进程中推理时需要使用torch.no_grad()并用model.eval()切换为推理模式。9.6 模型评估与发布合规训练完模型后不要只看训练集准确率。要检查测试集、验证集的准确率、损失值、混淆矩阵。如果模型涉及人脸识别、声音处理、内容生成发布前必须确认数据和模型的使用范围避免侵犯肖像权、版权和隐私权。10. 总结与下一步方向PyTorch 最值得花时间掌握的核心不是记住每个 API而是理解“张量计算 自动求导 模块化网络构建 训练闭环”这套底层逻辑。把这套逻辑跑通后面的 CNN、RNN、Transformer、扩散模型本质都是在这个骨架上替换网络结构而已。拿到这套基础后第一步建议重新过一遍本文第 5 节的自动求导示例和第 6 节的手写数字识别项目确保在本地环境完完整整跑通。第二步可以开始做数据增强、调整网络深度、切换优化器观察这些改动对准确率的影响。第三步可以尝试用 GPU 训练更复杂的数据集比如 CIFAR-10并对比混合精度训练的效果。最容易踩的坑集中在环境配置和数据集加载上。安装时务必确认 CUDA 版本、Python 版本和 PyTorch 版本三者匹配运行项目时优先确认数据集的下载和加载路径。接下来可以继续探索的方向包括用 PyTorch 构建卷积神经网络做图像分类、使用 TorchVision 加载预训练模型做迁移学习、用 HuggingFace Transformers 跑 BERT 和 GPT 系列模型、把 PyTorch 模型导出为 ONNX 并通过不同推理引擎做部署。每一步都是独立的技能树但根基都在本文覆盖的这套基础流程里。建议把文章里的代码复制到本地逐个跑通遇到环境问题优先用 conda 新建环境解决。收藏备用后面做深度学习项目时随时回来看这些基础闭环。
返回列表