从ResNet到SENet:pytorch-image-models中的注意力机制引入

从ResNet到SENet:pytorch-image-models中的注意力机制引入

【免费下载链接】pytorch-image-models huggingface/pytorch-image-models: 是一个由 Hugging Face 开发维护的 PyTorch 视觉模型库,包含多个高性能的预训练模型,适用于图像识别、分类等视觉任务。 【免费下载链接】pytorch-image-models 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models

在图像识别领域,模型性能的提升往往源于关键技术的突破。ResNet(残差网络)通过引入跳跃连接解决了深层网络训练难题,而SENet(Squeeze-and-Excitation Networks)则在此基础上增加了注意力机制,进一步提升了模型对重要特征的捕捉能力。本文将以pytorch-image-models库为例,解析从ResNet到SENet的演进过程,重点介绍注意力机制的引入方式及实现细节。

ResNet的基础架构

ResNet的核心创新是残差块(Residual Block),通过跳跃连接(Skip Connection)缓解梯度消失问题。在pytorch-image-models中,ResNet的实现位于timm/models/resnet.py,其基础模块分为BasicBlockBottleneck两种。

Bottleneck为例,其结构包含三个卷积层:

class Bottleneck(nn.Module):
    expansion = 4
    def __init__(self, inplanes, planes, stride=1, downsample=None, ...):
        # 1x1卷积降维
        self.conv1 = nn.Conv2d(inplanes, first_planes, kernel_size=1, bias=False)
        self.bn1 = norm_layer(first_planes)
        # 3x3卷积提取特征
        self.conv2 = nn.Conv2d(
            first_planes, width, kernel_size=3, stride=stride, 
            padding=first_dilation, dilation=first_dilation, groups=cardinality, bias=False
        )
        self.bn2 = norm_layer(width)
        # 1x1卷积升维
        self.conv3 = nn.Conv2d(width, outplanes, kernel_size=1, bias=False)
        self.bn3 = norm_layer(outplanes)
        # 跳跃连接
        self.downsample = downsample

SENet的注意力革命

SENet在ResNet基础上引入了通道注意力机制,通过动态调整各特征通道的权重提升模型性能。其核心模块SEModule位于timm/layers/squeeze_excite.py,实现分为三个步骤:

1. Squeeze(压缩)

对特征图进行全局平均池化,将空间信息压缩为通道描述符:

x_se = x.mean((2, 3), keepdim=True)  # 输出形状:[N, C, 1, 1]

2. Excitation(激励)

通过全连接层学习通道权重:

self.fc1 = nn.Conv2d(channels, rd_channels, kernel_size=1)  # 降维
self.fc2 = nn.Conv2d(rd_channels, channels, kernel_size=1)  # 升维
x_se = self.fc1(x_se)
x_se = self.act(self.bn(x_se))
x_se = self.fc2(x_se)

3. 特征重标定

通过Sigmoid激活生成权重,并与原特征相乘:

return x * self.gate(x_se)  # gate通常为Sigmoid

从ResNet到SENet的代码演进

在pytorch-image-models中,通过在ResNet的Bottleneck模块中嵌入SEModule实现SENet。关键修改位于timm/models/resnet.pyBottleneck类:

class Bottleneck(nn.Module):
    def __init__(self, ..., attn_layer=None, ...):
        # 原有卷积层定义...
        self.se = create_attn(attn_layer, outplanes)  # 创建SE注意力模块

    def forward(self, x):
        # 原有卷积计算...
        if self.se is not None:
            x = self.se(x)  # 插入SE模块
        x += shortcut
        x = self.act3(x)
        return x

attn_layer='se'时,create_attn函数会实例化SqueezeExcite类,完成注意力机制的注入。

性能对比与应用场景

根据results/results-imagenet.csv数据,在ImageNet数据集上:

  • ResNet-50 Top-1准确率约76.1%
  • SE-ResNet-50 Top-1准确率提升至79.8%

注意力机制尤其适合细粒度图像分类(如物种识别)、医学影像分析(病灶区域定位)等场景。在实际应用中,可通过以下代码快速加载预训练模型:

import timm
model = timm.create_model('seresnet50', pretrained=True)  # 加载SE-ResNet-50

总结与扩展

从ResNet到SENet的演进展示了注意力机制在视觉任务中的强大潜力。pytorch-image-models库还实现了更多变体,如:

  • ECA-Net:高效通道注意力
  • CBAM:融合通道与空间注意力

通过组合不同注意力模块,开发者可根据任务需求定制高性能模型。建议通过timm/models/_registry.py查看完整模型列表,探索更多可能性。

本文代码基于pytorch-image-models最新版本,完整实现可参考仓库源码。实际应用时建议结合train.pyvalidate.py脚本进行模型训练与评估。

【免费下载链接】pytorch-image-models huggingface/pytorch-image-models: 是一个由 Hugging Face 开发维护的 PyTorch 视觉模型库,包含多个高性能的预训练模型,适用于图像识别、分类等视觉任务。 【免费下载链接】pytorch-image-models 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值