Octave Convolution 代码详解

Octave Convolution

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

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

注:Octave Convolution 代码详解用于平衡预测精度和计算代价。党α越大时就计算代价越小。

Octave Convolution 代码详解


主要代码

文章中提到“We set Octave Convolution 代码详解 throughout the network, apart from the first and last OctConv of the network where Octave Convolution 代码详解Octave Convolution 代码详解 and Octave Convolution 代码详解, Octave Convolution 代码详解, respectively.”

①对于除了第一个和最后一个OctConv之外,OctConv实现如下:Octave Convolution 代码详解。Octconv操作的结构如下图:Octave Convolution 代码详解的大小为Octave Convolution 代码详解Octave Convolution 代码详解的大小为Octave Convolution 代码详解Octave Convolution 代码详解的大小为Octave Convolution 代码详解Octave Convolution 代码详解的大小为Octave Convolution 代码详解。通过选择一个卷积核中不同部分的 参数进行使用,从而实现Octconv操作。

Octave Convolution 代码详解

    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中 Octave Convolution 代码详解,因此上图的卷积结构只剩下Octave Convolution 代码详解Octave Convolution 代码详解。第一个OctConv中 Octave Convolution 代码详解,上图的卷积结构只剩下Octave Convolution 代码详解Octave Convolution 代码详解

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

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