news 2026/5/8 0:37:38

day47_预训练模型与迁移学习@浙大疏锦行

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day47_预训练模型与迁移学习@浙大疏锦行

Day 47 预训练模型与迁移学习@浙大疏锦行

  • 理解预训练模型(Pre-trained Models)的概念与优势。
  • 掌握迁移学习(Transfer Learning)的两种主要策略:微调(Fine-tuning)与 特征提取(Feature Extraction)。
  • 了解常见经典模型结构:ResNet(残差网络)与 MobileNet(轻量级网络)。

概念

迁移学习

利用在大型数据集(如 ImageNet)上训练好的模型权重,来解决新的、数据量较小的任务。

  • 优势:收敛速度快,训练数据需求少,泛化能力强。
  • 策略
    • 冻结训练 (Freezing):冻结卷积基(特征提取器),只训练自定义的分类头。
    • 微调 (Fine-tuning):解冻部分或全部层,以极小的学习率更新参数,使模型适应新数据分布。

ResNet (残差网络)

  • 核心问题:解决深层网络中的梯度消失/爆炸和退化问题。
  • 解决方案:引入残差连接 (Residual Connection)y = F ( x ) + x y = F(x) + xy=F(x)+x
  • 作用:允许梯度直接流向浅层,使得训练数百层的网络成为可能。

MobileNetV2

  • 定位:专为移动端设计的轻量级网络。
  • 特点:参数量少,推理速度快,适合资源受限环境。

作业:MobileNetV2 on CIFAR-10

使用 ImageNet 预训练的 MobileNetV2 模型对 CIFAR-10 数据集(10类图片)进行分类。

# 4. 定义 MobileNetV2 模型defcreate_mobilenet_v2(pretrained=True,num_classes=10):model=models.mobilenet_v2(pretrained=pretrained)# MobileNetV2 的分类器结构:# (classifier): Sequential(# (0): Dropout(p=0.2, inplace=False)# (1): Linear(in_features=1280, out_features=1000, bias=True)# )# 修改最后一层全连接层# 获取分类器中最后一个线性层的输入特征数in_features=model.classifier[1].in_features model.classifier[1]=nn.Linear(in_features,num_classes)returnmodel.to(device)# 5. 冻结/解冻模型层的函数deffreeze_model(model,freeze=True):"""冻结或解冻模型的特征提取层参数"""# MobileNetV2 的特征提取部分是 'features'forparaminmodel.features.parameters():param.requires_grad=notfreeze# 打印冻结状态frozen_params=sum(p.numel()forpinmodel.parameters()ifnotp.requires_grad)total_params=sum(p.numel()forpinmodel.parameters())iffreeze:print(f"已冻结模型特征层参数 ({frozen_params}/{total_params}参数)")else:print(f"已解冻模型所有参数 ({total_params}/{total_params}参数可训练)")returnmodel
# 6. 训练函数deftrain_model(model,train_loader,test_loader,criterion,optimizer,scheduler,device,epochs,freeze_epochs=1):train_loss_history=[]test_acc_history=[]# 初始冻结iffreeze_epochs>0:model=freeze_model(model,freeze=True)forepochinrange(epochs):# 解冻控制ifepoch==freeze_epochs:print(f"Epoch{epoch}: 解冻所有参数,开始微调...")model=freeze_model(model,freeze=False)# 解冻后通常使用更小的学习率forparam_groupinoptimizer.param_groups:param_group['lr']*=0.1model.train()running_loss=0.0correct=0total=0forbatch_idx,(data,target)inenumerate(train_loader):data,target=data.to(device),target.to(device)optimizer.zero_grad()output=model(data)loss=criterion(output,target)loss.backward()optimizer.step()running_loss+=loss.item()_,predicted=output.max(1)total+=target.size(0)correct+=predicted.eq(target).sum().item()if(batch_idx+1)%200==0:print(f"Epoch{epoch+1}| Batch{batch_idx+1}/{len(train_loader)}| Loss:{loss.item():.4f}")epoch_loss=running_loss/len(train_loader)train_acc=100.*correct/total# 测试model.eval()correct_test=0total_test=0withtorch.no_grad():fordata,targetintest_loader:data,target=data.to(device),target.to(device)output=model(data)_,predicted=output.max(1)total_test+=target.size(0)correct_test+=predicted.eq(target).sum().item()test_acc=100.*correct_test/total_test train_loss_history.append(epoch_loss)test_acc_history.append(test_acc)ifscheduler:scheduler.step()print(f"Epoch{epoch+1}End | Train Loss:{epoch_loss:.4f}| Train Acc:{train_acc:.2f}% | Test Acc:{test_acc:.2f}%")returntrain_loss_history,test_acc_history# 主运行逻辑defrun_training():# 减少 epoch 数以节省时间演示epochs=5freeze_epochs=2learning_rate=0.001model=create_mobilenet_v2(pretrained=True,num_classes=10)criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=learning_rate)scheduler=optim.lr_scheduler.StepLR(optimizer,step_size=3,gamma=0.1)print("开始训练 MobileNetV2...")train_loss,test_acc=train_model(model,train_loader,test_loader,criterion,optimizer,scheduler,device,epochs,freeze_epochs)# 简单绘图plt.figure(figsize=(10,4))plt.subplot(1,2,1)plt.plot(train_loss,label='Train Loss')plt.title('Training Loss')plt.legend()plt.subplot(1,2,2)plt.plot(test_acc,label='Test Acc')plt.title('Test Accuracy')plt.legend()plt.show()if__name__=="__main__":run_training()

实现步骤

  1. 数据适配:CIFAR-10 图片尺寸为 32x32,而 MobileNetV2 默认输入为 224x224。使用transforms.Resize(224)进行调整。
  2. 模型修改:将 MobileNetV2 最后的分类层(1000类)替换为 10 类的全连接层。
  3. 训练策略
    • 阶段一:冻结特征层,训练 2 个 Epoch。
    • 阶段二:解冻所有层,降低学习率进行微调。

实验结果

基于训练日志:

  • 快速收敛:Epoch 1 结束时,测试集准确率已达 76.52%。
  • 微调效果:解冻后 Loss 迅速下降,最终在 Epoch 5 达到94.31%的测试集准确率。
  • 结论:迁移学习在小数据集上极其有效,MobileNetV2 展现了优秀的特征提取能力。

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 19:20:01

RimSort终极指南:轻松解决RimWorld模组管理的所有难题

RimSort终极指南:轻松解决RimWorld模组管理的所有难题 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 如果你正在为《RimWorld》模组管理而头疼——加载顺序混乱、依赖关系复杂、游戏频繁崩溃,那么RimSort就是你…

作者头像 李华
网站建设 2026/5/2 14:47:20

如何选择合适的GPU来运行GPT-SoVITS?

如何选择合适的 GPU 来运行 GPT-SoVITS? 在语音合成技术快速演进的今天,一个令人兴奋的趋势正在改变行业格局:你只需提供一分钟的语音样本,就能训练出高度还原个人音色的 AI 语音模型。这不再是科幻电影的情节,而是 GP…

作者头像 李华
网站建设 2026/5/3 7:20:43

Windows右键菜单管理神器:ContextMenuManager完全配置指南

Windows系统的右键菜单是日常操作中使用频率最高的功能之一,但随着软件安装数量的增加,右键菜单往往变得臃肿不堪,严重影响使用效率。ContextMenuManager作为一款专业的右键菜单管理工具,能够帮助用户彻底解决这一问题&#xff0c…

作者头像 李华
网站建设 2026/4/25 21:28:41

NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的10个关键技巧

你是否曾经觉得自己的显卡性能没有被完全发挥?或者游戏画面总是达不到理想效果?NVIDIA Profile Inspector正是解决这些问题的专业工具,它能让你深入显卡驱动的底层,挖掘那些被默认设置所隐藏的强大功能。 【免费下载链接】nvidiaP…

作者头像 李华
网站建设 2026/4/23 15:46:53

GHelper终极指南:3步让你的华硕笔记本性能飙升

GHelper终极指南:3步让你的华硕笔记本性能飙升 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: http…

作者头像 李华