目录
一、数据分析处理
数据增强方式:改亮度、对比度、饱和度,左右上下翻转,模糊,mixup(将多张图像融合在一张图像上)
二、模型设计与选择
- Yolo系列
- SSD
- Faster R-CNN系列(其中faster rcnn最经典)
- anchor-free方法,如cornerNet(直接找左上角和右下角的关键点来得知物体位置)
三、模型改进方法
1. backbone
A. 模型深度与宽度:ResNet block和Inception block
B. 并行连接高分辨率到低分辨率的特征图;重复用多尺度特征融合:HRNet
2. 特征融合
如FPN(特征金字塔)和ASPP(空洞卷积)
3. 损失
A. focal loss:参照Focal Loss for Dense Object Detection整体介绍及部分细节讲解
B. GIou:不用MSE、L1-smooth作为损失函数,而改用GIoU作为损失函数
I
o
U
=
A
∩
B
A
∪
B
IoU = \frac{A\cap B}{A\cup B}
IoU=A∪BA∩B
G
I
o
U
=
I
o
U
−
∣
C
\
(
A
∪
B
)
∣
∣
C
∣
GIoU = IoU-\frac {|C\backslash (A\cup B)|}{|C|}
GIoU=IoU−∣C∣∣C\(A∪B)∣
L
G
I
o
U
=
1
−
G
I
o
U
L_{GIoU} = 1-GIoU
LGIoU=1−GIoU
四、注意事项
1. 防止梯度消失、梯度爆炸
A. 换激活函数 Relu→LRelu→PRelu
B. resnet block
C. BN
D. 梯度截断(clipping,防止梯度过大):
∥
g
^
∥
>
t
h
r
e
s
h
o
l
d
则
g
^
=
t
h
r
e
s
h
o
l
d
∥
g
^
∥
g
^
\lVert \hat{g}\rVert>threshold则\hat{g}=\frac{threshold}{\lVert\hat{g}\rVert}\hat{g}
∥g^∥>threshold则g^=∥g^∥thresholdg^
E. 预训练+微调
# paddlepaddle代码
train_parameters = {
...
"pretrained": True, # 是否使用预训练模型
"pretrained_dir": "data/data11251/ResNet50_pretrained", # 预训练模型地址
...
}
def load_params(exe, program):
...
elif train_parameters['pretrained'] and os.path.exists(train_parameters['pretrained_dir']):
logger.info('load params from pretrained model')
def if_exist(var):
return os.path.exists(os.path.join(train_parameters['pretrained_dir'], var_name))
fluid io.load_vars(exe, train_parameters['pretrained_dir'], main_program=program,
predicate=if_exist)
2. 过拟合解决
A. 数据增强
B. 提前终止
C. 权重正则化(如L1、L2正则化)
D. dropout(还有dropConnect、dropblock)
3. 参数调优其他方法
A. 学习率
B. 训练轮数
C. 优化函数
4. 在线难例挖掘
五、后处理
模型融合、测试结果融合、根据实际任务改进
六、调优基本原则——快速试错
- 先用小数据训练预测再到大数据
- loss设计要合理
- 综合loss和准确率判断效果
- 确认网络学习充分
- 学习率设置合理
- 对比训练集和验证集(过拟合、训练是否够、是否需要early stop)
七、答疑
- batch size不能超过显存,一般越大越好,和学习率有相关性
- loss抖动大原因:脏数据、数据量大(网络未完全学习到)、学习率、网络结构等
- 看loss调参:loss不下降且震动,则调大学习率
- loss的最小量级根据loss function、具体任务、网络设置等判断
心得感受
学习新知识真开心
希望我能早日成为一个大佬吧(hhhhhhh)