Squeeze-and-Excitation Networks
摘要
卷积神经网络建立在卷积运算的基础上,通过融合局部感受野内的空间信息和通道信息来提取信息特征。为了提高网络的表示能力,许多现有的工作已经显示出增强空间编码的好处。在这项工作中,我们专注于通道,并提出了一种新颖的架构单元,我们称之为“Squeeze-and-Excitation”(SE)块,通过显式地建模通道之间的相互依赖关系,自适应地重新校准通道式的特征响应。通过将这些块堆叠在一起,我们证明了我们可以构建SENet架构,在具有挑战性的数据集中可以进行泛化地非常好。关键的是,我们发现SE块以微小的计算成本为现有的最先进的深层架构产生了显著的性能改进。SENets是我们ILSVRC 2017分类提交的基础,它赢得了第一名,并将top-5
错误率显著减少到2.251%,相对于2016年的获胜成绩取得了∼25%的相对改进。
第一点:SE模块
其实简单来说:通过池化层和卷积操作,作为每个通道上的权重,相乘。
SE块是一个计算单元,它可以建立在转换FTR映射输入到特征映射上。 在下面的表示法中,我们将FTR看作一个卷积算子,并使用来表示所学习的一组滤波器核,其中vc指的是c-th滤波器的参数。 然后,我们可以将输出写入,其 中
是一个2D空间核,表示一个vc的单通道,作用于x的相应通道。
Squeeze:全局信息嵌入(其实就是个池化操作)
Excitation:自适应重新校正(FC(WZ)之后时候激活函数)
特征映射和对应通道的乘积
第二点:模型应用
第三点:模型代码
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)
#print("x.shape:",x.shape)
#print("y.expand_as(x).shape:",y.expand_as(x).shape)
return x * y.expand_as(x)
# #d打印网络结构及参数和输出形状
from torchsummary import summary
net = SELayer(64)
summary(net, input_size=(64,128,128)) #summary(net,(3,250,250))