Attention
一、在图像处理中,注意力机制分为空间、通道注意力。
- 空间注意力机制:绝对于一个层 \(H*W\)而言,关注其中重要(权重高)的特色点
- 通道注意力机制:能够将 \(C*H*W \)通过均匀池化将 \(H*W\)稀释为 1 *1,最终造成 \(1*1*C\)线性特征向量,进而关注其中重要的通道(权重高)
二、罕用的注意力机制模块
-
SENet 模块
1. 介绍:这里是独自应用通道注意力机制。2017 年提出的 SENet 是最初一届 ImageNet 比赛的冠军,其实现示意图如下所示。对于 SENet 模块,其重点是取得输出进来的特色层的每一个通道 C 的权值。利用 SENet,咱们能够让网络关注它最须要关注的通道。
2. 代码实现(pytorch)import torch from torch import nn class senet(nn.Module): def __init__(self, channel, ratio=16): super(senet, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) # 全局均匀池化操作,将 H * W 降维为 1 *1 self.fc = nn.Sequential( # 两个线性层 nn.Linear(channel, channel // ratio, False), nn.ReLU(), nn.Linear(channel // ratio, channel, False), nn.Sigmoid(),) def forward(self, x): b, c, h, w = x.size() # b, c, h, w -> b, c, 1, 1 -> b, c avg = self.avg_pool(x).view(b, c) # b, c -> b, c //ratio -> b, c -> b, c, 1, 1 fc = self.fc(avg).view(b, c, 1, 1) print(fc) # 留神,这里的张量相乘是必须要两个张量的维度是对应雷同才行,不同局部只能是 1。# 例如此处的是:2*512*26*26 和 2 *512*1* 1 张量之间的乘积 # torch.Size([4, 4, 2])能够和 torch.Size([4, 1, 1])乘积 return x * fc model = senet(512) print(model) inputs = torch.ones([2, 512, 26, 26]) outputs = model(inputs) # print(outputs)
- CBAM 模块
1. 概要介绍:这里是将通道注意力机制和空间注意力机制联合应用。成果比 SENet 好,其实现示意图如下所示。
2. 具体介绍:将通道注意力机制和空间注意力机制别离开展。
通道注意力机制:示意图如下,首先将输出的特色图 \(C*H*W\)别离对每个通道的 \(H*W\)进行最大池化和均匀池化解决,生成一维张量 \(C*1*1\);之后别离通过线性层 Shared MLP(和 SENet 一样,第一层对 C 降维,第二层复原成输出时的 C 维);最初将通过线性层的两者相加并通过 \(Sigmoid\)函数失去通道注意力输入后果 \(M_c\)。
空间注意力机制:示意图如下,首先对通过通道注意力机制优化后的特色图进行通道的均匀池化和最大值池化操作,让通道转化为 1,行将 \(C*H*W\)转化为 \(1*H*W\);之后将最大池化和均匀池化的后果进行重叠,失去 \(2*H*W\);最初利用通道数为 1 的卷积层调整通道数为 1(H 和 W 不变)并取 \(Sigmoid\)函数失去每个特色点的权重,失去空间注意力机制输入后果 \(M_s\)
3. 代码实现(pytorch)