代码实现:https://github.com/lxtGH/OctaveConv_pytorch/tree/master/libs/nn
微信推文:https://mp.weixin.qq.com/s/sF3pPJTPk67nbDt-mR9SOw
这个代码中有用torch.nn.functiional 和用torch.nn.conv2d的两种实现方法
代码解读:
输入是x_h与x_l两个feature,AP是stride=2,kernal=2的average pooling
l2l, h2h ,l2h , h2h 四个conv的默认strde都是1,kernal size作为参数输入;alpha默认为0.5
而以上四个conv的输入输出通道数:low对应alpha* _channels , high 为_channels- int( alpha * _channels)
_channels是out_channels还是input_channels就取决于是什么转什么了
示意图
可看出代码中alpha是低频率的feature所占高+低通道数比例;高低维内互相转换是由f(X,W)操作完成的,在代码中f体现为普通的卷积;
高纬度间转换:
1.l2h经过卷积后两倍upsample
2.h2l经过stide=2,kernal=2的average pooling后卷积
技术细节:
高低维度的feature间转换的时候,因为高维的w,h是低维两倍,卷积会导致以上问题(卷积前后的特征图不能整数对其),所以高低维转换时候会有upsample和average_pooling的操作
==================================================================