getfromcode我的博客 会员免费

PyTorch深度学习开发 使用预训练的ResNet网络给图片分类

这份教程聚焦于利用 PyTorch 生态中预训练的 ResNet 模型进行图像分类,核心目标不是从头训练一个庞大的卷积网络,而是展示如何高效地加载、预处理并复用现有的权重进行推理。它解决了初学者常遇到的“理论懂了但不知道如何落地”的问题,直接给出了从数据管道构建到模型前向传播的完整代码逻辑。适合已经

单课价¥29新品 上架
会员价 会员免费开通会员,全站课程按额度无限下载套餐详情
133 人关注 更新于 2026-11-02 永久有效
发货

网盘链接 · 支付成功后自动发货

保障

永久有效 · 链接失效免费补发

客服

每日 9:00-21:00 在线客服 联系客服

购买方式开通会员 · 全站免费下单课购买 · 仅本课

支付成功后自动显示网盘下载链接;链接失效可联系客服免费补链,永久有效。

正版保障 极速发货 售后无忧

这份教程聚焦于利用 PyTorch 生态中预训练的 ResNet 模型进行图像分类,核心目标不是从头训练一个庞大的卷积网络,而是展示如何高效地加载、预处理并复用现有的权重进行推理。它解决了初学者常遇到的“理论懂了但不知道如何落地”的问题,直接给出了从数据管道构建到模型前向传播的完整代码逻辑。适合已经熟悉 Python 基础、了解张量(Tensor)概念,并初步接触过 PyTorch 基本操作(如 `torch.nn` 模块)的开发者。如果你之前只看过文档片段或零散的代码,缺乏一个完整的、可运行的端到端示例,这份资料正好填补了从“调用 API”到“理解数据流”之间的空白。

核心模块与代码结构解析

数据预处理与模型加载

教程首先展示了如何构建标准的图像变换管道(Transforms Pipeline)。这里涉及的关键点在于理解 `Resize`、`CenterCrop` 和 `ToTensor` 的执行顺序及其对模型输入张量维度的影响。ResNet 系列模型通常要求输入为 224x224 的标准化图像,因此预处理步骤必须严格匹配模型的期望格式。接着,代码演示了通过 `torchvision.models` 加载预训练权重,并切换到 `eval` 模式。这一步至关重要,因为 `eval` 模式会禁用 Dropout 和 BatchNorm 的训练行为,确保预测结果的稳定与可复现性。建议重点研读这部分代码,理解为什么不能直接跳过预处理或忘记设置模型状态,这是实际工程中容易踩坑的地方。

自学路径与实践建议

建议按照“环境配置 -> 数据加载 -> 模型推理 -> 结果解析”的顺序进行实践。首先,确保本地安装了正确版本的 PyTorch 和 Torchvision,并注意 CUDA 版本的兼容性。然后,不要仅仅复制粘贴代码,而是尝试修改输入图片,观察输出张量的变化。你可以尝试替换不同的预训练模型(如 ResNet50 或 ResNet152),对比不同深度模型在精度和推理速度上的差异。学完这部分内容后,你将能够独立构建一个基于预训练模型的轻量级分类服务,或者将这套推理逻辑集成到更大的计算机视觉项目中。资料中的代码结构清晰,变量命名规范,非常适合作为后续开发自定义模块时的参考模板。配合 PyTorch 官方文档中关于 `DataLoader` 和 `Transforms` 的章节,可以快速掌握数据管道的高级用法,从而应对更复杂的批量处理场景。

454ea3489b05aaf7e12684fee81631c9.png

import ssl
ssl._create_default_https_context = ssl._create_unverified_context import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image # 1. 加载模型
model = models.resnet101(pretrained=True)
model.eval() # 设置为预测模式 # 3. 图片处理
preprocess = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
]) # 4. 识别函数
def recognize_image(image_path): # 打开图片 image = Image.open('/Volumes/c/work/aigc/1.png').convert('RGB') # 关键:转换为RGB print(image) # 处理图片 input_tensor = preprocess(image) input_batch = torch.unsqueeze(input_tensor,0) # 增加一个维度 # 预测 with torch.no_grad(): output = model(input_batch) # 获取概率 probabilities = torch.nn.functional.softmax(output[0], dim=0) # 取前3个结果 top3_prob, top3_catid = torch.topk(probabilities, 3) # 默认类型 from torchvision.models import ResNet101_Weights weights = ResNet101_Weights.DEFAULT imagenet_classes = weights.meta["categories"] # 打印结果 print(f"\n识别结果: {image_path}") print("-" * 30) for i in range(top3_prob.size(0)): cat_id = top3_catid[i].item() prob = top3_prob[i].item() * 100 label = imagenet_classes[cat_id] print(f"{i + 1}. {label} ({prob:.1f}%)") print("-" * 30) # 5. 使用示例
if __name__ == "__main__": # 识别自己的图片(替换成你的图片路径) image_path = "1.png" # 改为你的图片路径 try: recognize_image(image_path) except FileNotFoundError: print(f"找不到图片: {image_path}") except Exception as e: print(f"出错: {e}")