代碼實現: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的操作
==================================================================