news 2026/5/1 9:13:05

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/4/30 9:07:58

Bypass Paywalls Clean使用全攻略:突破付费阅读限制的终极指南

还在为各种网站的付费墙而苦恼吗?想要畅享付费内容却不愿花费高昂的订阅费用?Bypass Paywalls Clean就是你的理想选择!这款强大的浏览器扩展能够智能绕过众多网站的付费限制,让你轻松获取所需知识。📚 【免费下载链接】…

作者头像 李华
网站建设 2026/5/1 8:18:03

Display Driver Uninstaller实战手册:解决驱动冲突的终极方案

Display Driver Uninstaller实战手册:解决驱动冲突的终极方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-unins…

作者头像 李华
网站建设 2026/5/1 8:15:04

GPT-SoVITS能否生成儿童声音?年龄适应性测试

GPT-SoVITS能否生成儿童声音?年龄适应性测试 在智能教育产品日益普及的今天,越来越多的应用开始追求“拟人化”的交互体验。比如,一个为小学生设计的AI学习助手,如果用低沉的成人男声讲解拼音,显然不如一个清脆自然的童…

作者头像 李华
网站建设 2026/5/1 5:34:45

GPT-SoVITS最新版本更新内容全解读

GPT-SoVITS 最新演进:如何用一分钟语音“克隆”你的声音? 在虚拟主播深夜直播、AI 配音批量生成短视频、听障者通过合成语音“说话”的今天,个性化语音已不再是科幻桥段。而这一切背后,一个名为 GPT-SoVITS 的开源项目正悄然改变语…

作者头像 李华
网站建设 2026/5/1 8:01:43

JLink烧录固件更新前备份设置的重要性

JLink烧录前不备份?一次误操作让你的设备“永久变砖”你有没有遇到过这样的场景:现场升级固件,点下“Download”按钮后,J-Link突然报错:“Cannot connect to target.”再上电、换线、重插……统统无效。设备彻底“变砖…

作者头像 李华
网站建设 2026/5/1 9:12:42

基于工业控制的CubeMX软件安装操作指南

从零开始部署STM32CubeMX:工业控制开发者的安装实战指南 在工业自动化项目中,时间就是成本。当你拿到一块全新的STM32开发板,准备着手搭建电机驱动系统或传感器采集终端时,最不想遇到的,就是卡在“第一步”——工具装…

作者头像 李华