一.Squeeze-and-Excitation Network(SE-NET)
思路:让神经网络使用全局信息来增强有用的信息,同时抑制无用的信息。
假设::
其中,,
,
令,每一个
为一个filter kernel
于是 ,,其中
代表卷积运算,此处忽略了bias。
即长为H‘,宽为W’,通道数为C‘的X进入一个block,输出一个长为H,宽为W,通道数为C的U。
Squeeze阶段:
即对输入的u做global avg. pooling,输出z,这个阶段相当于从U中提取一些全局的信息。
Excitation阶段:
,其中
,
即将上一步输出的z通过两个fully connected layer,第一个layer用ReLU激活,第二个layer用sigmoid 激活,得到s,最后将s和u相乘得到所需的输出。因为s的值域是0-1,所以s和u相乘后,没有用的信息就趋近于0,保留有用的信息。
与其他架构的整合:
这个block是可以与其他的架构进行整合的,如下图所示,左边是一个ResNet Module,右边是添加了SE block的ResNet Module。
核心代码:
#来自知乎pprp
from torch import nn
class SELayer(nn.Module):
def __init__(self, channel, reduction=16):
super(SELayer, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(channel, channel // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(channel // reduction, channel, bias=False),
nn.Sigmoid()
)
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)
return x * y.expand_as(x)