0
点赞
收藏
分享

微信扫一扫

分组卷积、SEnet模块、CBAM模块

mjjackey 2022-02-25 阅读 117

分组卷积、SEnet、CBAM模块

分组卷积、SEnet模块、CBAM模块

一、分组卷积

1、分组卷积的目的

分组卷积的目的是:类似于并行计算,通过分组卷积,降低参数的个数,从而提高模型效果。

2、分组卷积的过程

在高阶卷积部分我们简单的介绍了分组卷积机动原理,这里我们详细的看一看,我们还是从下图进行分析:
在这里插入图片描述
上面的图片中,左边的是传统的卷积机制,右边的是分组卷积机制,我们对比着看
首先你要有如下概念,这个概念贯穿分组卷积的全过程,说多少遍也不为过。

我们先来看左边的,常规的卷积过程:
左边的是输入,右边的是输出,输入输出的H,W相同
分析卷积的过程,计算出参数的个数使我们的目的:

接下来,我们再看分组卷积的过程:
首先你要知道,所谓的分组分的是谁?

  • 是把原图即输入按照通道切分成g组。

同样,左边的是输入,右边的是输出,输入输出的H,W相同,但是这里我们定义了一个新的参数

分析卷积的过程,计算出参数:

两种卷积方式的参数对比可得,分组卷积的参数个数仅仅为不分组的1/g,降低了参数的个数。

二、SEnet

SEnet相当于一个模块,这个模块可以嵌入到任何一个网络结构中,下面我们就来看一下这个模块都能作什么是事情。
简单的来书,就是行提高通道注意力上来提高模型效果。

已经有很多工作在空间维度上来提升网络的性能,那么很自然的想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?
我们的工作就是基于这一点并提出Squeeze-and-Excitation Networks(简称SENet)。在我们提出的结构中Squeeze和Excition是两个非常关键的操作,所以我们以此来命名。
我们的机动是希望显示的建模特征通道之间的相互依赖的关系。另外,我们不打算引入一个新的空间维度来进行特征通道之间的融合,而是采用一种全新的特征重标定策略,具体的说:就是通过学习的方式来自动获取到每个特征通道的重要程度,然后通过这个重要程度取提升有用的特征并抑制对当前任务用处不大的特征

在这里插入图片描述

下面看一下代码的实现,会更明白一些,这里是

看代码:

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(True),
            nn.Linear(channel // reduction,channel,bias=False),
            #归一化映射到0~1
            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)

然后就是怎们把这个模块添加到网络中:作为网络中的一个组件放到网络中去

三、CBAM

根据SEnet又有人做出了改进,产生了CBAM,他据他又是什么样的机制呢。

他和SEnet很像,不同的是他的目的是保留的是空间上的维度,消除深度(通道),第一步操作时,他是对每一个通道进行两个池化,均值和最大值池化,这样池化以后就得到了2通道的特征,且特征的空间维度不变,然后在对这两个通道做一个1x1的卷积,目的是压缩通道,编程单通道。在作为组件添加到网络中,具体还是看代码。

举报

相关推荐

0 条评论