Yolov8改进---注意力机制: SimAM(无参Attention)和NAM(基于标准化的注意力模块),效果秒杀CBAM、SE

博客介绍了Yolov8中SimAM和NAM两种新的注意力机制,无参的SimAM在不增加参数的情况下提升了模型性能,而NAM通过对特征的稀疏权重惩罚实现高效性能。这两种方法在ResNet和MobileNet上的实验结果显示,它们的效果优于传统的CBAM和SE模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆

✨✨✨魔改网络、复现前沿论文,组合优化创新

🚀🚀🚀小目标、遮挡物、难样本性能提升

🍉🍉🍉定期更新不同数据集涨点情况

1. SimAM:无参Attention

论文: 

### YOLOv8改进 SimAM 模块的方法 #### 方法一:调整激活函数 为了提升模型的表现,在SimAM模块中可以尝试不同的激活函数来代替默认使用的ReLU。例如,采用Swish或Mish作为新的激活函数可能会带来更好的效果。这些激活函数能够提供更平滑的梯度流动,有助于优化过程中的稳定性收敛速度。 ```python import torch.nn as nn class SimAM(nn.Module): def __init__(self, lambda_param=0.35): super(SimAM, self).__init__() self.lambda_param = lambda_param def forward(self, x): b, c, h, w = x.size() # 使用 Swish 或 Mish 替代 ReLU activation = nn.Swish() # or nn.Mish() n_x = x - x.max(dim=-1, keepdim=True)[0].max(dim=-2, keepdim=True)[0] spatial_map = (torch.exp(n_x / self.lambda_param)).sum(dim=1, keepdim=True) return x * (spatial_map / spatial_map.max(dim=-1, keepdim=True)[0]).expand_as(x) ``` [^1] #### 方法二:动态调整λ数 原始版本中的SimAM使用固定的超数λ控制注意力图缩放程度。通过引入自适应机制让这个值随着训练迭代次数变化,可以在不同阶段给予不同程度的关注权重调节。具体来说,可以根据损失下降情况或者验证集表现自动更新该系数。 ```python def update_lambda(optimizer, epoch, base_lambda=0.35, decay_rate=0.9): """根据epoch数衰减lambda""" current_lambda = max(base_lambda * (decay_rate ** epoch), 0.01) for param_group in optimizer.param_groups: if 'lambda' in param_group: param_group['lambda'] = current_lambda # 在训练循环里调用此函数 for e in range(epochs): ... update_lambda(optimizer, e) ``` [^2] #### 方法三:多尺度特征融合增强 除了直接替换现有组件外,还可以考虑将多个尺度下的特征图输入到同一个SimAM层处理后再做聚合操作。这样做的好处是可以捕捉更多层次的空间关系信息,从而提高最终预测精度。实现方式是在骨干网络的不同stage之间插入额外的分支路径用于传递低分辨率特征给高分辨率部分。 ```python from functools import partial def make_divisible(v, divisor=8, min_value=None): if min_value is None: min_value = divisor new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) # Make sure that round down does not go down by more than 10%. if new_v < 0.9 * v: new_v += divisor return new_v class MultiScaleSimAM(nn.Module): def __init__(self, channels_list=[64, 128], out_channels=256, kernel_size=3, stride=1, padding=1): super(MultiScaleSimAM, self).__init__() inner_channel = sum(channels_list)//len(channels_list) self.convs = nn.ModuleList([ nn.Sequential( nn.Conv2d(c, make_divisible(inner_channel), kernel_size=kernel_size, stride=stride, padding=padding), nn.BatchNorm2d(make_divisible(inner_channel)), nn.ReLU(inplace=True)) for c in channels_list]) self.simam = SimAM() self.fusion_conv = nn.Conv2d(len(channels_list)*make_divisible(inner_channel), out_channels=out_channels, kernel_size=1, bias=False) def forward(self, xs): outs = [] for idx, conv in enumerate(self.convs): feat = F.interpolate(xs[idx], size=(xs[-1].shape[2:]), mode='bilinear', align_corners=False) outs.append(conv(feat)) concat_features = torch.cat(outs, dim=1) simam_out = self.simam(concat_features) fused_output = self.fusion_conv(simam_out) return fused_output ``` [^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值