2026/4/18 16:37:17
网站建设
项目流程
国内网站 备案,丹东做网站,网站备案查询api,seo整站优化服务https://blog.csdn.net/weixin_45655710?typeblog 浙大疏锦行
DAY 44 预训练模型 知识点回顾#xff1a; 1.预训练的概念 2.常见的分类预训练模型 3.图像预训练模型的发展史 4.预训练的策略 5.预训练代码实战#xff1a;resnet18 作业#xff1a; 1.尝试在cifar10对比如下…https://blog.csdn.net/weixin_45655710?typeblog浙大疏锦行DAY 44 预训练模型知识点回顾1.预训练的概念2.常见的分类预训练模型3.图像预训练模型的发展史4.预训练的策略5.预训练代码实战resnet18作业1.尝试在cifar10对比如下其他的预训练模型观察差异尽可能和他人选择的不同2.尝试通过ctrl进入resnet的内部观察残差究竟是什么1.需要调用预训练模型和加载权重2.需要resize图片让其可以适配模型3.需要修改最后的全连接层以适应数据集其中训练过程中为了不破坏最开始的特征提取器的参数最开始往往先冻结住特征提取器的参数然后训练全连接层大约在5-10个epoch后解冻训练。主要做特征提取的部分叫做backbone骨干网络负责融合提取的特征的部分叫做Feature Pyramid Network (FPN); 负责输出的预测部分的叫做Head。首先复用下之前的代码这句话可以忽略这是未来的内容你好欢迎进入DAY 44预训练模型与迁移学习。今天的课程标志着你从“从零造轮子”正式迈入“站在巨人肩膀上”的阶段。利用 ImageNet 上预训练好的强大模型如 ResNet我们能用极少的数据和时间训练出远超之前的模型。以下是针对今日作业的详细指导涵盖了不同预训练模型的对比实验以及对 ResNet 残差结构的探索。作业 1对比其他预训练模型 (VGG16 vs MobileNetV2)为了体现差异性我选择了两个风格迥异的模型进行对比VGG16经典的“深层堆叠”网络参数量巨大约 1.38 亿特征提取能力强但训练慢。MobileNetV2专为移动端设计的轻量级网络引入了“深度可分离卷积”和“倒残差结构”速度快但精度略低。核心代码实现你需要修改create_model函数来适配不同的架构。注意 VGG 和 MobileNet 的分类头Head结构与 ResNet 不同。fromtorchvisionimportmodelsimporttorch.nnasnndefcreate_model(model_name,num_classes10,pretrainedTrue):ifmodel_namevgg16:modelmodels.vgg16(pretrainedpretrained)# VGG16 的分类头是 model.classifier[6]in_featuresmodel.classifier[6].in_features model.classifier[6]nn.Linear(in_features,num_classes)elifmodel_namemobilenet_v2:modelmodels.mobilenet_v2(pretrainedpretrained)# MobileNetV2 的分类头是 model.classifier[1]in_featuresmodel.classifier[1].in_features model.classifier[1]nn.Linear(in_features,num_classes)elifmodel_nameresnet18:modelmodels.resnet18(pretrainedpretrained)model.fcnn.Linear(model.fc.in_features,num_classes)returnmodel.to(device)# 在 main 函数中切换 model_name 进行实验# model create_model(vgg16)# model create_model(mobilenet_v2)实验预期观察点VGG16显存占用极高训练速度慢但在小图上可能不容易过拟合因为参数太多被 Dropout 抑制了。MobileNetV2训练飞快显存占用极低准确率可能略低于 ResNet18但性价比极高。作业 2深入 ResNet 内部探索残差结构要理解“残差”最好的办法是看源码。操作步骤在 VSCode 中按住Ctrl(Windows) 或Cmd(Mac) 点击代码中的models.resnet18。跳转后找到ResNet类定义重点关注BasicBlock类。核心代码解读 (BasicBlock)classBasicBlock(nn.Module):def__init__(self,inplanes,planes,stride1,downsampleNone):super(BasicBlock,self).__init__()# 两个 3x3 卷积self.conv1conv3x3(inplanes,planes,stride)self.bn1norm_layer(planes)self.relunn.ReLU(inplaceTrue)self.conv2conv3x3(planes,planes)self.bn2norm_layer(planes)self.downsampledownsampledefforward(self,x):identityx# 1. 保留原始输入短路连接outself.conv1(x)outself.bn1(out)outself.relu(out)outself.conv2(out)outself.bn2(out)ifself.downsampleisnotNone:identityself.downsample(x)# 如果维度变了需要调整 identity 的维度outidentity# 2. 核心操作将原始输入加到卷积输出上outself.relu(out)returnout残差Residual是什么传统的网络试图学习 而 ResNet 试图学习 即残差。物理意义如果不加残差深层网络容易发生“退化”Degradation即层数越深效果反而越差。残差连接提供了一条“高速公路”Shortcut让梯度能无损地传回前面的层解决了梯度消失问题使得训练 100 层甚至 1000 层的网络成为可能。 实验小贴士冻结策略作业代码中已经包含了freeze_model函数。在使用 VGG 时由于参数量巨大建议冻结model.features部分只训练model.classifier否则你的 GPU 可能会爆显存。Resize 问题虽然 CIFAR-10 是 32x32但大部分预训练模型如 VGG/ResNet在 ImageNet 上是 224x224 训练的。直接用 32x32 虽然能跑卷积核会自动适配但效果不如Upsample上采样到 224x224 好。不过为了节省计算资源作业中保持 32x32 也是可以接受的ResNet 对小图的适应性还不错。