GiantPandaCV | 提升分类模型acc(二):图像分类技巧实战

2024-06-12 21:36

本文主要是介绍GiantPandaCV | 提升分类模型acc(二):图像分类技巧实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文来源公众号“GiantPandaCV”,仅用于学术分享,侵权删,干货满满。

原文链接:提升分类模型acc(二):图像分类技巧实战

上一篇文章GiantPandaCV | 提升分类模型acc(一):BatchSize&LARS-CSDN博客探讨了训练的bs大小和LARS对精度的影响,本篇文章是本系列的第二篇文章,主要是介绍张航的Bag of Tricks for Image Classification 中的一些方法以及自己实际使用的一些trick。

论文链接:https://arxiv.org/abs/1812.01187
R50-vd代码: https://github.com/FlyEgle/ResNet50vd-pytorch
知乎专栏: https://zhuanlan.zhihu.com/p/409920002

1 前言

如何提升业务分类模型的性能,一直是个难题,毕竟没有99.999%的性能都会带来一定程度的风险,所以很多时候只能通过控制阈值来调整准召以达到想要的效果。本系列主要探究哪些模型trick和数据的方法可以大幅度让你的分类性能更上一层楼,不过要注意一点的是,tirck不一定是适用于不同的数据场景的,但是数据处理方法是普适的。

ps: 文章比较长,不喜欢长文可以直接跳到结尾看结论。

简单的回顾一下第一篇文章的结论: 使用大的batchsize训练会略微降低acc,可以使用LARS进行一定程度的提升,但是需要进行适当的微调,对于业务来说,使用1k的batchsize比较合适。

2 实验配置

  • 模型: ResNet50, CMT-tiny

  • 数据: ImageNet1k & 业务数据

  • 环境: 8xV100

ps: 简单的说明一下,由于部分实验是从实际的业务数据得到的结论,所以可能并不是完全适用于别的数据集,domain不同对应的方法也不尽相同。

本文只是建议和参考,不能盲目的跟从。imagenet数据集的场景大部分是每个图片里面都会包含一个物体,也就是有主体存在的,笔者这边的业务数据的场景很多是理解性的,更加抽象,也更难。

3 Bag of Tricks

3.1 数据增强

  • 朴素数据增强

通用且常用的数据增强有random flipcolorjitterrandom crop,基本上可以适用于任意的数据集,colorjitter注意一点是一般不给hue赋值。

  • RandAug

AutoAug系列之RandAug,相比autoaug的是和否的搜索策略,randaug通过概率的方法来进行搜索,对于大数据集的增益更强,迁移能力更好。实际使用的时候,直接用搜索好的imagnet的策略即可。

  • mixup & cutmix

mixup和cutmix均在imagenet上有着不错的提升,实际使用发现,cutmix相比mixup的通用性更强,业务数据上mixup几乎没有任何的提升,cutmix会提高一点点。不过两者都会带来训练时间的开销, 因为都会导致简单的样本变难,需要更多的iter次数来update,除非0.1%的提升都很重要,不然个人觉得收益不高。在物体识别上,两者可以一起使用。公式如下:

  • gaussianblur和gray这些方法,除非是数据集有这样的数据,不然实际意义不大,用不用都没啥影响。

实验结论:

  • 20% imagenet数据集 & CMT-tiny

  • 业务数据上(ResNet50) autoaug&randaug没有任何的提升(主要问题还是domain不同,搜出来的不适用),cutmix提升很小(适用于物体而不是理解)。

3.2 学习率衰减

退火方法常用于图像复原等用于L1损失的算法,有着不错的性能表现。

个人常用的方法就是cosinedecay,比较喜欢最后的acc曲线像一条"穿天猴", 不过要相对多训练几k个iter,cosinedecay在最后的acc上升的比较快,前期的会比较缓慢。

3.3 跨卡同步bn&梯度累加

这两个方法均是针对卡的显存比较小,batchsize小(batchszie总数小于32)的情况。

  • SyncBN

虽然笔者在训练的时候采用的是ddp,实际上就是数据并行训练,每个卡的batchnorm只会更新自己的数据,那么实际上得到的running_mean和running_std只是局部的而不是全局的。

如果bs比较大,那么可以认为局部和全局的是同分布的,如果bs比较小,那么会存在偏差。

所以需要SyncBN同步一下mean和std以及后向的更新。

  • GradAccumulate

    梯度累加和同步BN机制并不相同,也并不冲突,同步BN可以用于任意的bs情况,只是大的bs下没必要用。

    跨卡bn则是为了解决小bs的问题所带来的性能问题,通过loss.backward的累加梯度来达到增大bs的效果,由于bn的存在只能近似不是完全等价。代码如下:

 for idx, (images, target) in enumerate(train_loader):images = images.cuda()target = target.cuda()outputs = model(images)losses = criterion(outputs, target)loss = loss/accumulation_steps
loss.backward()
if((i+1)%accumulation_steps) == 0:
optimizer.step()
optimizer.zero_grad()
```backward```是bp以及保存梯度,```optimizer.step```是更新weights,由于accumulation_steps,所以需要增加训练的迭代次数,也就是相应的训练更多的epoch。

3.4 标签平滑

LabelSmooth目前应该算是最通用的技术了

优点如下:

  • 可以缓解训练数据中错误标签的影响;

  • 防止模型过于自信,充当正则,提升泛化性。

但是有个缺点,使用LS后,输出的概率值会偏小一些,这会使得如果需要考虑recall和precision,卡阈值需要更加精细。

代码如下:

class LabelSmoothingCrossEntropy(nn.Module):"""NLL loss with label smoothing."""def __init__(self, smoothing=0.1):"""Constructor for the LabelSmoothing module.:param smoothing: label smoothing factor"""super(LabelSmoothingCrossEntropy, self).__init__()assert smoothing < 1.0self.smoothing = smoothingself.confidence = 1. - smoothingdef forward(self, x, target):logprobs = F.log_softmax(x, dim=-1)nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1))nll_loss = nll_loss.squeeze(1)smooth_loss = -logprobs.mean(dim=-1)loss = self.confidence * nll_loss + self.smoothing * smooth_lossreturn loss.mean()

4 ResNet50-vd

ResNet50vd是由张航等人所提出的,相比于ResNet50,改进点如下:

  1. 头部的conv7x7改进为3个conv3x3,直接使用7x7会损失比较多的信息,用多个3x3来缓解。

  2. 每个stage的downsample,由(1x1 s2)->(3x3)->(1x1)修改为(1x1)->(3x3 s2)->(1x1), 同时修改shortcut从(1x1 s2)avgpool(2) + (1x1)。1x1+s2会造成信息损失,所以用3x3和avgpool来缓解。

实验结论:

模型数据epochtrickacc@top-1
R50-vdimagenet1k300aug+mixup+cosine+ls78.25%

上面的精度是笔者自己跑出来的比paper中的要低一些,不过paper里面用了蒸馏,相比于R50,提升了将近2个点,推理速度和FLOPs几乎没有影响,所以直接用这个来替换R50了,个人感觉还算不错,最近的业务模型都在用这个。

代码和权重在git上,可以自行取用,ResNet50vd-pytorch。

5 结论

  • LabelSmooth, CosineLR都可以用做是通用trick不依赖数据场景。

  • Mixup&cutmix,对数据场景有一定的依赖性,需要多次实验。

  • AutoAug,如果有能力去搜的话,就不用看笔者写的了,用就vans了。不具备搜的条件的话,如果domain和imagenet相差很多,那考虑用一下randaug,如果没效果,autoaug这个系列可以放弃。

  • bs比较小的情况,可以试试Sycnbn和梯度累加,要适当的增加迭代次数。

6 结束语

本文是提升分类模型acc系列的第二篇,后续会讲解一些通用的trick和数据处理的方法,敬请关注。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

这篇关于GiantPandaCV | 提升分类模型acc(二):图像分类技巧实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055396

相关文章

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方