下载网站备案的核验单大屏网页设计网站
2026/6/1 8:51:36 网站建设 项目流程
下载网站备案的核验单,大屏网页设计网站,计算机网络技术网站开发与设计,烟台市建设工程招标投标协会网站#x1f4cb; 前言 各位伙伴们#xff0c;大家好#xff01;如果说之前我们从零开始搭建 CNN 是在“手动锻造兵器”#xff0c;那么今天#xff0c;我们将学习如何 wield (挥舞) 一把已经由无数大师千锤百炼过的“神器”——预训练模型。Day 44 的主题是迁移学习 (Transf… 前言各位伙伴们大家好如果说之前我们从零开始搭建 CNN 是在“手动锻造兵器”那么今天我们将学习如何 wield (挥舞) 一把已经由无数大师千锤百炼过的“神器”——预训练模型。Day 44 的主题是迁移学习 (Transfer Learning)这是一个能让我们以极低的成本在自己的数据集上达到惊人效果的强大范式。这不仅仅是一种技术更是一种思想上的飞跃。它告诉我们不必事事从零开始善于利用前人的成果才能更快地解决新问题。准备好让我们一起站上巨人的肩膀看得更远一、思想的飞跃为什么要用预训练模型在深入代码之前我们必须先理解其背后的深刻思想。为什么我们不总是从一个随机初始化的模型开始训练呢想象一下从零训练一个模型就像教一个刚出生的婴儿认识世界。你需要海量的数据和漫长的时间他才能慢慢学会识别物体的边缘、纹理、形状最后才能区分“猫”和“狗”。而使用预训练模型则像是请来一位在 ImageNet (一个包含上百万张图片、上千个分类的超大数据集) 上身经百战的“视觉专家”。这位专家已经具备了强大的、通用的视觉特征提取能力比如识别纹理、轮廓、甚至是动物的眼睛和皮毛。我们的任务比如在 CIFAR-10 上分类对他来说就像是给他一个新的、更具体的任务。我们不再需要从零教他看世界只需要在他已有的知识基础上进行微调 (Fine-tuning)让他适应我们的新任务即可。这就是迁移学习的核心起点更高模型初始参数不是随机的而是包含了大量通用知识这使得训练起点非常高。收敛更快因为起点高模型能更快地找到解决新问题的方向大大缩短了训练时间。性能更好尤其是在我们自己的数据集不够大的情况下预训练模型带来的通用知识可以有效防止过拟合达到更高的准确率。二、群星闪耀时认识经典的预训练模型深度学习的历史长河中诞生了许多里程碑式的CNN架构。它们不仅在当年的 ImageNet 竞赛中大放异彩也成为了后来无数研究的基础。模型年份关键创新点ImageNet Top-5错误率特点AlexNet2012ReLU激活函数、Dropout、GPU训练15.3%深度学习复兴的开创者VGGNet2014统一3×3卷积核结构简洁优美7.3%“大力出奇迹”的典范至今仍是很好的基线GoogLeNet2014Inception模块网络中的网络6.7%在保证精度的同时极大降低了参数量ResNet2015残差连接解决了超深网络梯度消失问题3.57%影响至今的革命性架构开启百层网络时代MobileNet2017深度可分离卷积极致轻量化7.4%移动端部署的首选EfficientNet2019复合缩放自动搜索最佳网络配置2.6%精度与效率的极致平衡这些模型就像一个个武林门派各有绝学。而我们今天要实战的ResNet无疑是其中名声最响、应用最广的“名门正派”。三、实战演练用ResNet18微调CIFAR-10分类任务理论讲完开练我们将使用在 ImageNet 上预训练好的ResNet18模型来解决我们的 CIFAR-10 分类问题。3.1 核心策略“先冻结后解冻”微调预训练模型有一个非常经典的策略就像驯服一匹烈马第一阶段冻结主干只训“头”冻结 (Freeze)我们将预训练模型中负责提取特征的卷积层称为Backbone或主干网络的参数全部冻结使其在训练中不更新。训练 (Train)我们只训练我们自己新加上去的分类层称为Head或分类头。目的这是为了让新的分类头先快速适应主干网络输出的特征而不会因为随机初始化的分类头产生巨大的梯度从而破坏掉宝贵的预训练权重。第二阶段解冻全身整体微调解冻 (Unfreeze)在分类头训练几轮稳定后我们将整个网络的参数全部解冻。微调 (Fine-tune)使用一个非常小的学习率对整个网络进行训练。目的让整个网络包括主干都对我们的新数据进行微小的调整使其更加“专精”于我们的任务。3.2 代码实现与分析下面是本次实战的核心代码它完美地实现了上述“两阶段”训练策略。# 【我的代码】# Day 44 作业: 使用预训练的ResNet18在CIFAR-10上进行微调importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,modelsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotasplt# --- 配置 ---plt.rcParams[font.family][SimHei]plt.rcParams[axes.unicode_minus]Falsedevicetorch.device(cudaiftorch.cuda.is_available()elsecpu)print(f使用设备:{device})# --- 1. 数据加载与增强 ---# (与之前代码相同此处省略)train_transformtransforms.Compose([...])test_transformtransforms.Compose([...])train_datasetdatasets.CIFAR10(...)test_datasetdatasets.CIFAR10(...)train_loaderDataLoader(...)test_loaderDataLoader(...)# --- 2. 模型定义与修改 ---defcreate_resnet18(pretrainedTrue,num_classes10):# a. 加载预训练的ResNet18模型modelmodels.resnet18(pretrainedpretrained)# b. 替换最后一层全连接层以适应我们的10分类任务in_featuresmodel.fc.in_features model.fcnn.Linear(in_features,num_classes)returnmodel.to(device)# --- 3. 冻结/解冻层的工具函数 ---deffreeze_model(model,freezeTrue):# 冻结/解冻除fc层外的所有参数forname,paraminmodel.named_parameters():iffcnotinname:param.requires_gradnotfreeze# 打印状态方便观察iffreeze:print(已冻结模型卷积层参数 (只训练分类头))else:print(已解冻模型所有参数 (进行整体微调))returnmodel# --- 4. 包含“两阶段”逻辑的训练函数 ---deftrain_with_freeze_schedule(model,...,epochs,freeze_epochs5):# 初始冻结卷积层iffreeze_epochs0:modelfreeze_model(model,freezeTrue)forepochinrange(epochs):# 在指定轮次后解冻所有层ifepochfreeze_epochs:modelfreeze_model(model,freezeFalse)# 解冻后通常需要降低学习率optimizer.param_groups[0][lr]1e-4# ... (标准的训练和验证循环) ...# ... (省略具体循环代码与笔记中一致)# --- 5. 主函数 ---defmain():epochs40freeze_epochs5# 前5轮冻结modelcreate_resnet18(pretrainedTrue,num_classes10)optimizeroptim.Adam(model.parameters(),lr1e-3)criterionnn.CrossEntropyLoss()scheduleroptim.lr_scheduler.ReduceLROnPlateau(...)train_with_freeze_schedule(model,...,epochsepochs,freeze_epochsfreeze_epochs)if__name____main__:main()四、见证奇迹结果分析与洞察从训练日志中我们可以清晰地看到迁移学习的巨大威力火箭般的启动速度观察日志在第5个epoch结束、刚刚解冻所有层时训练在第6个epoch的测试准确率瞬间从34%暴涨到67.23%这正是预训练权重强大通用能力的体现。相比之下我们从零训练的CNN需要20多个epoch才能达到类似水平。“谦虚”的训练过程在前期我们可能会观察到训练集准确率低于测试集的现象。这是因为我们的训练集应用了大量的数据增强随机裁剪、翻转、颜色抖动等相当于给模型出了“难题”而测试集是标准的“考卷”。这证明了数据增强的有效性让模型学习得更鲁棒。突破性能瓶颈最终我们的模型在测试集上达到了86.30%的准确率这比我们之前从零训练的CNN约80%高出了一大截。这就是“巨人肩膀”的力量让我们轻松地突破了自己模型的性能上限。五、作业探索百尺竿头更进一步今天的作业是对我们学习成果的最好检验。作业一尝试其他预训练模型如MobileNetV2ResNet虽好但如果我们的应用场景是手机等移动设备可能就显得有些“重”了。这时轻量级网络MobileNetV2就派上了用场。替换模型非常简单defcreate_mobilenet_v2(pretrainedTrue,num_classes10):modelmodels.mobilenet_v2(pretrainedpretrained)# 注意MobileNetV2的分类器层名叫 classifierin_featuresmodel.classifier[1].in_features model.classifier[1]nn.Linear(in_features,num_classes)returnmodel.to(device)# 在main函数中调用即可# model create_mobilenet_v2(pretrainedTrue, num_classes10)通过尝试不同的模型我们可以直观地感受到不同架构在收敛速度、最终精度和参数量上的权衡trade-off这对于未来做技术选型至关重要。作业二深入ResNet内部理解残差连接ResNet的精髓在于残差连接 (Residual Connection)也被称为“快捷连接 (Shortcut Connection)”。它解决了什么问题在 ResNet 诞生之前人们发现网络越深性能反而会下降“退化问题”且梯度容易消失导致无法训练。它如何解决残差连接允许信息“跳过”一层或多层直接流向后方。输入x不仅经过了卷积层的变换F(x)还通过一条“捷径”直接与F(x)相加得到最终输出H(x) F(x) x。这相当于模型在学习“残差”F(x)即与原始输入的差异。如果某个层学不到任何有用信息F(x)可以趋近于0信息x也能无损地传递下去保证了网络不会因为加深而变差。如何观察在 VSCode 或 PyCharm 中我们可以按住Ctrl点击resnet18进入其源码可以看到它是由多个BasicBlock组成的。而BasicBlock的forward方法中清晰地定义了out self.conv2(out)和out identity这两个步骤这就是残差连接的实现 心得与总结Day 44 是认知上的一次巨大刷新。我深刻地体会到不要重复造轮子社区已经为我们提供了大量强大、可靠的预训练模型善用它们是AI工程师的基本素养。策略重于蛮力“先冻结、后微调”的策略看似简单却蕴含着深刻的训练智慧它让我们能够平稳、高效地利用预训练知识。代码背后是思想无论是ResNet的残差连接还是迁移学习的整体范式都闪耀着计算机科学家们解决问题的智慧之光。理解这些思想比单纯会调用API重要得多。今天我们不仅学会了一项强大的技术更学会了一种高效解决问题的思维方式。再次感谢 浙大疏锦行 老师的精彩课程带领我们从“炼丹新手”向“高级炼丹师”迈出了坚实的一步

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询