美文网首页
Improving Convolutional Networks

Improving Convolutional Networks

作者: zelda2333 | 来源:发表于2021-05-28 15:36 被阅读0次

    论文:CVPR2020-SCNet-自校准卷积网络
    代码:https://github.com/backseason/SCNet

    Introduction:

    当前CNN网络的优化主要有两个方面:
    1.结构设计:Alext-VGG-GoogleNet-ResNet-DenseNet-ResNeXt-NasNet

    2.长距离依赖建模(注意力机制):SENet-GENet-CBAM-GCNet-GALA-AA-NLNet

    本文有设计复杂的网络体系结构来增强特征表示,而是引入了自校准卷积作为通过增加每层基本卷积变换来帮助卷积网络学习判别表示的有效方法。 类似于分组卷积,它将特定层的卷积过滤器分为多个部分,但不均匀地,每个部分中的过滤器以异构方式被利用。

    该方法具有两个优点。 首先,它使每个空间位置都能自适应地编码远距离区域的信息上下文,从而打破了在小区域(例如3x3)内进行卷积的传统。 这使我们的自校准卷积产生的特征表示更具辨识性。 在图1中,我们将ResNet生成的具有不同类型卷积的特征激活图可视化。 可以看出,具有自校准卷积的ResNet可以更准确和整体地定位目标对象。 其次,提出的自校准卷积是通用的,可以轻松应用于标准卷积层,而无需引入任何参数和复杂性开销或更改超参数。

    Method

    自校准卷积

    可简化为:

    具体如上图所示:

    1).输入X为C X H X W大小,拆分为两个C/2 X H X W大小的X1,X2;

    2).卷积核K的维度为C X C X H X W,将K分为4个部分,分别为K1,K2,K3,K4,其维度均为C/2 X C/2 X H X W;

    为了有效地并有效地收集每个空间位置的丰富的上下文信息,论文提出在两个不同的尺度空间中进行卷积特征转换:原始尺度空间中的特征图(输入共享相同的分辨率)和下采样后的较小的潜在空间(自校准) 。 利用下采样后特征具有较大的视场,因此在较小的潜在空间中进行变换后的嵌入将用作参考,以指导原始特征空间中的特征变换过程

    3)自校准尺度空间:



    对特征X1采用平均池化降采样r倍(论文r=4),K2卷积层,再进行上采样(双线性插值),经过Sigmoid激活函数对K3卷积提取后的特征进行校准得到输出特征Y1;

    4)原尺度特征空间:对特征X2经过K1卷积提取得到特征Y2;

    5)对两个尺度空间输出特征Y1,Y2进行拼接操作,得到最终输出特征Y。

    附代码:

    class SCConv(nn.Module):
        def __init__(self, planes, stride, pooling_r):
            super(SCConv, self).__init__()
            self.k2 = nn.Sequential(
                        nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r), 
                        conv3x3(planes, planes), 
                        nn.BatchNorm2d(planes),
                        )
            self.k3 = nn.Sequential(
                        conv3x3(planes, planes), 
                        nn.BatchNorm2d(planes),
                        )
            self.k4 = nn.Sequential(
                        conv3x3(planes, planes, stride), 
                        nn.BatchNorm2d(planes),
                        nn.ReLU(inplace=True),
                        )
    
        def forward(self, x):
            identity = x
    
            out = torch.sigmoid(torch.add(identity, F.interpolate(self.k2(x), identity.size()[2:]))) # sigmoid(identity + k2)
            out = torch.mul(self.k3(x), out) # k3 * sigmoid(identity + k2)
            out = self.k4(out) # k4
    
            return out
    

    相关文章

      网友评论

          本文标题:Improving Convolutional Networks

          本文链接:https://www.haomeiwen.com/subject/voussltx.html