Octave Convolution 代码详解

Octave Convolution

Facebook和新加坡国立大学联手提出了新一代替代品:OctConv(Octave Convolution),效果惊艳,用起来还非常方便。OctConv是一个即插即用的结构在提高精度的同时,节约计算资源的消耗。

(a)自然图像可以分解为低空间频率和高空间频率两部分。 
(b)卷积层的输出图也可以根据其空间频率分解和分组。 因此文章使用一个系数α将特征图显示因式分解为X^H,X^LX^L,他们分别代表特征图的高频分量和低频分量。
(c)提出的多频特征表示方法将平滑变化的低频映射存储在低分辨率张量中,以减少空间冗余。 相对于X^L来说文章中使用t=2的高斯滤波将其空间分辨率变为原来的一半。X^H,X^L不进行任何操作。
(d) Octave Convolution 操作可以直接作用于X^H,X^LX^L

注:\alpha用于平衡预测精度和计算代价。党α越大时就计算代价越小。


主要代码

文章中提到“We set \alpha _{in}=\alpha _{out}=\alpha throughout the network, apart from the first and last OctConv of the network where \alpha _{in}=0\alpha _{out}=\alpha and \alpha _{in}=\alpha, \alpha _{out}=0, respectively.”

①对于除了第一个和最后一个OctConv之外,OctConv实现如下:\alpha _{in}=\alpha _{out}=0.75。Octconv操作的结构如下图:W^{H\rightarrow H}的大小为128\times 64\times (k \times\ k)W^{H\rightarrow L}的大小为384\times 64\times (k \times\ k)W^{L\rightarrow H}的大小为128\times 192\times (k \times\ k)W^{L\rightarrow L}的大小为384\times 192\times (k \times\ k)。通过选择一个卷积核中不同部分的 参数进行使用,从而实现Octconv操作。

    def forward(self, x):
        X_h, X_l = x

        if self.stride ==2:
            X_h, X_l = self.h2g_pool(X_h), self.h2g_pool(X_l)

        X_h2l = self.h2g_pool(X_h)

# X_h2l指的是对输入进行下采样,下采样的方法时卷积核大小2×2,步长为2的平均池化。

        end_h_x = int(self.in_channels*(1- self.alpha_in))
        end_h_y = int(self.out_channels*(1- self.alpha_out))

# 假设输入的通道数为256,输出的通道数为512,alpha_in=alpha_out=0.75。那么end_h_x=64,end_h_y=128。

        X_h2h = F.conv2d(X_h, self.weights[0:end_h_y, 0:end_h_x, :,:], self.bias[0:end_h_y], 1,
                        self.padding, self.dilation, self.groups)

        X_l2l = F.conv2d(X_l, self.weights[end_h_y:, end_h_x:, :,:], self.bias[end_h_y:], 1,
                        self.padding, self.dilation, self.groups)

        X_h2l = F.conv2d(X_h2l, self.weights[end_h_y:, 0: end_h_x, :,:], self.bias[end_h_y:], 1,
                        self.padding, self.dilation, self.groups)

        X_l2h = F.conv2d(X_l, self.weights[0:end_h_y, end_h_x:, :,:], self.bias[0:end_h_y], 1,
                        self.padding, self.dilation, self.groups)

        X_l2h = F.upsample(X_l2h, scale_factor=2, **self.up_kwargs)

#低频分量的分辨率为高频分量的一般,因此需要上采样后进行计算

        X_h = X_h2h + X_l2h
        X_l = X_l2l + X_h2l

        return X_h, X_l

②第一个OctConv中 \alpha _{in}=0,因此上图的卷积结构只剩下W^{H\rightarrow H}W^{H\rightarrow L}。第一个OctConv中 \alpha _{out}=0,上图的卷积结构只剩下W^{H\rightarrow H}W^{L\rightarrow H}

论文地址:https://export.arxiv.org/pdf/1904.05049

代码参考地址:https://github.com/lxtGH/OctaveConv_pytorch

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值