PyTorch 图像分类实战:把 FoodVision 从训练循环跑进 Gradio 的 5 个环节
【免费下载链接】pytorch-deep-learningMaterials for the Learn PyTorch for Deep Learning: Zero to Mastery course.项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-deep-learning
把 FoodVision 数据集喂进 PyTorch 之前,先确认两件事:train 和 test 是不是分成了两个 DataLoader,transform 是不是同一套。上回有同事把测试集也shuffle=True了,训练时指标漂亮,一到评估就掉——这不是模型问题,是数据管道的问题。这个仓库(pytorch-deep-learning)本身就是按"数据 → 训练 → 模型 → 迁移 → 上线"的顺序组织的,下面照着这条真实落地链路走一遍,每个环节只讲这一步该干什么、为什么这么干。
加载 FoodVision:train 和 test 各建一个 DataLoader
数据这一步的目标不是"把图片读进来",而是让训练和验证在加载层面就彻底隔离。仓库里的create_dataloaders已经替你做了最稳的那版:两个ImageFolder、两个DataLoader,训练集开 shuffle 和pin_memory,测试集关 shuffle。
from torchvision import transforms from going_modular.data_setup import create_dataloaders transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) # train 开 shuffle,test 关 shuffle,这是唯一该改的地方 train_dl, test_dl, class_names = create_dataloaders( train_dir="data/pizza_steak_sushi/train", test_dir="data/pizza_steak_sushi/test", transform=transform, batch_size=32, )这段代码解决的是"两条数据流怎么隔离"。细节都在 数据加载函数 里,你只需要保证transform在两边是同一个对象,否则训练时看到的像素分布和评估时对不上。
五步走写一个会收敛的训练循环
训练循环是整个项目的地基,写对了后面所有东西都是复用的。一个 epoch 里对每个 batch 做五件事:前向、算 loss、清梯度、反向、更新参数。顺序不能乱,尤其是zero_grad()必须放在loss.backward()之前。
for batch, (X, y) in enumerate(train_dl): X, y = X.to(device), y.to(device) y_pred = model(X) # 1 前向 loss = loss_fn(y_pred, y) # 2 算 loss optimizer.zero_grad() # 3 清梯度 loss.backward() # 4 反向 optimizer.step() # 5 更新参数⚠️ 这里最容易踩的坑是把model.train()/model.eval()忘了切。评估时如果模型还处在 train 模式,Dropout 和 BatchNorm 的行为会污染指标。仓库把这套五步包成了train_step和test_step,再套一层train跑多个 epoch,逻辑和 训练循环实现 完全一致,直接 import 就行,不用自己重写。
用 EfficientNet 特征提取器省掉从头训练
数据量小的时候,从头训一个 CNN 往往又慢又不过拟合。更省事的打法是迁移学习:拿一个在 ImageNet 上预训练好的特征提取器,把它的分类头砍掉,换成你自己 101 类的分类头,然后把特征层全部冻结。
import timm feature_extractor = timm.create_model("hf_hub:timm/efficientnet_b2", pretrained=True, num_classes=0) # 0 表示去掉原分类头 for p in feature_extractor.parameters(): p.requires_grad = False # 冻结,只训新加的分类头num_classes=0是关键参数,它直接让模型只输出特征、不带分类头,你后面接自己的nn.Linear就行。想确认冻结有没有生效,用torchinfo打一下 summary 看可训练参数量是否骤降。完整思路在 迁移学习 notebook,模型骨架参考 TinyVGG 定义。
用 Gradio 把模型变成一个网页 demo
模型训好了,下一步不是写 API,而是先让它能被点。Gradio 的Interface只要三样东西:一个fn、一组inputs、一组outputs。把前向推理塞进fn,其余交给组件。
import gradio as gr def predict(image): image = transform(image).unsqueeze(0).to(device) with torch.inference_mode(): logits = model(image) # 前向推理 return torch.argmax(logits, dim=1).item() demo = gr.Interface(fn=predict, inputs=gr.Image(type="numpy"), outputs=gr.Label(num_top_classes=3)) demo.launch()这段解决"怎么让非工程师也能试模型"。顺手可以开一个 TensorBoard 记录每轮 loss 和 acc,对比不同超参的实验,仓库里 实验追踪 那节给的就是现成模板。上线细节看 部署 notebook。
下一步
想接着动手的话,README 的环境配置说明 和 部署练习 是最顺的两个入口,照着跑通一遍比读十遍文档都管用。
【免费下载链接】pytorch-deep-learningMaterials for the Learn PyTorch for Deep Learning: Zero to Mastery course.项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-deep-learning
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考