论文:https://arxiv.org/pdf/2401.09417v1.pdf
作者研究了轻量级模型设计的新方法,通过引入视觉状态空间模型(SSM)以提高效率和性能。提出了一种名为EcientVMamba的高效模型变体,结合选择性扫描和有效跳跃采样,同时利用全局和局部表示特征。EcientVMamba在多种视觉任务中取得了具有竞争力的结果,并降低了计算复杂度。文章还探讨了SSMs在视觉任务中的应用,并指出现有轻量级模型在保持全局表示能力方面的挑战。

EcientVMamba的设计为解决这些问题提供了新的思路,展示了SSM在视觉任务中的潜力。该模型通过融合全局自注意力机制和卷积神经网络,实现了全局和局部特征的有效融合,优化了SSM和CNN块的分配,提升了模型性能。同时,本文还提出了视觉状态空间块EVSS,结合ES2D选择性扫描和卷积操作,降低计算复杂度,提高特征提取效率。此外,本文还设计了多种EcientVMamba模型变体,以适应不同大小和计算需求。实验结果表明,这些模型在图像分类、目标检测和语义分割任务上表现出色,实现了高效内存使用和性能平衡。本文的研究为轻量级视觉模型的发展提供了新的思路和方向,推动了图表示学习领域的发展。
本文使用EcientVMamba模型实现图像分类任务,模型选择最小的EcientVMamba_T,在植物幼苗分类任务ACC达到了93%+,达到了ViM的水平。。


通过这篇文章能让你学到:
如何使用数据增强,包括transforms的增强、CutOut、MixUp、CutMix等增强手段?
如何实现EfficientVMamba模型实现训练?
如何使用pytorch自带混合精度?
如何使用梯度裁剪防止梯度爆炸?
如何使用DP多显卡训练?
如何绘制loss和acc曲线?
如何生成val的测评报告?
如何编写测试脚本测试测试集?
如何使用余弦退火策略调整学习率?
如何使用AverageMeter类统计ACC和loss等自定义变量?
如何理解和统计ACC1和ACC5?
如何使用EMA?
如果基础薄弱,对上面的这些功能难以理解可以看我的专栏:经典主干网络精讲与实战这个专栏,从零开始时,一步一步的讲解这些,让大家更容易接受。
使用pip就行,命令:
mixup增强和EMA用到了timm
为了提高成绩我在代码中加入Cutout和Mixup这两种增强方式。实现这两种增强需要安装torchtoolbox。安装命令:
Cutout实现,在transforms中。
需要导入包:from timm.data.mixup import Mixup,
定义Mixup,和SoftTargetCrossEntropy
Mixup 是一种在图像分类任务中常用的数据增强技术,它通过将两张图像以及其对应的标签进行线性组合来生成新的数据和标签。 参数详解:
❝ mixup_alpha (float): mixup alpha 值,如果 > 0,则 mixup 处于活动状态。 cutmix_alpha (float):cutmix alpha 值,如果 > 0,cutmix 处于活动状态。 cutmix_minmax (List[float]):cutmix 最小/最大图像比率,cutmix 处于活动状态,如果不是 None,则使用这个 vs alpha。 如果设置了 cutmix_minmax 则cutmix_alpha 默认为1.0 prob (float): 每批次或元素应用 mixup 或 cutmix 的概率。 switch_prob (float): 当两者都处于活动状态时切换cutmix 和mixup 的概率 。 mode (str): 如何应用 mixup/cutmix 参数(每个'batch','pair'(元素对),'elem'(元素)。 correct_lam (bool): 当 cutmix bbox 被图像边框剪裁时应用。 lambda 校正 label_smoothing (float):将标签平滑应用于混合目标张量。 num_classes (int): 目标的类数。❞
EMA(Exponential Moving Average)是指数移动平均值。在深度学习中的做法是保存历史的一份参数,在一定训练阶段后,拿历史的参数给目前学习的参数做一次平滑。
EMA在深度学习训练中的好处主要有以下几点:
稳定性:EMA能够减少模型权重在训练过程中的波动,使模型更加稳定。
提高性能:在某些情况下,使用EMA权重的模型在验证集或测试集上的性能可能优于直接使用原始模型权重的模型。
更好的泛化能力:由于EMA平滑了模型权重的更新,它可能有助于模型更好地泛化到新数据。 需要注意的是,虽然EMA在很多情况下都很有用,但并不是所有任务或所有模型都适合使用EMA。在实际应用中,是否使用EMA以及具体的衰减率设置可能需要根据任务的具体需求和模型的特性进行调整。
具体实现如下:
加入到模型中。
针对没有预训练的模型,容易出现EMA不上分的情况,这点大家要注意啊!
mean_std.py:计算mean和std的值。 makedata.py:生成数据集。 train.py:训练Vim模型 models:来源官方代码,对面的代码做了一些适应性修改。 test.py:测试脚本
系统:ubuntu22.04 CUDA:12.1 python:3.11 显卡驱动:545

系统、CUDA和python的安装过程忽略,这些都能找到。
下载源码。 进入vim中,找到vim_requirements.txt文件,如下图:

打开vim_requirements.txt文件,按照要求安装缺失的库文件,如下:
进入causal-conv1d文件夹,如下图:

执行命令:
进入mamba文件夹下面,如下图:

执行命令:
最终就可以完成编译了!
为了使模型更加快速的收敛,我们需要计算出mean和std的值,新建mean_std.py,插入代码:
数据集结构:

运行结果:
把这个结果记录下来,后面要用!
我们整理还的图像分类的数据集结构是这样的
pytorch和keras默认加载方式是ImageNet数据集格式,格式是
新增格式转化脚本makedata.py,插入代码:
完成上面的内容就可以开启训练和测试了。
接下来在EfficientVMamba实战:使用EfficientVMamba实现图像分类任务(二)中完成训练和测试。