SENet(Squeeze-and-Excitation Network)注意力机制

  SENet(Squeeze-and-Excitation Network)是一种用于深度卷积神经网络(CNN)的注意力机制,旨在增强网络在特征通道上的表示能力。它通过学习每个通道的重要性权重,然后使用这些权重来重新加权特征图,从而增强有用信息的表示,抑制不相关信息。
在这里插入图片描述

  下面是详细介绍SENet注意力机制的步骤:
  1. Squeeze(压缩)阶段
在这个阶段,对输入的特征图进行全局平均池化,以压缩通道维度。假设输入特征图为 X,形状为 (C, H, W),其中 C 是通道数,HW 分别是高度和宽度。全局平均池化会得到一个大小为 (C, 1, 1) 的张量。
z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) z{}_{c}={{F}_{sq}}\left( {{u}_{c}} \right)=\frac{1}{H\times W}\sum\limits_{i=1}^{H}{\sum\limits_{j=1}^{W}{{{u}_{c}}\left( i,j \right)}} zc=Fsq(uc)=H×W1i=1Hj=1Wuc(i,j)
  2. Excitation(激励)阶段
  在这个阶段,通过一个两层的全连接网络来学习通道的重要性权重。这个全连接网络由一个压缩操作和一个激励操作组成。
  a. 压缩操作:将上一步中得到的 (C, 1, 1) 的张量输入到一个全连接层,将通道数压缩到一个较小的值,称为 middle_channels
  b. 激励操作:将压缩后的特征输入到一个 ReLU 激活函数,得到一个 (middle_channels,) 的向量。
s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) s={{F}_{ex}}\left( z,W \right)=\sigma \left( g\left( z,W \right) \right)=\sigma \left( {{W}_{2}}\delta \left( {{W}_{1}}z \right) \right) s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z))
  3. 重标定(Re-calibration)阶段
  将上一步中得到的激励向量扩展为 (C, 1, 1) 的张量,与原始特征图 X 逐元素相乘,从而获得每个通道上的加权特征图。
X c ∼   = F s c a l e ( u c , s c ) = s c ⋅ u c \overset{\sim}{\mathop{{{X}_{c}}}}\,={{F}_{scale}}\left( {{u}_{c}},{{s}_{c}} \right)={{s}_{c}}\cdot {{u}_{c}} Xc=Fscale(uc,sc)=scuc
  以下是用 PyTorch 实现的示例代码:

import torch
import torch.nn as nn

class SEBlock(nn.Module):
    def __init__(self,in_channels,ratio):
        super(SEBlock, self).__init__()
        middle_channels=in_channels//ratio
        self.squeeze=nn.AdaptiveAvgPool2d(1)
        self.excitation = nn.Sequential(
            nn.Conv2d(in_channels, middle_channels, kernel_size=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(middle_channels, in_channels, kernel_size=1),
            nn.Sigmoid()
        )

    def forward(self, x):
        # Squeeze phase
        squeezed = self.squeeze(x)
        print("Squeezed shape:", squeezed.shape)
        # Excitation phase
        weights = self.excitation(squeezed)
        print("Excitation weights shape:", weights.shape)
        # Re-calibration phase
        output = x * weights
        print("Output shape:", output.shape)
        return output

if __name__ == '__main__':
    model=SEBlock(64,8)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)
    input_tensor=torch.randn(1,64,224,224).to(device)
    output_tensor=model(input_tensor)

  这段代码定义了一个名为 SEBlock 的模块,用于在给定的输入特征图上应用SENet注意力机制。在创建模型时,你可以将这个模块插入到你的卷积神经网络中,以增强特征表示能力。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Make_magic

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

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

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

打赏作者

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

抵扣说明:

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

余额充值