如何在MXNet中使用channel Dropout (Dropout2d)

在很多實際使用場景下,特別是語義分割等輸出像素級預測結果的全卷積神經網絡中,經常會使用到隨機drop特徵圖維度的操作。在Pytorch中,可以直接使用torch.nn.Dropout2d實現相應功能。然而在MXNet中可能略顯麻煩。

查閱MXNet文檔並不能直接找到所需的信息,因爲Dropout模塊被定義爲了最基礎版本的、隨機drop數組中任意元素的功能。唯一可能與需求相關的參數’axes’,其定義過於晦澀,無法理解。
在這裏插入圖片描述

而在更加“友好”的Gluon文檔中,對應模塊的解釋仍然令人費解。簡單查閱文檔後仍不知道如何設置該參數。
在這裏插入圖片描述

爲了實現drop某個channel的功能,當輸入特徵爲4維的時候(NxCxHxW),mx.sym.Dropout應該這樣使用:

import mxnet as mx
import numpy as np
a=np.array([1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8]).reshape([2,2,2,2])
b=mx.sym.Variable('b')
ctx=mx.cpu()
d=mx.sym.Dropout(p=0.1, axes=(0,2,3))
e=d.simple_binc(ctx, b=a.shape)
e.forward(is_train=True, b=a)

此時輸出結果爲

[
[[[[ 0.  0.]
   [ 0.  0.]]
  [[10. 12.]
   [14. 16.]]]
[[[[ 0.  0.]
   [ 0.  0.]]
  [[10. 12.]
   [14. 16.]]]]

可以多執行幾次forward函數,從而驗證結果。此時該Dropout滿足了所需功能。

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