SEnet论文笔记及代码

总体介绍:

SEnet的主要思想是在图片的通道中加入注意力机制,提出了一种可应用于多种网络结构的Squeeze-and-Exitation结构(SE block)。

Squeeze and Excitation Blocks

SEnet论文笔记及代码_第1张图片
如图所示,输入矩阵X通过卷积神经网络转化为矩阵U,再使用全局平均池化将矩阵压缩为1x1xchannel的矩阵,相当于提取了每一个通道的全局特征,通道上的实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野。
之后会使用门限机制,通过两个全连接层,如下图FC → ReLU → FC → Sigmoid的流程,获取到通道间的相关信息。最后通过乘法将权重加权给每一个通道。其中第一个全连接层的通道数为C/r,r为缩放比例,用来减少计算量。再在第二个全连接层将通道数重新放大到与原来相同的大小。
在这里插入图片描述

Instantiations

在inception和ResNet中加入SE block,通常是如下图所示添加。
SEnet论文笔记及代码_第2张图片

Model and Computational Complexity

SEnet论文笔记及代码_第3张图片
文中表示,SE-ResNet的计算量主要增加在最后几层,会大约新增10%的参数,去掉最后阶段的SE block性能并没有太大的影响,而新增加的参数减少到4%。

Experiment

在各计算机视觉场景中都有较大的提升。
SEnet论文笔记及代码_第4张图片

Ablation Study

Reduction ratio(降维系数)

SEnet论文笔记及代码_第5张图片

通过实验测得r=16时的效果最好

Squeeze Operator

全局平均池化远优于全局最大池化

Intergration strategy(插入位置)

测试了四种位置的嵌入,大多效果都非常理想。
SEnet论文笔记及代码_第6张图片
SEnet论文笔记及代码_第7张图片

总结

提出了SENets,是利用了注意力机制的一种网络结构
该结构可以方便加入到其他网络中

参考文章:https://blog.csdn.net/hwl19951007/article/details/84961735
第一次写论文笔记,借鉴了很多,之后按这种格式记录读过的论文。

代码

import torch.nn as nn
import torch.nn.functional as F

class SE(nn.Module):

    def __init__(self, inchannel, ratio):
        super(SE, self).__init__()
        self.squeeze = nn.AdaptiveAvgPool2d((1, 1))
        self.compress = nn.Conv2d(inchannel, inchannel//ratio, 1, 1, 0)
        self.excitation = nn.Conv2d(inchannel//ratio, inchannel, 1, 1, 0)

    def forward(self, x):
        out = self.squeeze(x)
        out = self.compress(out)
        out = F.relu(out)
        out = self.excitation(out)
        return F.sigmoid(out)

该代码中使用1x1的卷积核代替了全连接的操作,是因为在全局平均池化操作后,矩阵形状也为1x1xc。该做法可以可以省去将张量进行降维和升维的过程。

你可能感兴趣的:(计算机视觉,深度学习,神经网络,pytorch)