• 图像分类中提高性能的方法


    第一类:提高数据质量,数量

    通过数据增强方法提高数据数量能够大大增加模型的泛化性能。如果能够通过分析数据之间的一些信息,进而提高数据的质量,也能够很好的提高模型的结果。

    1.Random image cropping and patching

    Random image cropping and patching (RICAP)方法随机裁剪四个图片的中部分,然后把它们拼接为一个图片,同时混合这四个图片的标签。

    如下图所示,Ix, Iy是原始图片的宽和高。w和h称为boundary position,它决定了四个裁剪得到的小图片的尺寸。w和h从beta分布Beta(β, β)中随机生成,β也是RICAP的超参数。最终拼接的图片尺寸和原图片尺寸保持一致。

    2.cutout

    Cutout是一种新的正则化方法。原理是在训练时随机把图片的一部分减掉,这样能提高模型的鲁棒性。它的来源是计算机视觉任务中经常遇到的物体遮挡问题。通过cutout生成一些类似被遮挡的物体,不仅可以让模型在遇到遮挡问题时表现更好,还能让模型在做决定时更多地考虑环境(context)。

    3.Random erasing

    Random erasing其实和cutout非常类似,也是一种模拟物体遮挡情况的数据增强方法。区别在于,cutout是把图片中随机抽中的矩形区域的像素值置为0,相当于裁剪掉,random erasing是用随机数或者数据集中像素的平均值替换原来的像素值。而且,cutout每次裁剪掉的区域大小是固定的,Random erasing替换掉的区域大小是随机的。
    4.random_crop、random_mirror、random_distort (brightness、hue)、归一化(减去mean)等等

    5.Color shifting

    6.Rotation

    7.PCA color augmentatioin

    8.图片大小对结果也有着重要的影响

    第二类:网络结构

    残差链接、SE-net、densenet思想、inception系列的分叉思想和长卷核交替、激活函数使用prelu、加batchnorm、精度不够使劲加深或加宽,以及如果能够针对某个具体任务提出有用的框架,也能提高结果

    第三类:优化器,损失函数,学习率

    不同的优化器之间也会取得不同的结果,一般而言,前期先用Adam获取一个结果,后期再用SGD探寻比较优秀的结果。

    不同的分类任务,不同的数据分布等对于损失函数的选择都是有比较大的影响的,一般而言,选择一个优秀的损失函数也会产生比较好结果。

    学习率的设定也对结果有着很大的影响,一般而言,在自己经验的基础上多进行尝试选取一个合适的初始学习率是很重要的。

    第四类:tricks

    1.使用合适的预训练网络会大大提高最终的结果,大大提高收敛速度

    2.使用好的backbone:resnet101、xception、densenet、auto-ml系列中的Mnasnet

    3.使用好的训练策略:常用的使用动量随机梯度下降、初始化使用Xavier, kaming_normal

    4.Warmup

    4.Linear scaling learning rate

    5.Label-smoothing

    6.nowledge Distillation:

    提高几乎所有机器学习算法性能的一种非常简单的方法是在相同的数据上训练许多不同的模型,然后对它们的预测进行平均。但是使用所有的模型集成进行预测是比较麻烦的,并且可能计算量太大而无法部署到大量用户。Knowledge Distillation(知识蒸馏)[8]方法就是应对这种问题的有效方法之一。

    在知识蒸馏方法中,我们使用一个教师模型来帮助当前的模型(学生模型)训练。教师模型是一个较高准确率的预训练模型,因此学生模型可以在保持模型复杂度不变的情况下提升准确率。比如,可以使用ResNet-152作为教师模型来帮助学生模型ResNet-50训练。在训练过程中,我们会加一个蒸馏损失来惩罚学生模型和教师模型的输出之间的差异。

    给定输入,假定p是真正的概率分布,z和r分别是学生模型和教师模型最后一个全连接层的输出。之前我们会用交叉熵损失l(p,softmax(z))来度量p和z之间的差异,这里的蒸馏损失同样用交叉熵。所以,使用知识蒸馏方法总的损失函数是

    上式中,第一项还是原来的损失函数,第二项是添加的用来惩罚学生模型和教师模型输出差异的蒸馏损失。其中,T是一个温度超参数,用来使softmax的输出更加平滑的。实验证明,用ResNet-152作为教师模型来训练ResNet-50,可以提高后者的准确率。
    7. cosing learning rate decay

    在warmup之后的训练过程中,学习率不断衰减是一个提高精度的好方法。其中有step decay和cosine decay等,前者是随着epoch增大学习率不断减去一个小的数,后者是让学习率随着训练过程曲线下降。

    对于cosine decay,假设总共有T个batch(不考虑warmup阶段),在第t个batch时,学习率η_t为:

    这里,η代表初始设置的学习率。这种学习率递减的方式称之为cosine decay。

    下面是带有warmup的学习率衰减的可视化图[4]。其中,图(a)是学习率随epoch增大而下降的图,可以看出cosine decay比step decay更加平滑一点。
    8. Mixup training

    Mixup[10]是一种新的数据增强的方法。Mixup training,就是每次取出2张图片,然后将它们线性组合,得到新的图片,以此来作为新的训练样本,进行网络的训练,如下公式,其中x代表图像数据,y代表标签,则得到的新的xhat, yhat。

    其中,λ是从Beta(α, α)随机采样的数,在[0,1]之间。在训练过程中,仅使用(xhat, yhat)。

    Mixup方法主要增强了训练样本之间的线性表达,增强网络的泛化能力,不过mixup方法需要较长的时间才能收敛得比较好。

    9.AdaBound

    AdaBound是最近一篇论文中提到的,按照作者的说法,AdaBound会让你的训练过程像adam一样快,并且像SGD一样好。

    第五类:正则化

    1.Dropout

    2.L1/L2正则化

    3Batch Normalization

    3.Early stopping

  • 相关阅读:
    ASP.NET WEB API 自定义模型校验过滤器
    使用asp.net mvc部分视图渲染html
    .Net中的并行编程-7.基于BlockingCollection实现高性能异步队列
    python爬虫技术的选择
    优雅的处理异常
    解决asp.net动态压缩
    .Net中的并行编程-6.常用优化策略
    使用快捷键提升C#开发效率
    .Net中的并行编程-5.流水线模型实战
    .Net中的并行编程-4.实现高性能异步队列
  • 原文地址:https://www.cnblogs.com/ziwh666/p/12435394.html
Copyright © 2020-2023  润新知