注意力机制SENet:一种即插即用的通道注意力模块

SENet是一种深度学习网络结构,它通过全局平均池化和全连接层计算特征层权重,利用Sigmoid函数限制权重在0-1之间。在PyTorch中,可以使用nn.Sequential方便地构建SENet模型,自动按顺序执行各层操作。

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

一、SENet

  1. 对特征层进行全局平均池化(高度和宽度上),获得一个深度为C2的特征长条
  2. 通过两个全连接层,第一个全连接层输出缩减维度/r,第二个全连接层输出还原维度
  3. 最后通过一个Sigmoid函数,获取每个特征层的权值 0—1之间
  4. 对原特征层的每一层进行加权并返回

在这里插入图片描述

二、SENet的pytorch实现

class senet(nn.Module):
    def __init__(self, channel, ratio=16):
        super(senet, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1) #全局平均池化
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // ratio, False),
            nn.ReLU(),
            nn.Linear(channel // ratio, channel, False),
            nn.Sigmoid(),  # 用于将每个元素压缩到0---1之间
        )
    def forward(self, x):
        b, c, h, w = x.size()
        # 全局平均池化 b,c,h,w----->b,c,1,1
        avg = self.avg_pool(x).view([b, c])
        # 将平均池化后的结果输入全连接 通过sigmoid得到每一个层的权重大小
        fc = self.fc(avg).view([b, c, 1, 1])
        return x * fc  # 将特征层 和 每一层相乘加权

三、学到的一些其他知识

在继承nn.Sequential的类中,不需要显式地重写forward方法
因为当调用nn.Sequential的实例的forward方法时,它会按照模块的顺序依次调用每个模块的forward方法,将输入数据传递给每个模块,并返回最终的输出。

import torch
import torch.nn as nn
class MyNetwork(nn.Sequential):
    def __init__(self):
        super(MyNetwork, self).__init__(
            nn.Linear(10, 20),
            nn.ReLU(),
            nn.Linear(20, 30),
            nn.ReLU()
        )
# 使用自定义网络类
model = MyNetwork()
input = torch.randn(1, 10)
output = model(input)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值