找回密码
 立即注册
首页 业界区 安全 NVIDIA 深度学习新手入门 Assessment

NVIDIA 深度学习新手入门 Assessment

魁睥 2026-2-4 11:40:03
加载 ImageNet 预训练的基础模型

第一个FIXME,填入 DEFAULT, 参考迁移学习的 Notebook,此处填入 DEFAULT 即在 ImageNet 上预训练权重载入模型。
  1. from torchvision.models import vgg16from torchvision.models import VGG16_Weightsweights = VGG16_Weights.DEFAULTvgg_model = vgg16(weights=weights)
复制代码
冻结基础模型

通过设置 requires_grad_(False) 来冻结基础模型的参数,防止在训练过程中被更新。
  1. vgg_model.requires_grad_(False)
复制代码
向模型添加新层

nn.Linear(500, N_CLASSES)是模型的最终输出层,我们需要做一个六分类的任务,所以输出层的维度为 6。
  1. N_CLASSES = 6my_model = nn.Sequential(    vgg_model.features,    vgg_model.avgpool,    nn.Flatten(),    vgg_model.classifier[0:3],    nn.Linear(4096, 500),    nn.ReLU(),    nn.Linear(500, N_CLASSES))
复制代码
编译模型

这里填入 nn.CrossEntropyLoss() 作为损失函数,因为我们是一个六分类任务,所以选择交叉熵损失函数。
  1. loss_function = nn.CrossEntropyLoss()
复制代码
扩充数据

这里我先是使用了 O5b Notebook 中的扩充数据代码,但是效果不是很好,原因出在图片的饱和度上,hue值太高导致图片失真,对于水果的新鲜程度和水果的分类来说,颜色是一个重要参考依据,因此这里的饱和度设置不能过高,会误导模型的训练。你也可以将你需要训练的任务描述给AI,让它帮你生成一段扩充数据的代码段,再在此基础上进行微调。
  1. IMG_WIDTH, IMG_HEIGHT = (224, 224)random_trans = transforms.Compose([    transforms.RandomRotation(25),    transforms.RandomResizedCrop((IMG_WIDTH, IMG_HEIGHT), scale=(.7, 1), ratio=(1, 1)),    transforms.RandomHorizontalFlip(p=0.5),    transforms.ColorJitter(brightness=.2, contrast=.2, saturation=.2, hue=.05),     transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
复制代码
加载数据集

batch_size 选择

参考 05b Notebook 中的代码设置,这里设置 batch_size 为 32,使用 2 的幂次方可以提高训练效率,在中小型数据集上通常采用 32 作为 batch size。
参考教程中的讲解:
如果我们的数据集是一副卡,那么 DataLoader 就定义了我们如何从这副牌中抽卡来训练 AI 模型。我们可以一次性将整个数据集展示给我们的模型。这不仅需要大量的计算资源,而且研究表明使用较小的数据批次(batch)对模型训练更有效。
例如,如果我们的 batch_size 是 32,我们将洗牌并抽取 32 张卡片来训练我们的模型。由于模型在验证时不进行学习,因此不需要洗牌,但我们仍然会使用 batch_size 以防止内存错误。
批大小是模型开发者决定的,最佳值取决于具体的问题。研究表明,对于许多机器学习问题 32 或 64 就足够了,这也是一些机器学习框架的默认值,因此我们在这就用 32。
shuffle 选择

通常在训练集中设置 shuffle=True,而在验证集中设置 shuffle=False。

  • 训练集中设置 shuffle=True 是为了在每个 epoch 开始时随机打乱数据,这有助于模型学习到更泛化的特征。
  • 验证集中设置 shuffle=False 是为了保持验证数据的顺序,这有助于我们在评估模型性能时进行比较。
  1. n = 32train_path = "data/fruits/train/"train_data = MyDataset(train_path)train_loader = DataLoader(train_data, batch_size=n, shuffle=True)train_N = len(train_loader.dataset)valid_path = "data/fruits/valid/"valid_data = MyDataset(valid_path)valid_loader = DataLoader(valid_data, batch_size=n, shuffle=False)valid_N = len(valid_loader.dataset)
复制代码
训练模型

首次训练模型因为增强数据集的 hue 设置问题,模型准确率只有85%左右,要通过 Assessment,需要模型准确率在 92% 以上。调整增强数据集 transformer 的操作后,模型准确率提升到了90%左右。仍达不到标准要求,因此参考 Notebook 中的操作,再对模型进行微调。
参考 05b Notebook 中的讲解和代码,这时候我们需要解冻模型,以便对新添加的层进行训练。因此设置 vgg_model.requires_grad_(True)。
模型的新层经过训练后,我们还有一个可选的技巧,用于进一步改进模型。这个技巧称为微调。要执行此操作,我们需要先解冻整个模型,然后以极小的学习率 重新训练模型。这会让预训练的基础层以非常小的步伐进行微调,从而进一步改进模型的性能。
请注意,只有在包含冻结层和新层的模型经过充分训练后才能执行此步骤,这一点很重要。否则,由于我们先前添加到模型中的新的池化层和分类层是随机地初始化的,我们需要对它们的参数进行大量的更新才能实现准确的图像分类。而通过反向传播过程,在整个模型解冻的状态下,这种对最后两层的大量更新也可能导致预训练层中出现大量更新,从而破坏那些重要的预训练特征。现在这最后2层已经过训练且已收敛,因此再次训练时对模型整体的更新都要小得多(尤其是学习率非常小时),不会破坏前面那些层所预学到的特征。
  1. vgg_model.requires_grad_(True)
复制代码
模型微调完成后,模型准确率提升到了92%左右,符合要求。运行评估 cell 进行验证即可获得本节课的证书。
参考资料


  • vgg16 — Torchvision main documentation
  • torch.Tensor.requires_grad_ — PyTorch 2.10 documentation
  • Understanding requires_grad in PyTorch — codegenes.net
  • [How to Choose Loss Functions When Training Deep Learning Neural Networks - MachineLearningMastery.com]
  • PyTorch Loss Functions - GeeksforGeeks
  • torch.nn — PyTorch 2.10 documentation
  • Transforming images, videos, boxes and more — Torchvision 0.25 documentation
  • Getting started with transforms v2 — Torchvision 0.25 documentation
  • Transforming images, videos, boxes and more — Torchvision 0.25 documentation
  • PyTorch DataLoader - GeeksforGeeks

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2026-2-9 09:28:20

举报

2026-2-12 08:21:29

举报

懂技术并乐意极积无私分享的人越来越少。珍惜
昨天 03:22

举报

您需要登录后才可以回帖 登录 | 立即注册