0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

模型调优和复现算法遇到的一些坑

新机器视觉 来源:CSDN 作者:新机器视觉 2022-05-18 15:03 次阅读

作为一名算法工程师,主要是想把自己模型调优和复现算法遇到的一些坑总结一下(里面的一行字可能是我当时花费了一周甚至更长时间得到的总结),希望能对读者有所帮助。

一、熟悉数据

模型是数据的浓缩版----Andrew NG的二八定律,即80%的数据+20%的=更好的AI

对于新上手的一任务来说,需要熟悉你的数据。拿检测任务来说,可以写个可视化代码查看标注是否合理,查看一下待检测物体的大小分布情况(例如anchor的预设),查看一下图片大小,查看类别分布情况(例如是否有极端的分布)等等。

二、算法选型

在接到一个新领域的新任务时,需要调研相关领域算法,对该领域的发展有个大概的了解,掌握一些关键算法(比如历年的SOTA)的思路。虽然调研需要花费一些时间,但是这样在算法选型上可以少做一些实验,性价比是很高的。站在他们的肩膀上就好了。

不太可取的思路:

在指标上太钻牛角尖。有些算法工程师遇到指标在自己数据集效果不太好的情况时,立马换别的算法,或者立马换个backbone,或者立马换个loss去做实验。(需要认真分析为什么效果不好,是自己训练有问题,还是当前数据不太适合该算法,是评测指标不合理,还是评测指标实现有问题。)

不进行相关调研,直接上SOTA算法。这样做会有一些不太理想的问题,比如SOTA可能没有针对自己场景的数据做优化,比如当前任务是小目标居多(通过分析数据得到),虽然SOTA的总的mAP很高,但是small mAP比之前算法还低,那就要慎用 。比如SOTA用的是很重的网络,但是任务是速度快,或者速度与效果兼顾,那也应该慎用。

三、基于已有实现来优化算法

对于某个任务在选择好合适的算法以后,如果有相应的效果比较好的开源实现,最好用开源项目进行算法的复现。

这样做的目的:

更方便深入的理解算法的具体细节,比如可能代码在文章没有提到的某些层上偷摸的加了一个shift操作,比如文章提到的一些trick代码根本没有实现,比如代码用了额外的数据训练但文章没有提到,比如文章描述的数据增强方式与代码的实现不一样等。(这些可能发生在开源复现者没有“一比一”复现论文的情况,也可能发生在论文作者自己没有实现的情况)

能快速掌握算法的基础性能,比如复现算法大概的运行速度(特别是文章没给出的时候)和达到的效果

不用自己做一些无用功。要知道重写和调试一份新的模型不仅费时费力,可能还因为文章没有写清楚一些细节,导致你几乎无法复现到相应的结果。

利用开源项目已复现的算法(这里复现不是完全能与代码作者或者文章作者结果一致,可能是数据增强,随机种子导致结果有偏差,但已获取到八九不离十的结果)来改进模型可以有下面几点思路:

代码是否实现了文章一些涨点的trick,如果没有可以尝试

文章一般会分析实验结果,后面会有作者自己的一些观点,他们可能会说明为什么有些情况文章的算法效果较差

有些文章会写他们将来可能的工作,这也是一个改进思路

需要可视化查看实验结果(特别是跑自己的数据集),结果可能与作者在公开数据集展示出的问题不一样,分析效果差的原因

四、从0复现算法

复现算法是一个比较大的工程,这里的大工程不只是指代码多或者工作量大,而是没有一个基础版,导致引入的不可控因素太多调试困难,比如数据接口是否有问题,模型是否搭建正确,训练方式是否存在问题。

在复现算法或者优化算法是比较头疼的是一切训练正常,loss曲线比你想象的还好看,训练了一年后(just kidding, maybe longer),测试一下发现效果奇差无比,都不好意思说是自己写的代码。一年就过去了。

这里有下面一些建议:

尽量测试每一个细节,从数据接口,模型,到loss输出,到最终的评测代码。保证每个部分都可控。

测试数据接口,从单进程,batch为1开始,方便打印数值进行对比。

不要随意的去随机,尽量保证问题可以复现比如先不要加入随机数据增强,模型的随机种子固定。

用少量的数据,这样可以快速的做实验,也可以让模型快速过拟合。模型能过拟合可以大概确定模型是可以学到点什么的。

尽量按照原文来复现,在复现前,先不要过多的添加自己独特的想法。比如训练参数,模型backbone,数据增强方式等等先按照文章来。不清楚的点可以尝试email作者或者寻找相关圈子讨论。

日志打印全,比如解loss为nan的情况,需要知道是forward的导致还是bp导致。

五、一些或许有用的训练建议

保证数据是可靠的

有预训练模型最好用上

通常学习率参数小于1e-5基本没啥用了,比如cosine或者step操作,最后的学习率到1e-5就好了。当然特殊任务不一样

bn在训练时记得打开更新(特别是tf的小伙伴,容易漏),不然可能出现的问题是训练时loss下降很快,测试感觉模型就没收敛

sgd是很棒的,但是实验用adam或许收敛速度更好

如果想要很好的压榨出一个算法的性能,请先保证当前模型能到达相应的性能再去压榨。而不是盲目的换模块,疯狂调参,那样可能只是浪费时间

不要太相信自己的调参技术,在没有一个较好的baseline情况下,调参不会有质的飞跃(除非是之前参数造成了某种bug)

数据小时,使用了预训练模型记得固定前几层的模型参数,还可以用小点的学习率

loss balance有时候很有用

重复训练可能可以提升点数,将一个模型训练好后,用训练好的模型做预训练模型载入,继续用同一套参数训练。有点像CyclicLR(https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CyclicLR.html#torch.optim.lr_scheduler.CyclicLR)

DL没有像机器学习有那么多公式支撑,很多都是make sense就做个实验来验证,所以尽量多阅读论文,看看别人的实验,这样就可以减少不必要的实验

这篇文章是为了分享自己的一些心得,希望读者能用得上,如果有严重错误还请告知,不想误导他人

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4455

    浏览量

    90751
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47683
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130556

原文标题:一个算法工程师复现算法的踩坑总结

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PCB设计中会遇到的八种阻抗计算模型

    电子发烧友网站提供《PCB设计中会遇到的八种阻抗计算模型.docx》资料免费下载
    发表于 03-07 14:20 0次下载

    一些有关通信电路的资料?

    有关嵌入式之间DSP、ARM、FPGA三者之间和这三款芯片和外部电路之间通信的一些资料,比如说芯片之间的并行通信和芯片和外部电路之间的串行通信,MODBUS、DP、CAN等,一些一些常用的通信协议的
    发表于 03-03 18:53

    一些无功补偿装置SVG的资料

    一些SVG电路原理和功能码相关的技术说明书,想了解一些SVG的工作原理和工作过程
    发表于 02-03 10:13

    免费学习鸿蒙(HarmonyOS)开发,一些地址分享

    课|应用开发视频教程学习|HarmonyOS应用开发官网 官网是一些比较基础性的东西,学起来可能没那么好理解。下面再推荐个B站博主:HarmonyOS天天分享;里面有鸿蒙4.0的基础到高阶的学习讲解
    发表于 01-12 20:48

    变频电机和YZR电机哪个更好一些

    变频电机和YZR电机,谁更好一些
    发表于 11-23 08:10

    HarmonyOS NEXT工具Smart Perf Host高效使用指南

    在软件开发的过程中,很多开发者都经常会遇到一些性能问题,比如应用启动慢、点击滑动卡顿、应用后台被杀等,想要解决这些问题势必需要收集大量系统数据。而在收集数据的过程中,开发者则需要在各种工具和命令之间
    发表于 11-09 08:35

    模型算法总结

    本文将继续修炼回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些
    的头像 发表于 11-03 10:39 311次阅读
    <b class='flag-5'>模型</b><b class='flag-5'>算法</b>总结

    某些bug正常运行时会出现,当打开串口log时又不再复现怎么办?

    某些bug正常运行时会出现,当打开串口log时又不再复现怎么办? 在开发过程中,我们经常会遇到一些bug。这些bug会对我们的开发造成一定程度的困扰,有时候甚至会让我们的软件崩溃或无法正常运行
    的头像 发表于 10-31 14:37 184次阅读

    ALTERA关于CCD的一些verilog实验程序分享

    ALTERA关于CCD的一些verilog实验程序
    发表于 09-26 08:03

    使用Vue3时遇到一些问题

    要Vue3 目前已经趋于稳定,不少代码库都已经开始使用它,很多项目未来也必然要迁移至 Vue3。本文记录我在使用 Vue3 时遇到一些问题,希望能为其他开发者提供帮助。
    的头像 发表于 09-13 10:16 529次阅读
    使用Vue3时<b class='flag-5'>遇到</b>的<b class='flag-5'>一些</b>问题

    ai算法模型的区别

    ai算法模型的区别 人工智能(AI)是当今最热门的技术领域之一。虽然AI被广泛应用于各种领域,但其核心是由算法模型组成的。AI算法
    的头像 发表于 08-08 17:35 2805次阅读

    AI大模型的开源算法介绍

    AI大模型的开源算法介绍 什么是开源?简单来说就是不收取任何费用,免费提供给用户的软件或应用程序。开源是主要用于软件的术语,除了免费用户还可以对开源软件的源代码进行更改,并根据自身的使用情况进行
    的头像 发表于 08-08 17:25 1381次阅读

    一些模电笔记

    一些模电笔记
    发表于 06-09 22:33

    s32添加一些 .c 文件时生成文件出现问题怎么解决?

    我们在 nxp s32 设计工作室软件中包含一些文件时遇到了这个 make 文件错误,请帮助解决这个问题
    发表于 05-19 06:39

    CSEc模块初始化时使用setAuthKey()设置授权密钥的一些问题求解

    我在使用 CSEc 模块时遇到一些问题。 我在初始化期间使用 setAuthKey 设置授权密钥,并使用 loadKey 加载和更新 key1。重新上下电后如何管理setAuthKey
    发表于 05-18 10:24