尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

百度云深度学习竞赛实战:Python图像分类模型设计全记录

百度云深度学习竞赛实战:Python图像分类模型设计全记录 简介本资源是面向深度学习竞赛参赛者与Python进阶学习者的百度云深度学习应用大赛完整模型设计源码集聚焦四则混合运算识别等典型CV任务覆盖从初赛到决赛的全周期算法迭代与工程优化实践。压缩包共92个文件总计20.59MB包含29个Jupyter Notebook含数据探索、预处理、多模型对比、loss曲线绘制、测试预测等全流程实验记录、36个PNG图像涵盖模型结构图、预处理效果可视化、损失/准确率曲线、生成器输出对比等关键分析图表、12个字体文件及4个Markdown文档含初赛/决赛技术方案说明、验证码识别方法论另有3个核心Python脚本如模型并行化、生成器构建、端到端推理封装。已有283人学习下载资源结构清晰、注释充分提供可复现的训练策略如L2正则、结构改进、全集150代训练、多版本模型融合方案及测试集预测脚本是理解工业级深度学习竞赛建模逻辑与落地细节的优质实操样本。从竞赛实战出发百度云深度学习竞赛中的Python模型设计全记录去年夏天我带着学生团队参加了一次百度云平台上的深度学习竞赛题目是典型的图像分类任务要求在限定时间内提交模型源码和预测结果。那段时间几乎每天泡在调试环境里踩遍了从数据预处理到模型收敛的各种坑。现在回头看整个项目从零到一的过程完全可以拆成一套可以复用的方法论尤其是对于想在竞赛里快速出成绩、同时又想真正理解深度学习模型设计逻辑的朋友来说价值很大。这篇文章会把完整的项目思路、模型设计细节、训练调参经验全部摊开来讲。适合已经会用Python跑通一个简单神经网络、但还没系统参与过完整竞赛项目的同学也适合想了解如何在百度云这类云平台上高效完成深度学习任务的人。我会用竞赛中真实发生的案例来说明不会只讲虚的。1. 竞赛场景分析与整体设计思路1.1 百度云深度学习竞赛的典型设定与真实需求现在国内各大云平台几乎都会举办AI竞赛百度云这一类的深度学习竞赛通常有几个共同点数据量不会特别大但类别分布可能不均衡赛道任务以图像分类、目标检测、文本情感分析为主评测指标一般是准确率或者F1分数环境是基于Linux的GPU云服务器通过Jupyter Notebook或者命令行方式训练模型最关键的所有结果必须基于你提交的源码可复现。这意味着你不仅要让模型精度高还要保证代码结构清晰、依赖完整、训练流程可复现。竞赛评审或者排行榜系统有时候会直接运行你的预测脚本如果安装依赖不完整、路径写死、模型权重没有同步提交直接就会爆零分。这次我们做的任务是图像分类具体类别有10类训练集大概1.2万张图片测试集3000张。从数据规模来看不算大但问题是训练集中的类别样本数差距挺明显最多的一个类别有2100张最少的一类只有600张左右。这个特点直接决定了后面模型设计和损失函数的选择。1.2 为什么最终选定CNNResNet架构组合很多初学者会纠结到底用哪种模型结构VGG、Inception、ResNet、EfficientNet选择太多了。我的建议是竞赛环境下优先考虑两个维度基线稳定性和迭代速度。VGG参数太多训练慢而且在小数据集上容易过拟合Inception结构相对复杂不便于后期快速修改EfficientNet精度高但依赖自动增强和较复杂的训练技巧容易出现琐碎的调参问题。最终我们选定了ResNet-34作为主干网络在它后面拼接了自定义的分类头。选择ResNet核心原因是残差结构在训练稳定性和收敛速度上的明显优势配合ImageNet预训练权重可以大幅缩短训练时间。预处理阶段使用标准的随机裁剪和水平翻转Batch Size设为64初始学习率0.001优化器用AdamW。这个组合在多个类似竞赛中表现都很稳定后续只需微调学习率即可。那为什么不全用现成的高精度预训练模型然后做迁移学习这里有一个竞赛中常见的认知误区预训练模型确实可以提升精度但也要考虑模型参数量和我们实际数据的分布是否接近。如果数据分布和ImageNet差异较大尤其是医学图像、卫星图像这类特化数据那么预训练权重的帮助并不大甚至需要解冻更多层做微调反而增加了训练成本。我们的数据是普通自然图像和ImageNet分布比较接近所以用预训练权重是划算的。1.3 从源码复用角度做的工程约束竞赛提交的源码如果只有训练代码没有预测脚本或者模型保存路径不统一评审环节就很容易出问题。我们做了一套代码规范来约束整体设计包括统一的配置管理使用YAML文件保存所有超参数、分层的数据加载接口训练集和测试集共用同一个预处理器、模型保存时同时导出权重和结构信息、每个实验自动生成日志和TensorBoard记录。这套规范在后期调试时帮了大忙。特别是在云平台的GPU环境下调试成本比本地高很多。每次跑一个完整的训练周期可能要20多分钟如果代码有基本错误时间就白白浪费了。所以代码工程化能力其实是竞赛里一个隐性评分点只是很多新手没有意识到。2. 数据预处理与数据增强的细节解析2.1 数据清洗比模型设计更影响结果我见过太多人拿到数据集就直接扔进模型训练最后结果不理想就开始调整网络结构。但实际上在大多数深度学习竞赛中数据质量对最终精度的影响远超模型结构本身。我们用了一天时间做数据清洗主要包括三个方面检查非图片文件、找出标签错误的样本、统计类别分布。检查非图片文件用Python自带PIL库就能完成遇到无法正常打开的图片直接标记并移除。标签错误更隐蔽需要抽样人工检查。我们抽查了10%的训练集发现大概有40多张图存在标签错标的情况占0.3%左右比例不算高但足以对模型产生干扰。如果你的项目允许修改训练标签建议把明显错标的样本修正或删除。如果平台不允许修改训练集那就只能在训练时使用样本权重来减少这些噪声样本的影响。关于类别不均衡最直接的方法是用加权采样器。PyTorch中的WeightedRandomSampler可以根据每个类别的样本数量反比地计算采样概率让模型在每个batch中看到的类别分布更均匀。使用之后小类别的F1分数提升了大概4个百分点。下面是一个简单的实现参考。from torch.utils.data import WeightedRandomSampler import numpy as np def make_weights_for_balanced_classes(labels, n_classes): count [0] * n_classes for label in labels: count[label] 1 total sum(count) weight_per_class [total / (n_classes * c) for c in count] weights [weight_per_class[label] for label in labels] return weights labels train_dataset.get_labels() weights make_weights_for_balanced_classes(labels, num_classes) sampler WeightedRandomSampler(weights, num_sampleslen(weights), replacementTrue)这样处理后每个epoch中模型看到小类别样本的频率就不会被大类别碾压。这个方法对于任何样本不平衡的竞赛任务都适用。2.2 数据增强策略原则是不过度但必须够用数据增强是提升泛化能力的常用手段但增强过度会让模型见过多扭曲的样本反而学不到真实分布。我们在线上的训练流程中使用了随机水平翻转、随机旋转不超过15度、随机裁剪后缩放回原始尺寸以及颜色抖动。这里有一个关键细节测试时不做增强只做中心裁剪和缩放。关于增强的实现我建议直接用PyTorch的torchvision.transforms组合而不是自己手写。因为手写容易出错而且很难利用GPU加速。下面是我们在竞赛中使用的一套增强配置。import torchvision.transforms as T train_transform T.Compose([ T.RandomResizedCrop(size(224, 224), scale(0.7, 1.0)), T.RandomHorizontalFlip(p0.5), T.RandomRotation(degrees15), T.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.05), T.ToTensor(), T.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) test_transform T.Compose([ T.Resize(size(256, 256)), T.CenterCrop(size(224, 224)), T.ToTensor(), T.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])图像分类竞赛中这个增强组合是业界通用的基线方案。如果你有其他领域需求比如目标检测可能需要使用更复杂的增强库如Albumentations但对于分类任务来说torchvision已经足够。2.3 池化层的选择与作用看到热词里有深度学习的池化我觉得有必要单独聊聊这个容易被人忽略的细节。池化层在卷积神经网络中主要作用是下采样减少特征图尺寸同时保留主要特征增强平移不变性。常见的池化方式有三种最大池化、平均池化和全局平均池化。分类网络最后接入全连接层之前一般会加一个全局平均池化把每个通道的特征图压缩成一个数值这样不仅能减少参数量还能保留空间信息。ResNet系列的最后一个阶段就是全局平均池化加全连接层。如果你在做分类模型设计这是一套非常成熟的范式不用自己另辟蹊径。在竞赛过程中我们对比过使用全局最大池化和全局平均池化的区别。最大池化对纹理和边缘特征更敏感平均池化对整体语义特征更友好。在大多数分类任务中平均池化表现会更稳定一些尤其是和预训练权重搭配使用的时候。3. 模型设计与训练流程实现3.1 基于ResNet-34的自定义分类模型源码下面回归核心内容展示我们最终使用的模型定义代码。使用PyTorch框架基于torchvision自带的ResNet-34将最后一层全连接替换为自定义分类头。同时增加了一个可选的Dropout层用来控制过拟合尤其在训练的后期。import torch import torch.nn as nn import torchvision.models as models class CustomResNet(nn.Module): def __init__(self, num_classes10, dropout_rate0.2): super(CustomResNet, self).__init__() self.backbone models.resnet34(pretrainedTrue) in_features self.backbone.fc.in_features self.backbone.fc nn.Sequential( nn.Dropout(pdropout_rate), nn.Linear(in_features, 512), nn.ReLU(inplaceTrue), nn.BatchNorm1d(512), nn.Dropout(pdropout_rate), nn.Linear(512, num_classes) ) def forward(self, x): return self.backbone(x)这里有一个容易被忽略的点使用预训练权重时如果修改了最后一层全连接那么新加的层会有随机初始化权重在训练前期梯度变化会比较剧烈。所以学习率不能设置过高否则前面学好的特征会被破坏。我们使用0.001的初始学习率配合warmup策略前5个epoch线性升高学习率到设定值之后按照余弦退火方式衰减。3.2 训练流程中的数据加载与GPU配置数据加载是训练流程中最容易卡住的一环。磁盘IO速度跟不上GPU计算速度时GPU会大量空闲等待训练效率大打折扣。在百度云竞赛环境里GPU一般是V100或者A100性能都很强所以数据管道必须跟上。我们使用DataLoader的时候设置了num_workers8和pin_memoryTrue同时把数据放在SSD目录下一份并且提前把所有图片按尺寸整理好避免训练时频繁解码。from torch.utils.data import DataLoader train_loader DataLoader( train_dataset, batch_size64, samplersampler, num_workers8, pin_memoryTrue, drop_lastTrue ) val_loader DataLoader( val_dataset, batch_size64, shuffleFalse, num_workers8, pin_memoryTrue )pin_memoryTrue的作用是锁页内存加速CPU到GPU的数据传输。num_workers不是越大越好它取决于CPU核心数和磁盘IO速度如果设置过大反而会带来额外的进程切换开销。竞赛时我们试过4、8、16三个档位8是当时环境下最稳定的选择。另外如果没有在数据集类里做太多复杂的图像增强运算增强逻辑都在transforms中完成CPU的负担相对可控。如果使用更耗时的增强方式可以考虑把数据预处理做成离线缓存训练时直接加载缓存好的张量文件能显著缩短每个epoch的训练时间。3.3 训练循环与Checkpoint管理训练循环本身不复杂但我在竞赛中养成了一个习惯每个epoch结束都记录一次验证集精度同时保存两份模型权重一份是最好的一份是最新的。这样即使训练过程中出现意外中断也能从最近一次保存的位置恢复。best_acc 0.0 for epoch in range(start_epoch, num_epochs): model.train() train_loss 0.0 for images, labels in train_loader: images, labels images.to(device), labels.to(device) outputs model(images) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() train_loss loss.item() model.eval() val_acc evaluate(model, val_loader, device) if val_acc best_acc: best_acc val_acc torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), best_acc: best_acc, }, checkpoints/best_model.pth) print(fEpoch {epoch1}/{num_epochs}, Loss: {train_loss/len(train_loader):.4f}, Val Acc: {val_acc:.4f})这段代码里值得注意的地方是保存checkpoint时把optimizer_state_dict也存进去了。很多初学者只保存模型权重一旦想从中途恢复训练就必须重新初始化优化器且学习率调度也会被打乱。把优化器的状态一并保存恢复训练时才能保持完整状态。3.4 损失函数的选择多分类任务最常用的损失函数是交叉熵损失。但我们的数据类别不均衡直接使用标准交叉熵会让模型偏向预测多数类。除了前面提到的加权采样之外还可以在损失函数上做文章。一种常见做法是使用带类别权重的交叉熵权重设置为1 / np.sqrt(count)这种根号倒数形式比直接使用倒数更温和不会让少数类的梯度过大导致训练不稳定。另一种思路是在损失函数中加入Focal Loss的调节因子让模型更关注难分类的样本。但Focal Loss在类别不均衡不严重的时候提升幅度有限而且本身有两个超参数需要调使用成本较高。我们实际训练时使用了加权交叉熵效果已经足够好。注意使用加权交叉熵时要确保训练集和验证集的划分方式没有信息泄漏。比如同一类别的多张相似图片不能分散在训练集和验证集中否则验证结果会在刚开始就虚高误导你的调参判断。4. 训练调参与性能优化实录4.1 学习率策略线性Warmup配合余弦退火在优化器选择上我们最开始用了Adam后来换成了AdamW。AdamW在权重衰减的处理上更规范对迁移学习任务来说泛化效果更好。学习率策略是训练能否收敛的关键使用了线性warmup和余弦退火的组合。warmup阶段的逻辑是让学习率从0线性增长到设定值避免模型在初始阶段遇到过大梯度导致震荡。预热完成后学习率按照余弦函数从0.001衰减到接近0。这个策略在PyTorch中可以通过LambdaLR实现。from torch.optim.lr_scheduler import LambdaLR import math def lr_lambda(current_step): warmup_steps 300 total_steps 10000 if current_step warmup_steps: return float(current_step) / float(max(1, warmup_steps)) progress float(current_step - warmup_steps) / float(max(1, total_steps - warmup_steps)) return 0.5 * (1.0 math.cos(math.pi * progress)) scheduler LambdaLR(optimizer, lr_lambdalr_lambda)总步数的设置需要根据epoch数、batch size和数据集大小来计算。假设训练35个epoch训练集1.2万张图batch size为64那么每个epoch大约187步总步数就是187乘以35约6545步。这个数值可以直接设定为total_steps。4.2 削弱过拟合的实操经验训练初期我们遇到过比较严重的过拟合问题训练集准确率很快达到了约97%但验证集准确率只有约82%。这在深度学习竞赛中非常常见尤其是数据量不大的情况下。我处理过拟合的顺序如下。首先观察Batch Normalization和Dropout的配置是否合理。对于ResNet系列BN层本身就有一定的正则化作用但全连接层的Dropout仍然有必要。我们设置Dropout为0.2过拟合情况有了缓解。接着检查数据增强的强度是否足够增强太少会导致模型见过多相似的样本。我们适当增加了RandomRotation的角度和ColorJitter的幅度验证集准确率提升了2个百分点。最后是权重衰减AdamW默认权重衰减设为0.01但我们在实验中发现0.05效果更好对验证集精度有明显正面影响。还有一个容易忽略的点当验证集指标出现波动较大的时候不要急着调参先看一下训练集和验证集的loss曲线走势。如果训练loss还在下降、验证loss已经上升说明开始过拟合了。这时候可以提前停止训练或者回退到之前验证loss最低的checkpoint。我们最终在35个epoch中选择了第29个epoch的模型作为提交结果因为那是最佳验证点。4.3 Ubuntu环境下深度学习环境配置的常见坑热词里出现了不少关于“ubuntu22安装深度学习”“ubuntu24.04配置深度学习环境”的内容看来很多人在环境配置上确实有困扰。我在当初搭建实验室环境时也踩过坑这里集中说明。在Ubuntu 22.04或24.04上安装深度学习环境核心是NVIDIA驱动、CUDA、cuDNN和PyTorch的版本匹配问题。最容易犯的错误是装最新版本的CUDA和驱动但PyTorch官方预编译包不一定支持最新版本。我的建议是先确认PyTorch官方对CUDA版本的支持列表再反向选择驱动和CUDA版本。通常PyTorch稳定版支持的CUDA版本会比最新CUDA落后一两个版本跟随官方是最高效的。另一个常见问题是安装了驱动但nvidia-smi没有反应。这种情况通常是驱动安装完成后没有重启系统或者Nouveau开源驱动没有屏蔽。Ubuntu 22.04系统自带的GPU驱动安装机制已经比较完善一个稳妥的方法是直接使用系统自带的“附加驱动”功能选择推荐的NVIDIA专有驱动重启后再安装CUDA toolkit。CUDA安装后需要把路径写入~/.bashrc否则Shell会话中找不到nvcc命令。export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH如果之后在Python里导入torch时报告CUDA不可用首先运行python -c import torch; print(torch.cuda.is_available())检查。如果输出False一般情况下就是PyTorch编译时使用的CUDA版本和系统CUDA版本不兼容直接用pip重新安装匹配版本的PyTorch即可解决不需要折腾系统CUDA。4.4 竞赛源码提交时的关键检查清单竞赛提交的源码包里除了模型训练代码还需要包含一个可以直接运行预测的脚本。很多团队在训练阶段表现很好但提交时却因为代码问题分数暴跌。下面是我总结的提交前自检清单。确认依赖列表完整并在requirements.txt里固定版本号。Python包的版本兼容性非常敏感比如numpy从1.x升级到2.x可能会让一些旧版深度学习代码直接报错。预测脚本里不要写死任何绝对路径所有路径都从配置文件中读取同时确保相对路径在服务器上运行时不失效。模型权重文件必须一并提交或者提供从训练代码生成权重的完整流程不要只给一个加载不出来的代码。测试时图像预处理必须和训练时的验证增强保持一致这一点出错最多。另外如果平台使用A榜和B榜的评测方式A榜结果只能作为参考不要针对A榜反复调模型否则很容易过拟合到A榜的测试集上。我们当时就发现A榜和B榜的精度差了约1.5个百分点原因就是部分团队过度优化A榜。5. 常见问题与排查技巧5.1 训练Loss不下降怎么排查训练过程中loss不下降是让新手最头疼的问题。我总结了一套排查顺序从最容易出错的地方开始检查。先看数据是不是对的。检查数据加载后一个batch的标签范围和图片值范围确认图片像素值做了归一化标签索引从0开始且和类别数匹配。再看模型输出维度是否正确如果输出维度不等于类别数CrossEntropyLoss会在计算时直接报错但如果维度等于1也可能不报错但loss一直是某个恒定值。检查学习率是否过大过大的学习率会导致loss震荡或者直接发散。检查是否有梯度爆炸可以在训练循环中打印梯度的均值和最大值如果梯度的绝对值非常大就要考虑梯度裁剪或者降低学习率。最后检查损失函数是否正确处理了样本权重有些权重设置方式可能无意中把特定类别的损失权重设成了0导致loss下降缓慢。对于不收敛的情况最有效的快速验证方法是把训练数据缩小到一个batch让模型强行拟合这个batch如果loss能够降到很低说明代码链路是通的问题出在数据或超参数上。如果连一个batch都拟合不了那大概率是代码逻辑出了问题。5.2 推理阶段预测结果全为同一类别这个现象通常有三个原因模型加载权重时出了问题实际用的是随机初始化的权重数据预处理和训练时不匹配比如忘记了归一化训练数据集本身严重不均衡模型把所有样本都推向了主类别。如果是前面两种情况检查点一般在模型加载和预处理的对齐上。第三种情况则需要在训练阶段就解决不能拖到推理阶段来修。可以通过查看验证集每个类别的分类报告来确认如果某个类别的精确率和召回率都极低基本可以判定模型在偷懒。我们竞赛过程中就遇到过一次预测全是背景类的情况排查了半天最后发现是误将一个没有经过完整训练的中间checkpoint当成了最终权重提交换回最优checkpoint后问题立刻消失。所以源码和权重的版本管理真的不能忽视。5.3 云平台GPU服务器上的工程化建议在百度云这类云端GPU环境训练和本地最大的区别是会话断线、资源释放、磁盘空间限制这些因素都可能中断你的实验。建议使用tmux或screen开启持久会话保证SSH断开后训练进程不会终止。同时定期把模型checkpoint同步到对象存储或者自己的本地环境避免服务器出问题导致所有进度丢失。磁盘空间也是一个隐性坑。训练过程中如果开启TensorBoard日志每个epoch都会生成大量事件文件长时间运行会占用几十GB空间。建议定期清理旧的event文件只保留最终的输出。另外在训练代码开始时加入磁盘剩余空间检查如果低于阈值直接终止训练避免因磁盘写满导致保存失败。技巧每次实验开始时记录一个README包含数据集路径、超参数配置、当前实验的目标。这是多人协作时的保命操作即使过了两周再回来看也能快速定位到当时的实验状态。6. 竞赛之外这套模型设计源码能迁移到哪里6.1 从比赛任务到实际业务场景的迁移思路竞赛中的模型设计思路完全可以迁移到实际业务中。比如我们使用的ResNet-34加自定义分类头的结构在很多图片分类落地场景中都能直接改改就能用只需要调整最后的类别数和一个合适的数据预处理流程。在某个工业质检的落地项目中我接手过一个区分产品表面是否有瑕疵的任务。实际情况和竞赛不同之处在于现场能拿到的瑕疵样本极少正常样本大量存在而且新的瑕疵形态在持续产生。此时在竞赛中学会的类别不均衡处理方案、数据增强方式、checkpoint管理套路都可以复用但模型结构需要对应调整因为现场样本量比竞赛数据集还小直接用ResNet很容易过拟合。最后通过使用更轻量的MobileNetV3配合冻结前几层的方式再结合在线难例挖掘在很少的数据上达到了可用的准确率。所以竞赛的价值不只是拿一个奖而是让你在短时间内密集地走完数据理解、特征工程、模型训练、调优、部署验证的全流程。这些经验在真实业务中会反复用到。6.2 Python源码组织的长期维护价值竞赛结束后我花了几天时间把整个项目整理成了标准的Python包结构包括数据模块、模型模块、训练模块、配置模块和评估模块每个模块之间通过清晰的接口对接。后来这个结构成了一个内部模板多个项目都复用了这份基础代码省去了大量重复开发时间。源码组织这件事看起来很琐碎但实际价值的体现是在一周后、一个月后你再次打开这份代码时能不能在十分钟内定位到需要修改的地方。如果代码全是随手写的那时间成本会成倍放大。我强烈建议在竞赛结束后立刻把代码整理成一份高质量的模板这是比赛经验最好的沉淀方式。整理代码的时候把关键超参数统一放在YAML文件里不要散落在代码各处。把模型定义、数据集处理、训练逻辑、评估逻辑拆成独立的模块。为关键的预处理函数和模型forward函数写上docstring。这些习惯养成了后续工作会顺畅很多。6.3 关于下一步可扩展的方向如果你想把这份竞赛模型设计源码继续深化有几个方向可以参考。一是接入更现代化的训练技巧比如MixUp、CutMix、标签平滑等这些技巧在小数据集上往往能带来明显的精度提升。二是尝试更高效的模型结构比如EfficientNet系列或最新的ConvNeXt但需要注意参数量和训练成本的平衡。三是为模型增加可解释性分析比如使用Grad-CAM可视化模型关注区域这在竞赛答辩中非常加分。我在竞赛后期给模型加了一个简易的类别激活图可视化工具用来检验模型是不是在依据正确的区域做判断。这个动作救了我们一次因为有几次模型精度看着不错但可视化后发现它只盯着图片的背景区域纯粹是撞上了容易区分的背景纹理。如果不做这个检查B榜分数大概率会掉下来。一点个人体会参加这次基于百度云平台的深度学习竞赛最大的收获不只是模型精度提升了多少而是对整个深度学习项目从数据处理到模型设计再到工程落地的完整流程有了更深刻的体感。每次踩坑、每次debug、每次看到验证集指标跳动都是经验积累的一部分。很多人以为竞赛靠的是灵感和调参玄学实际上靠的是严谨的流程和稳定的方法论。最后再分享一个小技巧。训练过程中如果验证集指标出现波动不要动不动就调学习率或者换模型结构先记录下来跑完一个完整的周期再下结论。一次性的波动往往只是噪声真正的趋势需要连续几个epoch才能看出来。这个习惯在竞赛和实际项目中都能省下大量折腾的时间。本文还有配套的精品资源点击获取
返回列表