ADVANCE Day44

@浙大疏锦行

📘 Day 44 实战作业 (极速版):ResNet 与 迁移学习

1. 作业综述

核心目标

  1. 迁移学习:学会调用 ImageNet 预训练的 ResNet18 模型,将其知识迁移到 CIFAR-10 任务上。
  2. 策略对比:亲手实验冻结骨干 (Linear Probing)解冻微调 (Fine-tuning)两种策略的效果差异。
  3. 工业级加速:掌握混合精度训练 (AMP)分辨率适配技巧,在保持高精度的同时极大提升训练速度。

涉及知识点

  • ResNet18: 工业界最常用的基准模型。
  • Transfer Learning:pretrained=True,freeze weights.
  • AMP (Automatic Mixed Precision):torch.cuda.amp.
  • Data Resize: 适配模型输入尺寸。

场景类比

  • 从头训练: 像小学生写作文,词汇量有限,写得慢且水平一般。
  • 迁移学习: 像大学教授写作文,知识渊博。
    • 冻结: 教授套模板写(只练最后一层),速度极快。
    • 微调: 教授认真推敲每一句话(全网微调),水平最高。

步骤 1:数据准备 (极速配置)

优化策略

  • 分辨率 112x112:比标准的 224x224 少了 75% 的像素,速度提升显著。
  • Pin Memory: 锁页内存,加快数据传输。

任务

  1. 定义预处理管道 (Resize -> 112)。
  2. 加载 CIFAR-10 数据集。
importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,modelsfromtorch.utils.dataimportDataLoaderfromtorch.cuda.ampimportautocast,GradScaler# 混合精度神器importtime# --- 1. 极速配置 ---IMG_SIZE=112# 降级分辨率加速 (原版 224)BATCH_SIZE=128# 因为图小了,Batch 可以开大点 (原版 32)NUM_WORKERS=2# 数据加载进程数# 2. 定义预处理norm_mean=[0.485,0.456,0.406]norm_std=[0.229,0.224,0.225]train_transform=transforms.Compose([transforms.Resize(IMG_SIZE),transforms.RandomHorizontalFlip(),# 数据增强transforms.ToTensor(),transforms.Normalize(norm_mean,norm_std)])test_transform=transforms.Compose([transforms.Resize(IMG_SIZE),transforms.ToTensor(),transforms.Normalize(norm_mean,norm_std)])# 3. 加载数据 (开启 pin_memory)print("📥 正在加载数据...")train_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=train_transform)test_dataset=datasets.CIFAR10(root='./data',train=False,download=True,transform=test_transform)train_loader=DataLoader(train_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=NUM_WORKERS,pin_memory=True)test_loader=DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=False,num_workers=NUM_WORKERS,pin_memory=True)device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print(f"✅ 数据准备就绪 | 设备:{device}| 输入尺寸:{IMG_SIZE}x{IMG_SIZE}")
📥 正在加载数据... ✅ 数据准备就绪 | 设备: cuda | 输入尺寸: 112x112

步骤 2:模型构建工厂

任务
编写一个函数create_resnet18,灵活控制是否加载预训练权重、是否冻结骨干。

  • Backbone: ResNet18 (去掉最后的全连接层)。
  • Head: 新的全连接层 (输出 10 类)。
defcreate_resnet18(pretrained=True,freeze=False):""" 创建一个适配 CIFAR-10 的 ResNet18 """# 1. 加载模型ifpretrained:# weights='DEFAULT' 自动下载最新权重model=models.resnet18(weights=models.ResNet18_Weights.DEFAULT)print(f"🔧 [模型创建] 加载 ImageNet 预训练权重 (Freeze={freeze})...")else:model=models.resnet18(weights=None)print(f"✨ [模型创建] 随机初始化权重...")# 2. 冻结骨干 (Backbone)iffreeze:forparaminmodel.parameters():param.requires_grad=False# 3. 替换 Head (这一层默认是可训练的)# ResNet18 的 fc 输入特征数是 512in_features=model.fc.in_features model.fc=nn.Linear(in_features,10)returnmodel

步骤 3:混合精度训练引擎

优化策略

  • 使用torch.cuda.amp进行半精度 (FP16) 训练。
  • 显存占用减半,计算速度翻倍,非常适合 RTX 30 系列显卡。

任务
封装train_one_epochevaluate函数,集成 AMP 逻辑。

# 初始化梯度缩放器 (AMP 必备)scaler=GradScaler()deftrain_one_epoch(model,loader,criterion,optimizer):model.train()running_loss=0.0correct=0total=0forinputs,labelsinloader:inputs,labels=inputs.to(device),labels.to(device)optimizer.zero_grad()# --- 核心优化:混合精度上下文 ---withautocast():outputs=model(inputs)loss=criterion(outputs,labels)# --- 核心优化:缩放梯度反向传播 ---scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()# 统计running_loss+=loss.item()_,predicted=outputs.max(1)total+=labels.size(0)correct+=predicted.eq(labels).sum().item()returnrunning_loss/len(loader),100.*correct/totaldefevaluate(model,loader,criterion):model.eval()running_loss=0.0correct=0total=0withtorch.no_grad():forinputs,labelsinloader:inputs,labels=inputs.to(device),labels.to(device)# 测试时不需要 scaler,但可以用 autocast 加速推理withautocast():outputs=model(inputs)loss=criterion(outputs,labels)running_loss+=loss.item()_,predicted=outputs.max(1)total+=labels.size(0)correct+=predicted.eq(labels).sum().item()returnrunning_loss/len(loader),100.*correct/total
C:\Users\ADVANCE\AppData\Local\Temp\ipykernel_4824\1229741273.py:2: FutureWarning: `torch.cuda.amp.GradScaler(args...)` is deprecated. Please use `torch.amp.GradScaler('cuda', args...)` instead. scaler = GradScaler()

步骤 4:实验 A - 极速冻结训练 (Linear Probing)

场景
只训练最后一层分类器 (Head)。
因为骨干网络参数被锁死,无需计算梯度,速度快到飞起

预期
3 个 Epoch 内,准确率应该能达到80% - 85%

print("\n=== 实验 A: 冻结骨干 (只练 Head) ===")start_time=time.time()# 1. 创建冻结模型model_frozen=create_resnet18(pretrained=True,freeze=True).to(device)criterion=nn.CrossEntropyLoss()# 2. 优化器 (只优化 fc 层,lr 可以大一点)optimizer=optim.Adam(model_frozen.fc.parameters(),lr=0.001)# 3. 训练 3 轮forepochinrange(3):train_loss,train_acc=train_one_epoch(model_frozen,train_loader,criterion,optimizer)test_loss,test_acc=evaluate(model_frozen,test_loader,criterion)print(f"Epoch{epoch+1}: Train Acc:{train_acc:.2f}% | Test Acc:{test_acc:.2f}%")print(f"⏱️ 实验 A 耗时:{time.time()-start_time:.2f}秒")
=== 实验 A: 冻结骨干 (只练 Head) === 🔧 [模型创建] 加载 ImageNet 预训练权重 (Freeze=True)... C:\Users\ADVANCE\AppData\Local\Temp\ipykernel_4824\1229741273.py:16: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead. with autocast(): C:\Users\ADVANCE\AppData\Local\Temp\ipykernel_4824\1229741273.py:43: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead. with autocast(): Epoch 1: Train Acc: 70.42% | Test Acc: 75.63% Epoch 2: Train Acc: 76.52% | Test Acc: 76.82% Epoch 3: Train Acc: 77.49% | Test Acc: 76.55% ⏱️ 实验 A 耗时: 111.37 秒

步骤 5:实验 B - 全网微调 (Fine-tuning)

场景
解冻所有层,让 ResNet 针对 CIFAR-10 进行自我调整。
这通常能达到最高精度,但计算量大。得益于我们的 AMP 和 Resize 优化,这里也能跑得很快。

关键技巧
分层学习率:骨干网络 (Backbone) 用小火慢炖 (1e-4),分类头 (Head) 用大火爆炒 (1e-3)。

预期
3 个 Epoch 内,准确率有望突破90%

print("\n=== 实验 B: 解冻微调 (追求极致精度) ===")start_time=time.time()# 1. 创建解冻模型model_finetune=create_resnet18(pretrained=True,freeze=False).to(device)# 2. 分层学习率设置optimizer=optim.Adam([{'params':model_finetune.conv1.parameters(),'lr':1e-4},{'params':model_finetune.layer1.parameters(),'lr':1e-4},{'params':model_finetune.layer2.parameters(),'lr':1e-4},{'params':model_finetune.layer3.parameters(),'lr':1e-4},{'params':model_finetune.layer4.parameters(),'lr':1e-4},{'params':model_finetune.fc.parameters(),'lr':1e-3}# Head 用大一点的 LR])# 3. 训练 3 轮forepochinrange(3):train_loss,train_acc=train_one_epoch(model_finetune,train_loader,criterion,optimizer)test_loss,test_acc=evaluate(model_finetune,test_loader,criterion)print(f"Epoch{epoch+1}: Train Acc:{train_acc:.2f}% | Test Acc:{test_acc:.2f}%")print(f"⏱️ 实验 B 耗时:{time.time()-start_time:.2f}秒")
=== 实验 B: 解冻微调 (追求极致精度) === 🔧 [模型创建] 加载 ImageNet 预训练权重 (Freeze=False)... C:\Users\ADVANCE\AppData\Local\Temp\ipykernel_4824\1229741273.py:16: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead. with autocast(): C:\Users\ADVANCE\AppData\Local\Temp\ipykernel_4824\1229741273.py:43: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead. with autocast(): Epoch 1: Train Acc: 88.53% | Test Acc: 92.06% Epoch 2: Train Acc: 95.27% | Test Acc: 92.97% Epoch 3: Train Acc: 97.24% | Test Acc: 93.48% ⏱️ 实验 B 耗时: 173.20 秒

🎓 Day 44 总结:速度与激情的平衡

今天我们不仅学习了迁移学习,还掌握了显卡榨干技巧

对比结果

  1. 从头训练 (Day 41): 20 轮才跑 75%,还慢。
  2. 冻结训练 (实验 A): 几秒钟跑完,直接 80%+。适合快速验证想法。
  3. 微调训练 (实验 B): 精度之王,轻松 90%+。配合 AMP 和 Resize 优化,速度也完全可以接受。

工程化经验

  • 遇到训练慢,先问自己:图是不是太大了?是不是没开混合精度?
  • 遇到显存爆,先问自己:Batch Size 是不是太大了?能不能减小图片尺寸?

Next Level:
明天(Day 45),我们将走出分类任务的舒适区,挑战计算机视觉皇冠上的明珠 ——目标检测 (Object Detection)。我们将学习如何不仅识别出“猫”,还能框出“猫在哪里”!🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习毕设项目:基于python-CNN卷积神经网络对土豆疾病识别基于python-CNN卷积神经网络对土豆疾病识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

剪切板推荐,pastemate代替win系统自带的

通过网盘分享的文件:pastemate剪切板.rar 链接: https://pan.baidu.com/s/1InJIvHtkC9tQqMgQiq-jhw?pwd5668 提取码: 5668 win自带的有上限,也不会同步,放弃了,用这个

LangGraph1.0实战:构建自动邮件处理智能体,大模型应用开发指南

本文详细介绍了如何使用LangGraph1.0构建自动邮件处理智能体,展示了状态管理、节点、边、条件路由和中断机制等核心技术的实战应用。通过定义智能体状态、编写节点函数、构建智能体图和测试验证,实现了一个能够自动分类邮件、处理Bug报告、搜索知识库生成…

DeepSeek+Ollama+AnythingLLM搭建本地知识库,打造你的私人AI管家(建议收藏)

本文详细介绍了使用DeepSeek、Ollama和AnythingLLM搭建本地知识库的全过程,包括软件安装、模型配置、文档上传和智能问答功能。教程特别强调了本地部署对隐私保护的优势,并提供了文档类型准备和嵌入模型配置等实用建议,帮助用户打造专属AI助理…

从代码到上线 3 分钟:我如何用平台工程思路,彻底告别繁琐的 K8s 运维

“在我电脑上明明是好的啊?”这句话我不知道说过多少次,也听过多少次。作为一名开发者,我大部分的精力本该在创造业务价值,但现实却常常是,大量时间被浪费在了写代码之外的所有事情上。我开始反思,为什么在…

深度学习毕设项目:通过python_CNN卷积神经网络对鸡蛋是否破损识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

AI大模型岗位薪资真相:多少年包能拿到?普通人如何破局?_AI持续爆火,相关岗位薪资到底达到了多少

文章分析AI相关岗位薪资情况,指出高薪岗位(最高100万年包)主要面向博士海归或博士985人才,能拿到此等薪资的人凤毛麟角。同时提醒职场风险,建议提前做好准备。后半部分介绍了JMeter常用插件的安装及使用方法。 “AI相关岗位薪资” 随着AI持续…

深度学习计算机毕设之基于python-CNN卷积神经网络的水果识别基于python-CNN卷积神经网络的水果识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【金仓数据库】ksql 指南(六)—— 创建与管理用户和权限(KingbaseES 安全控制核心)

引言 完成数据库,表,索引这些核心对象的运作之后,“用户与权限控制”就成了保障 KingbaseES 数据安全的重点所在,经由细致的用户运作和权限分配,可以规避未授权访问以及误操作之类的风险,比如普通用户就无…

【毕业设计】基于深度学习python卷积网络对甘蔗叶子病识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

高效收集并分享活动精彩瞬间!!组织者必看

周末逃离城市的喧嚣,和朋友们一起参加了一场超治愈的寺院茶会 🍵 心情真的像被洗过一样,平静又温柔。 在古色古香的寺院里,听着檐角的风铃,看着袅袅的茶烟,闻着清雅的茶香,感受着那份难得的闲适…

RAG技术揭秘:让AI大模型学会查资料,回答更专业

本文详解RAG(检索增强生成)技术,通过结合外部知识库与文本生成,有效提升大模型回答准确性并减少幻觉。文章系统介绍了RAG原理、发展历程、核心组件(文档解析、知识构建、检索、增强、生成)及企业级应用方案,包括知识库搭建流程、优化策略和典…

mysql之日期时间函数

以下是 MySQL 中一些常用的日期和时间函数,包括它们的用法、参数类型和期望的结果。 NOW() 返回当前日期和时间。参数:无结果类型:DATETIME示例: SELECT NOW(); -- 结果: 2023-04-01 12:45:31 (取决于查询时的实际日期…

【毕业设计】基于深度学习python-CNN卷积神经网络对土豆疾病识别基于python-CNN卷积神经网络对土豆疾病识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

都说网络安全前景好,到底好在哪?3 个数据给你答案

都说网络安全前景好,到底好在哪?3 个数据给你答案 数字化时代里,网络安全早已不是“可选项”而是“必选项”。从政府机关到互联网公司,从金融能源到日常消费,各行各业的安全防护需求持续爆发,让这个行业成…

深度测评专科生必用的9款AI论文平台

深度测评专科生必用的9款AI论文平台 为什么需要一份权威的AI论文平台测评 随着人工智能技术在学术领域的广泛应用,越来越多的专科生开始依赖AI工具辅助论文写作。然而,面对市场上琳琅满目的AI论文平台,如何选择一款真正适合自己需求的工具成为…

程序员必看!2个月变身AIGC产品经理,薪资翻倍学习指南(附收藏级资源)

文章分享了一个2个月成为AIGC产品经理的完整学习路径,包括多看行业资讯研报、明确细分领域、系统掌握AI基础知识、完成实战项目、优化简历和准备面试。作者提供了详细的学习资源和面试题库,帮助读者快速转行AIGC领域,实现薪资大幅提升&#x…

我如何将“配环境1天,上线半天”的流程,压缩到3分钟?

作为开发者,我最常听到也最怕听到的一句话就是:“在我电脑上明明是好的”。这句话背后,是无数个因为环境不一致而浪费掉的深夜,是开发和运维之间无休止的拉扯。我一直在思考,为什么在云原生如此普及的今天,…

【课程设计/毕业设计】基于深度学习卷积神经网络的水果识别基于python-CNN卷积神经网络的水果识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…