《南溪的目标检测学习笔记》——夏侯南溪的CNN调参笔记,加油
1 致谢
感谢赵老师的教导!
感谢张老师的指导!
2 调参目标
在COCO数据集上获得mAP>=10.0的模型,现在PaddleDetection上的Anchor-Free模型【TTFNet】的mAP= 33.5;
3 学习模型: PicoDet
PicoDet是目前实时检测模型中batch-size最大的模型,我们将其作为我们的学习目标~
4 超参数速查表
# 图像预处理
图像尺寸预处理(same_padding
、letterbox
)
# 特征归一化
mean&std
(mean&std在样本增广之后进行计算)
# 编码encode
位置编码
Shape编码
# 载入数据
bs
:批处理的数据个数
(bs在确定loss函数之后确定)
# principles
act
: 激活函数
weights_init
: 参数初始化
# Backbone
input_channels_bn
: 输入通道归一化(~)
# neck
步长设置
# loss函数
loss_scale
: loss函数缩放因子(准备进行实验)
不同loss目标的对数权重
# 训练策略
base_lr
: 基础学习率(leanring rate linear scaling)
piecewise_decay
: 使用Piecewise-Decay的学习率策略(~)
# 后处理
nms
:使用NMS算法
~:表示暂时缺省
# 数据增广参数
3.1 HPS超参数
缩放因子loss_scale
loss权重s_map
s_offset
s_shape
优化器权重衰减weight_decay
优化器RM系数beta1
beta2
学习率lr
5 参数调整时间表
3.1 第一轮更新——QMV
建立简单的初始模型,
使用QMV模式进行调参,QMV = 100
;
3.2 第二轮更新——RSR
RSR: Randomly selected review, 从训练集中随机选取多个数据进行评测。
对训练集进行针对性调参,
使用RSR模式进行调参,RANDOM_SAMPLE_NUM = 3000=3k
,这个参数是我调试出来的,如果小于这个参数,评测值会十分不稳定;
6 实验配置说明
val_data_mode
: 模型验证的数据模式。
7 图像预处理
输入分辨率:640x640像素
参数设置: 为了保持最大的信息量,根据COCO数据集尺寸最大的图像来进行设置;
暂停使用letterbox
经过实验发现,letterbox640目前还没有same_padding效果好,参见exp_lb640_2021-04-21_193450
;
8 特征归一化——mead&std
调参阶段:在样本增广之后进行调整;
备注:特征归一化对加快收敛是有效果的,这个已经经过实验证明了,实验结果如图所示,
这里我们使用的特征归一化方法还是沿用的吴恩达教授在《Machine Learning》课程中使用的归一化方法,也就是“mead&std特征归一化”;
关于均值和标准差的计算,请参考《南溪的目标检测学习笔记》——特征归一化(mead&std)》
9 样本增广
调参阶段:在第二轮更新的最后进行调整;
10 Batchsize调整的尽量大
首先batchsize的原因是这种调参是最简单的,基本上没有什么成本,只需要把网络重新训练就行了,而且这种方法一般都会很有效,因为当batchsize变大时,此时每个batch的样本的分布有更大的可能会接近训练集整体的分布,也就是说,当前的batch会更具有代表性,从而不会因为少数样本的偏差,而影响局部最优解的收敛路径;
一次看的更多,选择才会更有全局意识,才会更加理智嘛;
如果一次只看到很少量的样本,难免选择梯度的前进方向的时候,就会出现偏离,从而产生Zigzag现象呢;
(我们在MTCNN模型上,通过调大batchsize实现了召回率的提升)
11 Backbones和设计原则
7.1 权重初始化
权重初始化会影响模型的收敛速度,目前使用的是trunc_normal
,其对照实验结果如下,
7.1 输入通道归一化 (input_channels_bn
)
回顾:当时设计input_channels_bn
主要是感觉可以使用BN来对输入图像通道进行learnable的分布归一化;
后来试了一下,发现没有什么明显的效果;
现在暂时停用;
12 Neck设计
由于步长搜索的代价较大,我们暂时使用已有网络的步长设计,目前使用的是yolov5x的SPP步长;
13 Head设计
13.1 设计说明
尽量保证head部分算子的连续性
之前在实验的时候发现,将sigmoid函数替换为H-Sigmoid函数,模型的收敛会变慢,所以我们要在head部分要尽量使用连续性强的算子,而减少使用类似于H-Sigmoid这样具有不可导点的算子;
不要使用BN层
Head模块中不要使用BN层,会使得网络收敛变慢,(可能是由于热点图的稀疏性引起的);
备注:
- CascadeRcnn-Cbr200vd(来自PaddleDetection)在head设计中没有使用BN层,其代码截图如下
13.1 range_norm_act
SoftSkim
对sigmoid函数进行改进,代码如下:
(x.sigmoid()-0.1)*1.2
# 经过这样的处理之后,张量的值域为(-0.12,1.08)包含[0,1]
初步测试了一下,效果不好,原因我也不是很清楚,我猜测是乘上正数因子会导致梯度优化的不稳定;
HeatSkim
不要使用heat_skim
,试了一下感觉没有什么用,heat_skim
暂时停用;
备注:
# HeatSkim代码
(x.sigmoid()-0.1)*1.2.clamp(min=0, max=1)
# 对张量值进行扩展之后,再用.clamp函数规范化到[0,1]区间
14 loss函数
14.1 loss缩放因子ls(#)
ls#:该参数暂时缺省,因为在调参时,我发现该参数过于不稳定;
待服务器配置升级之后,再提高迭代次数,继续进行实验;
猜想:不稳定的原因可能是因为使用了Adam优化算法,导致优化过程对缩放因子ls不敏感。
调参方法:七星连珠法
14.2 权重更新
Decay值:0.99
14.3 备注
14.3.1 KLDivLoss
使用问题(Deprecated)
文档示例代码错误
我们在前期实验的时候发现,nn.KLDivLoss
官方文档的代码是有问题的:官方的示例代码会报错;该问题已经在PyTorch的Github上提交[issue];
修改如下所示:
import torch
import torch.nn as nn
import torch.nn.functional as Fkl_loss = nn.KLDivLoss(reduction="batchmean")
# input should be a distribution in the log space
input = F.log_softmax(torch.randn(3, 5, requires_grad=True), dim=-1)
# Sample a batch of distributions. Usually this would come from the dataset
# 在softxmax操作中加上了dim参数
target = F.softmax(torch.rand(3, 5), dim=-1)
output = kl_loss(input, target)log_target = F.log_softmax(torch.rand(3, 5), dim=-1)
# output = kl_loss(input, log_target, log_target=True)
# log_target=True应该放在module的构造函数中,
kl_loss = nn.KLDivLoss(log_target=True, reduction="batchmean")
output = kl_loss(input, log_target) # 在计算时不用在声明log_target参数
KLDivLoss
的loss会出现负数
我在实验的时候发现使用KLDivLoss
会出现负数,感觉这个torch函数十分不稳定,于是我们暂时将其deprecate。
11 训练策略
10.1 学习率lr
lr的形象比喻
lr可以看作是小球的半径;
调整方法
lr = 0.001 0.003 0.01 0.03 0.1 0.3 1 3 10
这里的参数值是符合指数函数的增长规律的,可以参考我的博文《CNN——学习率LR的参考值范围是符合指数函数的增长规律的》;
调参方法:七星连珠法
10.2 优化器optimizer
optimizer算法列表:
AdamW
算法(used by Swin-Transformer-Object-Detection)
10.2.1 学习率调节策略
10.2.1.1 Warm Up(Disabled)
我尝试了Warmup策略,会使模型在初期收敛缓慢,暂时禁用;
12 后处理方法
先通过训练获得权重之后,再来对后处理算法进行调参;
13 问题描述
13.1 从第二个epoch开始loss就一直保持不变,不在下降
原因分析:
- 学习率较大,导致梯度向量在斜坡两侧不断来回碰撞,难以继续下降到达底部,
解决方案: 可以尝试降低学习率lr;
13.2 train集的loss不但下降,而val集的loss最终与训练集loss相差很大
出现了过拟合现象
原因分析:
- 如果验证集loss最后只是反复震荡,而没有出现下降的现象, 说明模型在一定程度上很好地利用了训练集的数据,分类边界有一定的过拟合,但并没有对验证loss产生很大影响;说明根本原因还是train集的分布无法很好地表征val集数据的分布,换句话说,训练集与验证集的分布存在较大的差异性;
解决方案: 可以尝试降低学习率lr;
《南溪的目标检测学习笔记》——夏侯南溪的CNN调参笔记,加油相关推荐
- 《南溪的目标检测学习笔记》——模型预处理的学习笔记
1 介绍 在目标检测任务中,模型预处理分为两个步骤: 图像预处理:基于图像处理算法 数值预处理:基于机器学习理论 关于图像预处理,请参考<南溪的目标检测学习笔记>--图像预处理的学习笔记 ...
- 《南溪的目标检测学习笔记》——COCO数据集的学习笔记
1 COCO数据集 COCO数据集下载链接:COCO_download 1.1 数据概览 数据集大小 train: 118287张 train+val: 123287张 val: 5000张 目标数量 ...
- 《南溪的目标检测学习笔记》的笔记目录
1 前言 这是<南溪的目标检测学习笔记>的目录~ 2 学习目标检测的思路--"总纲" <南溪的目标检测学习笔记>--目标检测的学习笔记 我在这篇文章中介绍了 ...
- 《南溪的目标检测学习笔记》——目标检测模型的设计笔记
1 南溪学习的目标检测模型--DETR 南溪最赞赏的目标检测模型是DETR, 论文名称:End-to-End Object Detection with Transformers 1.2 decode ...
- 《南溪的目标检测学习笔记》——PyTorch模型搭建模板
1 前言 南溪在学习基于PyTorch的目标检测模型,对一些十分好的代码模板进行学习- 2 PyTorch模型模板 2.1 Faster R-CNN ResNet-50 FPN--PyTorch官方的 ...
- 《南溪的目标检测学习笔记》——权重初始化
1 介绍 在使用CNN搭建目标检测模型时,有一个很重要的步骤就是需要进行权重初始化,那么为什么需要进行权重初始化呢? 2 权重初始化的原因 关于为什么要进行权重初始化,请阅读知乎文章<神经网络中 ...
- 《南溪的目标检测学习笔记》——目标检测的评价指标(mAP)
1 介绍 在本文中我们将介绍目标检测任务中的mAP~ 2 COCO-mAP 在介绍mAP时,我们选择的是COCO-mAP,这是现在最为流行的指标: 关于COCO-mAP的形象解释,请参考视频<霹 ...
- 《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)
1 前言 在目标检测中,可能会遇到显存不足的情况,我们在这里记录一下解决方案: 2 如何判断真正是出现显存溢出(不是"软件误报") 当前需要分配的显存在600MiB以下, 例如: ...
- 《南溪的目标检测学习笔记》——图像预处理的学习笔记
1 致谢 感谢PaddleDetection对开源社区的分享以及在目标检测领域做出的贡献! 2 Letterbox--YOLO家族使用的预处理方法 代码链接:yolov5-letterbox
最新文章
- 《企业软件交付:敏捷与高效管理精要》——1.6 结论
- 读张鸣-《辛亥:摇晃的中国》感
- lower_bound()、upper_bound()
- C语言stdio相关的几个函数
- ibm服务器hyper-v搭建的虚拟机操作系统数据如何导出到本机,将虚拟机从Hyper-V转移到KVM|导出完整vhdx磁盘转换qcow2...
- OpenInfra 基金会积极推动开源项目在中国市场的发展与应用
- DOM操作之确定元素大小
- oracle 自动关闭 数据库连接
- 如日中天的Uber到底是用什么开发语言做到的?
- javascript的parseInt函数(转)
- PHP判断浏览器类型及版本
- ubuntu 旺旺_Ubuntu 下通过Wine安装阿里旺旺并解决中文乱码
- ssm基于web的教务管理系统毕业设计源码261620
- 安全漏洞防御(8) DDOS 攻击的防范教程
- 女性电子商务服装评论
- 蓝桥杯——鲁卡斯队列
- 中国染料医用激光器行业市场供需与战略研究报告
- 【poj-1066】判断线段相交
- 变色镜片 | 夏日光线防护新宠儿
- ospf-NBMA基本配置