社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习怎么有效加模块?(建议收藏)

AI算法科研paper • 1 周前 • 51 次点击  

就这个问题总结了自己的一些加模块经验,欢迎修正与讨论~

另外这块我做的时候,整理过一份即插即用的模块包,目前梳理了320个,主要是方便自己试错,常见的通用组件比如注意力机制、卷积、特征融合模块等都有,前沿模块和特殊场景模块也有

如果大家需要可以下划到文末戳左下方“阅读原文”,加小享发送这篇文章的截图即可获取。

1,加模块前先把baseline摸透

别上来就塞模块,先确认baseline是不是真的训练到位了,把loss跑到基本不降、验证集指标稳定,再谈优化。然后可以用tensorboard可视化特征图,看看是浅层特征不够、深层语义有问题,还是信息冗余,找准瓶颈再动手。之前有人觉得小物体检测不行想加attention,结果是浅层特征丢太多,加个FPN就解决了,诊断可比盲目加模块重要多了。

2,模块位置选对才管用

位置比模块本身还关键,优先从浅层或输出端试,比如特征提取后加注意力,或者在head部分改动,不要轻易动backbone的预训练权重,不然又要重新训很久。不同模块有适配位置,比如SE block放residual block末尾,想增强细节加浅层,全局建模选bottleneck位置。不确定就做ablation study,把模块插在不同位置试,有时候简单1x1卷积找对位置都能涨点。

3,模块要跟数据、任务匹配

小数据集别加复杂模块,不然肯定过拟合,选SE、ECA这种参数少的轻量化模块就够了。数据量上万可以稍微放开,但要盯着验证集,gap大了就收手。任务也要对上,分类用channel attention更管用,检测分割离不开spatial attention。数据集尺度变化大就加multi-scale模块,背景复杂就用contextual modeling模块。

4,控制参数量+注意训练细节

加模块别光想涨点,先用thop库算FLOPs和params,别让参数翻倍导致训不动或推理慢。可以用depthwise separable convolution替换普通卷积,或者用bottleneck降维。另外,新模块要单独设2-10倍学习率,毕竟是随机初始化,跟预训练的backbone学习速度不一样,还得用kaiming初始化卷积层、BN层weight设1 bias设0,避免loss nan或带崩整体。

5,必做消融实验验效果

加模块的目的是涨点,不是堆复杂度。一次只加一个模块,记录指标变化,之后单独拿掉这个模块跑一次,看真实贡献。有时候花大力气加的复杂模块,贡献才0.2个点,还不如数据清洗或调增强性价比高。也别盲目组合模块,可能单独用都涨点,放一起反而掉点,要找最优搭配。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/198455