
为 torchvision 预训练模型准备数据时transform 手动创建和使用 weights 自动创建有什么区别【免费下载链接】pytorch-deep-learningMaterials for the Learn PyTorch for Deep Learning: Zero to Mastery course.项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-deep-learning在 PyTorch 课程材料Learn PyTorch for Deep Learning: Zero to Mastery本仓库的迁移学习实战中有一个绕不开的步骤把自定义图片变成预训练模型能接受的格式。06_pytorch_transfer_learning.ipynb 中给出了两条路径——手动用torchvision.transforms拼一条 transform 流水线manual creation或者在torchvisionv0.13 中通过weights.transforms()从预训练权重对象自动生成auto creation。两者的输入输出格式要求相同差别在于参数来源和可定制性本文以EfficientNet_B0和仓库自带的 pizza/steak/sushi 数据集为例完整走一遍这两种做法。前提为什么 transform 必须和预训练数据一致文档反复强调一条原则送入模型的自定义数据必须和模型最初训练时使用的原始数据以同样的方式准备。如果预测时图片的变换方式和训练时不同例如归一化用的均值、标准差不对预测结果可能会有偏差these predictions may be off。在torchvisionv0.13 之前官方文档对预训练模型的输入要求是输入是 3 通道 RGB 的小批次形状为(3 x H x W)H 和 W 至少 224像素值先加载到[0, 1]区间再按mean [0.485, 0.456, 0.406]、std [0.229, 0.224, 0.225]归一化。文档同时说明这些均值和标准差是从 ImageNet 数据集的子集上计算出来的归一化不是强制的网络自己也能学到分布但提前设定可以让网络更快达到更好的性能。另外注意有些torchvision.models中的模型不是 224 输入文档举例有些模型取[3, 240, 240]具体尺寸以对应模型的文档为准。准备数据与 DataLoaders 工具本仓库已提供数据集压缩包 data/pizza_steak_sushi.zip解压后得到标准的train/test目录结构。创建 DataLoader 使用仓库中going_modular目录下的create_dataloaders()函数见 data_setup.py调用形如from going_modular.going_modular import data_setup train_dataloader, test_dataloader, class_names data_setup.create_dataloaders( train_dirtrain_dir, # 训练集目录如 data/pizza_steak_sushi/train test_dirtest_dir, # 测试集目录如 data/pizza_steak_sushi/test transformtransforms, # 下面两种 transform 之一 batch_size32, )如果本地没有going_modular目录notebook 自带的降级逻辑会提示从课程 GitHub 仓库获取本文不展开该步骤。路径一手动创建 transformtorchvision0.13 及更早版本文档把旧方法称为 manual creation。把上面表格里的四项要求翻译成Compose流水线from torchvision import transforms # Create a transforms pipeline manually (required for torchvision 0.13) manual_transforms transforms.Compose([ transforms.Resize((224, 224)), # 1. 所有图片缩放到 224x224部分模型需要别的尺寸 transforms.ToTensor(), # 2. 把图像像素值转到 0~1 transforms.Normalize(mean[0.485, 0.456, 0.406], # 3. 每通道均值为 [0.485, 0.456, 0.406] std[0.229, 0.224, 0.225]) # 4. 每通道标准差为 [0.229, 0.224, 0.225] ])对应关系是文档给出的四步映射要求实现至少 224x224 的[batch_size, 3, height, width]批次transforms.Resize()缩放 DataLoader组批像素值在 0 与 1 之间transforms.ToTensor()每通道均值[0.485, 0.456, 0.406]transforms.Normalize(mean...)每通道标准差[0.229, 0.224, 0.225]transforms.Normalize(std...)文档解释为什么保留这段手动写法你可能会在别的资料中遇到这种风格而且由于它是手写的infinitely customizable——如果想加入数据增强技术可以直接往这条流水线里插。路径二用weights.transforms()自动创建torchvision0.13torchvisionv0.13 新增了自动 transform 创建功能。先选定预训练权重import torchvision # .DEFAULT ImageNet 上性能最好的可用权重 weights torchvision.models.EfficientNet_B0_Weights.DEFAULT其中EfficientNet_B0_Weights是模型架构对应的权重类DEFAULT表示当前最好的可用权重。文档补充不同架构还可能看到IMAGENET_V1、IMAGENET_V2等选项一般版本号越高越好如果只想要最好的DEFAULT是最省事的选择。然后一行拿到 transform# Get the transforms used to create our pretrained weights auto_transforms weights.transforms()文档把这一行理解为获取当年在 ImageNet 上训练这份EfficientNet_B0_Weights时所用的数据变换。在 notebook 的实际运行输出中auto_transforms的内容为文档示例ImageClassification( crop_size[224] resize_size[256] mean[0.485, 0.456, 0.406] std[0.229, 0.224, 0.225] interpolationInterpolationMode.BICUBIC )两种方式的实质区别手动创建manualweights.transforms()自动创建auto适用版本torchvision 0.13 所需torchvisionv0.13 提供参数来源自己按文档抄写 ImageNet 的 mean/std 和尺寸随你选定的权重对象自动附带与预训练分布的一致性需要自己保证写对文档明确说这保证你使用的是该预训练模型训练时的同一套数据变换可定制性可以任意增改例如加入数据增强文档给出的代价是缺乏定制化lack of customization文档的结论原文自动创建的好处是确保用同一套变换而自动创建 transform 的代价是缺乏可定制性。注意示例输出里自动流水线的resize_size是[256]、crop_size是[224]和手写版直接Resize((224, 224))并不完全相同——这正是以权重对象为准的意义所在。另外注意版本迁移在旧版本中模型这样建model torchvision.models.efficientnet_b0(pretrainedTrue).to(device)。文档说明这种写法在torchvisionv0.13 会触发UserWarning例如 The parameter pretrained is deprecated since 0.13 and will be removed in 0.15, please use weights instead.新版对应写法是weights torchvision.models.EfficientNet_B0_Weights.DEFAULT model torchvision.models.efficientnet_b0(weightsweights).to(device)也就是说 weights 对象既用来建模型也用来生成 transform两者天然绑定。如何验证 transform 创建成功文档中的验证方式是直接打印对象对照内容是否符合预期weights # 文档示例输出EfficientNet_B0_Weights.IMAGENET1K_V1 auto_transforms确认 mean/std 与 ImageNet 数值一致后把它传入 DataLoader 即算完成接入train_dataloader, test_dataloader, class_names data_setup.create_dataloaders( train_dirtrain_dir, test_dirtest_dir, transformauto_transforms, # 对自定义数据执行与预训练模型相同的变换 batch_size32, )后续预测单张图片时也要用同一套 transform。notebook 里的pred_and_plot_image()函数接受transform参数文档说明它会默认使用前面创建的manual_transforms也可以换成weights.transforms()生成的那一份不传时函数内部会回退到一组Compose([Resize, ToTensor, Normalize(...)])。可选分支在自动 transform 之上加数据增强如果你确实需要定制文档给出的组合方式是保留自动 transform 作为基础、在前面追加增强只作用于训练数据09_pytorch_model_deployment.ipynb 中的 Food101 示例# 只对训练图片做数据增强测试/推理仍用原始 effnetb2_transforms food101_train_transforms torchvision.transforms.Compose([ torchvision.transforms.TrivialAugmentWide(), # 与 EfficientNet 原论文相同的增强 effnetb2_transforms, # 来自 weights.transforms() 的自动 transform ])该 notebook 同时展示了完整的推理侧用法create_effnetb2_model()内部就是weights torchvision.models.EfficientNet_B2_Weights.DEFAULT→transforms weights.transforms()→model torchvision.models.efficientnet_b2(weightsweights)训练 DataLoader、测试集预测pred_and_store(..., transformeffnetb2_transforms, ...)和部署推理函数都复用这同一份 transform保证图片打开和变换的方式与模型训练时相同。选择建议项目使用torchvisionv0.13优先weights.transforms()transform 与你选定的权重对象绑定不用手写数值需要往流水线里加数据增强或调整细节基于自动 transform 再Compose一层如上面的TrivialAugmentWide示例或沿用手动流水线——文档明确说手动流水线无限可定制维护旧代码或参考旧资料时手动创建是 v0.13 之前的既定写法遇到pretrainedTrue的弃用警告时按上文切到weights参数。【免费下载链接】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),仅供参考