深度学习模型训练怎么调参?一篇写给初学者的系统教程
在刚接触深度学习时,很多人会认为“调参”就是不断修改学习率、批次大小和训练轮数,直到模型取得更高的准确率。
实际上,真正有效的调参并不是盲目试数字,而是根据训练现象判断模型当前存在的问题,再有针对性地修改参数。
对于初学者来说,可以把深度学习调参理解为一个不断排查问题的过程:
-
数据有没有问题?
-
模型能不能学会训练集?
-
模型能不能推广到验证集?
-
训练过程是否稳定?
-
当前评价指标是否适合任务?
本文将以图像分类和语义分割任务为例,系统介绍深度学习模型训练中的常见参数、判断方法和推荐调参流程。
这里我也推荐一个租云服务器跑深度学习模型的网站AutoDL:AutoDL使用指南
云服务器训练:tmux后台训练指南:tmux教学
一、调参之前,先理解训练集、验证集和测试集
一个规范的深度学习实验,通常需要将数据划分为三个部分。
1. 训练集
训练集用于模型参数更新。
模型通过训练集计算损失函数,再利用反向传播不断调整网络中的权重。
可以把训练集理解为学生平时做的练习题。
2. 验证集
验证集用于:
-
选择学习率;
-
选择损失函数;
-
判断模型是否过拟合;
-
选择最佳训练轮数;
-
对比不同模型和参数配置。
验证集类似于模拟考试。它不直接参与模型参数更新,但用于评价当前训练方案是否有效。
3. 测试集
测试集只用于模型最终评价。
模型结构和训练参数确定后,才应该在测试集上计算最终结果。
如果根据测试集结果反复修改模型,那么测试集就失去了客观评价的意义,相当于提前看到了考试答案。
因此,调参时主要观察验证集,不能根据测试集结果反复修改训练方案。
二、调参前必须观察哪些指标
训练过程中通常需要记录两类信息。
1. 损失函数
最常见的是:
-
训练损失:Train Loss;
-
验证损失:Validation Loss。
损失函数反映模型预测结果与真实标签之间的差距。一般来说,损失越低,说明模型预测越接近真实结果。
但损失函数只是训练目标,不一定能完全代表最终任务表现,因此还需要结合具体评价指标。
2. 评价指标
不同任务需要关注不同指标。
图像分类任务常见指标包括:
-
Accuracy;
-
Precision;
-
Recall;
-
F1-score。
语义分割任务常见指标包括:
-
IoU;
-
Dice;
-
Precision;
-
Recall;
-
Pixel Accuracy。
对于前景和背景比例严重不均衡的语义分割任务,不能只看 Accuracy。
例如,一张图像中有 95% 的像素属于背景,模型即使把所有像素都预测成背景,也可以取得 95% 的 Accuracy,但它实际上完全没有识别出目标。
因此,二分类语义分割任务通常更应该关注:
-
IoU;
-
Dice;
-
Recall;
-
Precision。
三、先判断模型属于哪一种训练状态
调参之前,首先要根据训练集和验证集表现判断模型状态。
四、训练集和验证集都很差:欠拟合
假设某个语义分割模型训练完成后得到:
Train Dice = 0.56
Validation Dice = 0.53
训练集和验证集指标都比较低,而且两者差距不大,通常说明模型存在欠拟合。
所谓欠拟合,是指模型连训练数据中的规律都没有充分学会。
常见原因
-
学习率太小;
-
训练轮数不足;
-
模型结构过于简单;
-
输入数据归一化错误;
-
标签制作有问题;
-
损失函数不适合当前任务;
-
数据增强过强;
-
输入特征本身区分度不足。
建议排查顺序
不要一看到指标低就立即更换更复杂的模型,而应按照以下顺序检查:
第一步,检查输入数据和标签是否正确。
第二步,观察训练损失是否持续下降。
第三步,适当增加训练轮数。
第四步,调整学习率。
第五步,再考虑提高模型容量或更换模型结构。
很多所谓的“模型性能差”,实际上并不是网络结构问题,而是数据、标签、归一化或学习率设置存在错误。
五、训练集很好,验证集很差:过拟合
假设模型得到:
Train Dice = 0.94
Validation Dice = 0.63
模型在训练集上的表现非常好,但验证集明显较差,这通常说明出现了过拟合。
过拟合是指模型记住了训练样本中的细节甚至噪声,却没有学到能够推广到新数据上的稳定规律。
常见原因
-
训练样本数量太少;
-
模型参数量太大;
-
训练轮数过多;
-
数据增强不足;
-
训练集和验证集分布差异较大;
-
训练集和验证集划分方式不合理;
-
正则化强度不足。
常见解决方法
可以尝试:
-
增加数据增强;
-
使用 Early Stopping;
-
增大 Weight Decay;
-
减小模型规模;
-
使用 Dropout;
-
增加训练样本;
-
重新划分训练集和验证集;
-
检查是否存在数据泄漏。
对于遥感影像、医学影像等空间相关性较强的数据,还要特别注意相邻图像块之间的数据泄漏。
例如,从同一张大影像中切出的相邻样本如果分别进入训练集和验证集,模型可能因为看到了高度相似的区域而取得虚高的验证结果。
六、指标剧烈波动:训练过程不稳定
假设验证集 Dice 在不同训练轮数之间出现:
0.48 → 0.65 → 0.51 → 0.68 → 0.49
这种现象通常说明训练过程不够稳定。
常见原因
-
学习率过大;
-
Batch Size 太小;
-
验证集样本太少;
-
输入数据中存在异常值;
-
数据归一化错误;
-
类别分布严重不均衡;
-
BatchNorm 在小批次下不稳定。
优先处理方法
首先尝试降低学习率,例如:
1e-3 → 3e-4 → 1e-4
如果显存允许,也可以适当增大 Batch Size。
如果 Batch Size 只能设置为 1 或 2,而网络中大量使用 BatchNorm,可以考虑:
-
冻结 BatchNorm;
-
使用 GroupNorm;
-
使用 InstanceNorm;
-
使用梯度累积。
七、最重要的超参数:学习率
学习率决定模型每次更新参数时移动多大的距离。
可以把模型训练想象成从山顶向山谷寻找最低点:
-
学习率太大,模型可能跨过最低点并不断震荡;
-
学习率太小,模型移动速度很慢;
-
学习率合适,模型可以较快且稳定地接近较优解。
八、学习率过大的表现
学习率过大时,常见现象包括:
-
Loss 剧烈震荡;
-
Loss 不降反升;
-
验证指标忽高忽低;
-
训练过程中出现 NaN;
-
模型无法稳定收敛。
例如:
Epoch 1: Loss = 1.02
Epoch 2: Loss = 0.81
Epoch 3: Loss = 1.25
Epoch 4: Loss = 0.76
Epoch 5: Loss = NaN
这种情况下可以尝试:
1e-3 → 3e-4
3e-4 → 1e-4
1e-4 → 3e-5
九、学习率过小的表现
学习率过小时,模型通常表现为:
-
Loss 下降非常缓慢;
-
训练很多轮后指标仍然较低;
-
训练集和验证集都表现较差;
-
模型看起来几乎没有学习。
例如训练 20 轮后:
Epoch 1: Loss = 0.704
Epoch 20: Loss = 0.692
如果确认数据和标签没有问题,可以适当提高学习率。
十、学习率应该怎么试
使用 Adam 或 AdamW 优化器时,可以优先比较:
3e-4
1e-4
3e-5
推荐采用控制变量法:
| 实验 | 学习率 | 其他参数 |
|---|---|---|
| LR-1 | 3e-4 | 完全相同 |
| LR-2 | 1e-4 | 完全相同 |
| LR-3 | 3e-5 | 完全相同 |
比较时不能只看最后一轮结果,而应观察:
-
最佳验证集指标;
-
最佳指标出现在哪一轮;
-
收敛速度;
-
曲线是否稳定;
-
是否出现过拟合。
十一、Batch Size 应该怎么设置
Batch Size 表示模型每次参数更新时同时使用多少个样本。
例如:
batch_size = 8
表示模型每次读取 8 个样本,计算一次平均梯度并更新参数。
Batch Size 较小
优点:
-
显存占用较少;
-
梯度带有一定随机性;
-
有时泛化能力更好。
缺点:
-
训练曲线更容易波动;
-
BatchNorm 可能不稳定;
-
单轮训练时间可能增加。
Batch Size 较大
优点:
-
梯度更加稳定;
-
GPU 利用率通常更高;
-
训练曲线更加平滑。
缺点:
-
占用更多显存;
-
不一定带来更好的验证结果;
-
学习率可能需要同步调整。
对于较大的遥感图像或医学图像,例如 512×512 输入,可以从以下范围开始:
batch_size = 2、4 或 8
对于普通分类任务,可以根据显存尝试更大的批次。
需要注意的是,Batch Size 改变后,训练行为也会发生变化,因此不能简单认为 Batch Size 越大越好。
十二、训练轮数 Epoch 怎么确定
Epoch 表示模型完整学习一遍训练集。
训练轮数太少,模型可能尚未充分收敛;训练轮数太多,则可能过拟合。
例如:
Epoch 30: Validation Dice = 0.68
Epoch 60: Validation Dice = 0.76
Epoch 90: Validation Dice = 0.71
说明模型在第 60 轮附近表现最好,后续训练可能已经开始过拟合。
因此,不能简单使用最后一轮模型。
推荐同时保存:
best_model.pth
last_model.pth
其中:
-
best_model.pth:验证集指标最高时保存的模型; -
last_model.pth:训练最后一轮保存的模型。
实际测试时通常优先使用最佳验证模型。
十三、使用 Early Stopping
Early Stopping 是缓解过拟合的一种常见方法。
例如:
max_epochs = 100
patience = 15
表示:
-
最多训练 100 轮;
-
如果验证集指标连续 15 轮没有提高,就提前终止训练。
需要注意,Early Stopping 不应过于敏感。
如果 patience 只设置为 2 或 3,模型可能因为验证指标的正常波动而过早停止。
十四、优化器怎么选择
常见优化器包括:
-
SGD;
-
Adam;
-
AdamW。
对于初学者来说,AdamW 通常是一个比较稳定、容易使用的选择。
示例:
optimizer = torch.optim.AdamW(
model.parameters(),
lr=1e-4,
weight_decay=1e-4
)
AdamW 的优点包括:
-
收敛速度较快;
-
对初始学习率相对不那么敏感;
-
在分类、检测和分割任务中均有广泛应用;
-
Weight Decay 的实现方式更加规范。
SGD 也可能取得很好的最终结果,但通常更依赖合理的学习率、动量和学习率调度策略,因此初学阶段可以优先使用 AdamW。
十五、Weight Decay 是什么
Weight Decay 可以理解为对模型参数大小进行限制。
模型参数过大时,模型可能过度适应训练数据,产生过拟合。Weight Decay 会对较大的参数施加惩罚,使模型学习到相对平滑的特征。
常见尝试范围包括:
1e-5
1e-4
5e-4
1e-3
如果出现明显过拟合,可以适当增大 Weight Decay。
例如:
1e-4 → 5e-4
但 Weight Decay 也不是越大越好。
如果正则化强度过高,模型参数会受到过强限制,可能导致训练集和验证集指标都下降,形成欠拟合。
十六、为什么需要学习率调度器
在模型训练初期,参数距离较优位置通常较远,需要相对较大的学习率快速搜索。
到了训练后期,模型已经接近较优区域,此时需要较小的学习率进行精细调整。
因此,训练过程中经常会逐渐降低学习率。
十七、Cosine Annealing
Cosine Annealing 会按照余弦曲线逐渐降低学习率。
示例:
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max=100,
eta_min=1e-6
)
它比较适合已经确定总训练轮数的任务。
例如:
初始学习率:1e-4
最低学习率:1e-6
训练轮数:100
训练初期更新幅度较大,后期逐步减小。
十八、ReduceLROnPlateau
ReduceLROnPlateau 会根据验证集表现调整学习率。
例如,当验证损失连续若干轮没有下降时,将学习率缩小。
示例逻辑:
验证损失连续 8 轮没有改善
学习率乘以 0.5
这种方法适合不知道模型会在什么时候进入平台期的情况。
初学阶段不建议同时叠加多个复杂的学习率调度器,否则出现变化时很难判断是哪种策略产生了作用。
十九、损失函数怎么选择
损失函数决定模型在训练时优化什么目标。
不同任务对应不同的损失函数。
分类任务
常见选择:
Cross Entropy Loss
二分类任务
常见选择:
Binary Cross Entropy Loss
BCEWithLogitsLoss
二分类语义分割
常见选择:
BCE Loss
Dice Loss
BCE + Dice Loss
Focal Loss
Tversky Loss
二十、BCE Loss 和 Dice Loss 的区别
BCE Loss 主要从单个像素的角度判断预测是否正确。
Dice Loss 则更关注预测区域和真实区域之间的整体重叠程度。
对于前景和背景比例不均衡的语义分割任务,单独使用 BCE 可能会让模型更加偏向数量较多的背景类别。
因此,可以将 BCE 和 Dice 组合:
Total Loss = BCE Loss + Dice Loss
或者:
Total Loss = 0.5 × BCE Loss + 0.5 × Dice Loss
这是一种比较常见的二分类分割基线方案。
二十一、什么时候使用 Focal Loss
当数据中存在严重类别不均衡,或者大量简单背景样本主导训练时,可以考虑 Focal Loss。
Focal Loss 会降低简单样本对总损失的贡献,让模型更加关注难分类样本。
但它不一定在所有任务中都优于 BCE。
推荐先建立简单基线:
BCE + Dice
如果发现少数类别仍然难以识别,再比较:
Focal + Dice
不要一开始就堆叠过多复杂损失函数,否则不利于分析实验结果。
二十二、Precision 和 Recall 应该怎么平衡
在二分类任务中:
-
Precision 高,表示预测为目标的样本大多是正确的;
-
Recall 高,表示真实目标大多被检测出来了。
Recall 很低
说明模型漏检严重。
可以尝试:
-
降低分类阈值;
-
提高正类损失权重;
-
使用 Dice、Focal 或 Tversky Loss;
-
增加少数类别样本;
-
检查目标是否过小。
Precision 很低
说明模型误检严重。
可以尝试:
-
提高分类阈值;
-
降低正类损失权重;
-
增加困难负样本;
-
改善标签质量;
-
加强模型对背景的区分能力。
不能只追求某一个指标。
例如,过度提高正类权重可能使 Recall 上升,但也可能导致模型将大量背景误判为目标,从而降低 Precision。
二十三、数据增强往往比更换模型更重要
对于样本数量有限的任务,数据增强是缓解过拟合的重要手段。
常见空间增强
-
水平翻转;
-
垂直翻转;
-
随机旋转;
-
随机裁切;
-
随机缩放;
-
仿射变换。
常见图像增强
-
亮度调整;
-
对比度调整;
-
色彩扰动;
-
高斯噪声;
-
模糊;
-
随机遮挡。
对于遥感影像,水平翻转、垂直翻转和 90° 倍数旋转通常比较常见,因为遥感目标往往不具有固定朝向。
对于自然图像,则需要考虑增强是否符合真实场景。
例如,将车辆图像上下翻转,可能产生现实中不存在的图像,因此不一定适合作为训练数据。
二十四、图像和标签必须同步增强
在语义分割任务中,输入图像和标签必须执行完全相同的空间变换。
例如,输入图像进行了水平翻转,那么标签也必须水平翻转。
错误做法:
图像:水平翻转
标签:保持不变
这样会导致图像目标位置和标签位置不一致,模型无法正常学习。
对于多模态输入,例如光学影像、雷达影像和标签,也必须同步执行旋转、翻转和裁切。
二十五、数据增强不能过强
数据增强并不是越多越好。
增强过强时,可能出现:
-
训练损失长期较高;
-
模型难以收敛;
-
图像失去真实物理意义;
-
训练数据分布偏离真实测试数据;
-
验证指标反而下降。
因此,应按照由弱到强的方式逐步增加增强。
例如:
实验 1:无增强
实验 2:翻转和旋转
实验 3:翻转、旋转和轻微颜色扰动
实验 4:加入噪声、模糊和随机遮挡
通过验证集确定哪一级增强最合适。
二十六、输入归一化为什么重要
不同输入特征的数值范围可能差异很大。
例如:
特征 A:0~1
特征 B:0~10000
特征 C:-30~5
如果直接将这些特征输入网络,数值范围较大的特征可能在梯度更新中占据主导地位,影响训练稳定性。
常见归一化方法包括:
Min-Max 归一化
x = (x - x_min) / (x_max - x_min)
将数据缩放到 0~1 范围。
标准化
x = (x - mean) / std
将数据转换为均值接近 0、标准差接近 1 的分布。
训练集的均值和标准差计算完成后,应将相同参数应用于验证集和测试集。
不能分别使用验证集或测试集计算自己的归一化参数,否则可能引入数据泄漏。
二十七、多模态数据要分别归一化
对于多模态模型,不同类型数据通常不能使用同一种归一化方法。
例如:
-
RGB 图像可能采用 ImageNet 均值和标准差;
-
遥感反射率数据可能先缩放到 0~1;
-
雷达 dB 数据可能需要裁剪异常值后再标准化;
-
深度数据可能按照有效距离范围缩放。
如果不同模态的数值尺度差异过大,模型可能过度依赖某一种输入,导致融合效果不佳。
因此,多模态训练出现性能下降时,不一定说明融合结构无效,也可能是输入尺度、配准或数据质量存在问题。
二十八、二分类阈值也可以调
二分类模型通常输出 0~1 之间的概率。
默认规则是:
概率 ≥ 0.5:预测为正类
概率 < 0.5:预测为负类
但 0.5 不一定是最佳阈值。
可以在验证集上搜索:
0.30、0.35、0.40、0.45、0.50、0.55、0.60、0.65、0.70
例如:
| 阈值 | Precision | Recall | Dice |
|---|---|---|---|
| 0.35 | 0.62 | 0.84 | 0.71 |
| 0.50 | 0.73 | 0.69 | 0.71 |
| 0.65 | 0.82 | 0.52 | 0.64 |
一般来说:
-
降低阈值,Recall 往往上升,Precision 可能下降;
-
提高阈值,Precision 往往上升,Recall 可能下降。
阈值搜索应该放在训练方案基本确定之后进行。
它只能优化最终决策,不能弥补严重的数据问题或模型训练问题。
二十九、初学者推荐的标准调参顺序
调参最好按照固定顺序进行。
第一步:检查数据
随机可视化一部分训练样本,确认:
-
图像能够正常读取;
-
标签内容正确;
-
图像与标签对齐;
-
类别编号正确;
-
没有大量空白样本;
-
没有 NaN 或无穷值;
-
训练集、验证集和测试集没有重复数据。
数据错误时,任何调参都没有意义。
第二步:建立简单基线
先使用一个结构清晰、能够稳定训练的模型。
例如,二分类分割任务可以建立如下基线:
模型:U-Net
损失函数:BCE + Dice
优化器:AdamW
学习率:1e-4
Weight Decay:1e-4
Batch Size:4
最大训练轮数:100
调度器:Cosine Annealing
Early Stopping:15
第一版基线不需要复杂。
基线的价值是为后续实验提供一个稳定参照。
第三步:优先调整学习率
固定其他参数,比较:
3e-4
1e-4
3e-5
观察最佳验证指标和训练稳定性。
学习率通常是最值得优先调整的超参数。
第四步:比较损失函数
确定较合适的学习率后,再比较:
BCE
Dice
BCE + Dice
Focal + Dice
一次只修改损失函数,不要同时改变模型、增强和 Batch Size。
第五步:调整数据增强
比较:
无增强
基础增强
中等增强
较强增强
根据验证集结果选择合适强度。
第六步:处理过拟合
如果训练集明显优于验证集,可以依次尝试:
-
增加数据增强;
-
使用 Early Stopping;
-
增大 Weight Decay;
-
减小网络宽度;
-
增加 Dropout;
-
增加训练数据。
第七步:调整模型结构
只有在数据、训练流程、学习率和损失函数都相对合理之后,再考虑:
-
更换主干网络;
-
加入注意力模块;
-
增加多尺度结构;
-
引入特征融合模块;
-
使用预训练权重。
模型越复杂,不代表效果一定越好。
在小样本任务中,更复杂的模型甚至可能更容易过拟合。
第八步:搜索最佳阈值
最后在验证集上搜索分类阈值,再使用固定阈值评价测试集。
三十、一个适合初学者的最小调参实验表
不需要一开始就做几十组实验,可以先完成以下几组。
| 实验编号 | 修改内容 | 实验目的 |
|---|---|---|
| E0 | 基线参数 | 建立参照结果 |
| E1 | 学习率改为 3e-4 | 判断基线学习率是否偏小 |
| E2 | 学习率改为 3e-5 | 判断基线学习率是否偏大 |
| E3 | 只使用 BCE | 比较损失函数 |
| E4 | 使用 Focal + Dice | 处理类别不平衡 |
| E5 | 加入翻转和旋转 | 检查数据增强效果 |
| E6 | 增大 Weight Decay | 检查过拟合 |
| E7 | 搜索分类阈值 | 优化最终决策 |
每次实验只改变一个主要变量,这种方法叫作控制变量法。
如果同时修改学习率、损失函数、网络结构和数据增强,即使结果提高,也无法确定究竟是哪一个修改起了作用。
三十一、每次实验应该记录什么
建议建立实验记录表。
| 实验名 | 模型 | 学习率 | Batch | Loss | 增强 | 最佳 Epoch | Val IoU | Val Dice | Recall |
|---|---|---|---|---|---|---|---|---|---|
| E0 | U-Net | 1e-4 | 4 | BCE+Dice | 基础 | 62 | 0.61 | 0.72 | 0.75 |
除此之外,还应记录:
-
随机种子;
-
数据集版本;
-
训练集和验证集划分;
-
输入图像尺寸;
-
优化器;
-
Weight Decay;
-
学习率调度器;
-
最佳模型保存路径;
-
训练时间;
-
是否出现 NaN;
-
对实验现象的简要分析。
实验记录不是形式工作,而是调参过程中最重要的组成部分之一。
如果没有记录,当实验数量增加后,很容易忘记每组实验修改了什么。
三十二、常见训练现象与解决方法
| 训练现象 | 可能原因 | 优先处理方法 |
|---|---|---|
| Loss 变成 NaN | 学习率过大、异常值、梯度爆炸 | 降低学习率,检查数据 |
| Loss 几乎不下降 | 学习率太小、标签错误 | 检查标签和归一化 |
| 训练集和验证集都差 | 欠拟合 | 调整学习率,增加训练 |
| 训练集好、验证集差 | 过拟合 | 增强、正则化、早停 |
| 验证指标剧烈波动 | 学习率大、Batch 小 | 降低学习率,增大批次 |
| Accuracy 高但 Dice 低 | 类别严重不平衡 | 重点观察 IoU 和 Dice |
| Recall 很低 | 漏检严重 | 调损失权重或降低阈值 |
| Precision 很低 | 误检严重 | 提高阈值或增加负样本 |
| 多模态效果反而下降 | 配准、归一化或融合有问题 | 分别检查每种输入 |
| 验证结果异常高 | 数据泄漏 | 重新检查数据划分 |
三十三、调参中常见的错误做法
1. 一次修改很多参数
例如同时修改:
-
学习率;
-
优化器;
-
损失函数;
-
Batch Size;
-
数据增强;
-
模型结构。
即使结果提高,也无法解释提升来源。
2. 只看最后一轮结果
最佳模型可能出现在中间某一轮,而不是训练结束时。
应保存验证集指标最高的模型。
3. 只看 Accuracy
对于类别不均衡任务,Accuracy 可能具有误导性。
4. 频繁使用测试集
测试集应该用于最终评价,而不是参与日常调参。
5. 指标差就立即换模型
模型效果差可能来自:
-
标签错误;
-
输入异常;
-
数据泄漏;
-
归一化不合理;
-
学习率不合适。
更换模型不能解决这些问题。
6. 只报告最好的一次结果
深度学习训练具有随机性。
更加规范的实验可以使用多个随机种子重复训练,并报告平均值和标准差。
例如:
Dice = 0.724 ± 0.008
三十四、进一步提高实验可靠性
当基础调参流程已经完成后,可以进一步采用以下方法。
1. 固定随机种子
固定:
-
Python;
-
NumPy;
-
PyTorch;
-
CUDA。
这样可以减少不同实验之间的随机差异。
2. 重复实验
对于关键模型,可以使用 3 个或 5 个随机种子分别训练。
3. 绘制训练曲线
至少绘制:
-
Train Loss;
-
Validation Loss;
-
Train Metric;
-
Validation Metric;
-
Learning Rate。
训练曲线往往比单个最终数字更能说明问题。
4. 保存配置文件
将每次实验的参数保存为 JSON 或 YAML,例如:
model: unet
learning_rate: 0.0001
batch_size: 4
epochs: 100
optimizer: adamw
weight_decay: 0.0001
loss: bce_dice
scheduler: cosine
这样可以提高实验的可复现性。
三十五、总结
深度学习调参不是盲目试数字,而是根据训练现象不断提出假设并进行验证。
对于初学者,可以记住以下原则:
先检查数据,再调整模型。
先调学习率,再调其他参数。
一次只修改一个主要变量。
使用验证集调参,不要反复查看测试集。
保存验证集表现最好的模型,而不是最后一轮模型。
训练集和验证集都差,通常是欠拟合。
训练集很好而验证集差,通常是过拟合。
小数据集首先解决过拟合,不要盲目增加模型复杂度。
一个可靠的调参流程,通常遵循:
检查数据
→ 建立基线
→ 调整学习率
→ 调整损失函数
→ 调整数据增强
→ 处理过拟合
→ 修改模型结构
→ 搜索最佳阈值
→ 最终测试
真正高质量的深度学习实验,不是模型结构越复杂越好,也不是尝试的参数越多越好,而是每一次实验都有明确目的,每一个结果都能够得到合理解释。
更多推荐




所有评论(0)