(C1-2)注意力机制学习(TBD)

注意力机制

图像处理注意力机制Attention汇总(附代码) ⭐
暂时没有要深入学习,只是用到了SENet,不太明白为什么它是一种注意力机制方法,于是去检索学习了下,后续有必要再补充。

根据注意力权重施加的方式和位置,分为空间域通道域混合域

一、空间域

二、通道域

2.1 SENet

注意力机制论文:Squeeze-and-Excitation Networks及其PyTorch实现 ⭐

(C1-2)注意力机制学习(TBD)_第1张图片

(C1-2)注意力机制学习(TBD)_第2张图片

【深度学习】Squeeze-and-Excitation (SE) 模块优势解读

代码写法

写法一(GhostNet官方代码)

class SqueezeExcite(nn.Module):
    def __init__(self, in_chs, se_ratio=0.25, reduced_base_chs=None,
                 act_layer=nn.ReLU, gate_fn=hard_sigmoid, divisor=4, **_):
        super(SqueezeExcite, self).__init__()
        self.gate_fn = gate_fn
        reduced_chs = _make_divisible((reduced_base_chs or in_chs) * se_ratio, divisor)
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv_reduce = nn.Conv2d(in_chs, reduced_chs, 1, bias=True)
        self.act1 = act_layer(inplace=True)
        self.conv_expand = nn.Conv2d(reduced_chs, in_chs, 1, bias=True)

    def forward(self, x):
        x_se = self.avg_pool(x)
        x_se = self.conv_reduce(x_se)
        x_se = self.act1(x_se)
        x_se = self.conv_expand(x_se)
        x = x * self.gate_fn(x_se)
        return x    

写法二(构建自己的GhostNet网络(PyTorch) )

class SELayer(nn.Module):
    def __init__(self, channel, reduction=4):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
                nn.Linear(channel, channel // reduction),
                nn.ReLU(inplace=True),
                nn.Linear(channel // reduction, channel),        )
 
    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        y = torch.clamp(y, 0, 1)
        return x * y

在这里插入图片描述

2.2 SKNet

三、混合域

你可能感兴趣的:(CNN基础知识积累,深度学习,pytorch,python)