GhostNet 幽靈網絡結構。keras 實現

由於疫情在家,基本沒有什麼事情幹。在看看論文在CVPR2020中我看到了一篇比較有趣的論文,大家在跑CNN網絡的時候,如果你去看一下不同通道的特徵圖,你會發現有一些特徵圖很類似,用肉眼看大家也不會覺得有什麼區別。當時對於我們這些小菜鳥來說,這也沒有什麼問題,只要我們要的結果出來就好,準確度上去就可以了。我們也不會去在意這些事,這個時候我們就和大牛體現出差距了,大牛觀察到這些問題,想到這些什麼原因,怎麼解決。在CVPR2020的這篇論文GhostNet: More Features from Cheap Operations。可以看到作者發現了這個特性,並加以了利用。

 在上面這幅圖中我們可以看到許多類似的特徵圖,上圖來自論文中。這個時候作者想到可以不可人工合成這些特徵,通過一些簡單的線性變換得到這些特徵呢,這樣大大減小了整個網絡的運算量。作者先利用卷積生成一組特徵,然後利用這一小部分特徵做簡單變換得到另一組特徵(作者把這個簡單變換後的特徵叫做原始特徵的鬼魂或者幽靈,我也不知道他爲啥取這個名字),在將這兩組特徵串聯,這樣就實現了增加特徵通道數,又不增加過多的卷積運算的效果。 

這裏的思路是很巧妙的,有時候不得不佩服大牛們的想法。一些我們習以爲常的現象他們把直接用上了。

使用keras 很容易對於上述網絡進行實現。

def slices(x,channel):
    y = x[:,:,:,:channel] 
    return y
def GhostModule(x,outchannels,ratio,convkernel,dwkernel,padding='same',strides=1,data_format='channels_last',
                use_bias=False,activation=None):
    conv_out_channel = math.ceil(outchannels*1.0/ratio)
    x = Conv2D(int(conv_out_channel),(convkernel,convkernel),strides=(strides,strides),padding=padding,data_format=data_format,
               activation=activation,use_bias=use_bias)(x)
    if(ratio==1):
        return x
    
    dw = DepthwiseConv2D(dwkernel,strides,padding=padding,depth_multiplier=ratio-1,data_format=data_format,
                         activation=activation,use_bias=use_bias)(x)
    #dw = dw[:,:,:,:int(outchannels-conv_out_channel)]
    dw = Lambda(slices,arguments={'channel':int(outchannels-conv_out_channel)})(dw)
    x = Concatenate(axis=-1)([x,dw])
    return x

我們可以把這個模塊應用到某些網絡的特定模塊裏面。從而提到網絡的準確度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章