深度學習之最大池化操作的實現

2021-10-05 11:12:39 字數 1470 閱讀 6400

在darknet框架中(c語言實現),max pooling實現方式如下:

void

forward_maxpool_layer

(const maxpool_layer l, network net)

} l.output[out_index]

= max;

l.indexes[out_index]

= max_i;}}

}}}

其中,函式的引數意義如下:

maxpool_layer:池化層(包含layer層的輸出)

network:網路結構(包含layer層的輸入)

下面逐步分析**:

int w_offset =

-l.pad;

// max pooling層可能會進行padding,因此在後續計算座標點時需要考慮偏移量

int h_offset =

-l.pad;

int h = l.out_h;

// 輸出特徵圖的寬、高和通道數

int w = l.out_w;

int c = l.c;

for

(b =

0; b < l.batch;

++b)

}

這裡兩個迴圈是為了找到輸出點out_index對應的輸入特徵圖上的區域中的最大值,其中,輸入特徵圖也是乙個1d tensor,因此輸入位置由index計算得到。

l.output[out_index]

= max;

l.indexes[out_index]

= max_i;

最後對輸出位置賦值即可。l.indexes記錄了該點是從輸入特徵圖上的哪個點計算得到的,在反向傳播的時候使用。

void

backward_maxpool_layer

(const maxpool_layer l, network net)

}

池化過程的反向傳播較為簡單。

l.indexes記錄了輸出特徵圖每個點的**,因此遍歷l.indexes,在輸入特徵圖上對應點的的梯度敏感度(或者說係數)為1,直接將反向傳回來的梯度累加即可。(累加的原因是:在池化過程中,可能池化區域重合,輸出特徵圖上多個點可能都是由該點計算而來,因此反向傳播過程中,該點的梯度應該累加)

補,關於池化過程的梯度如何回流:

例如2*2池化,輸入4個點,則輸出為1個點,該點對應的梯度在回流過程中,僅傳給4個點中最大的那個點(因為輸出的點是由該點得到的);平均池化中,梯度平均分給四個點。

海思平台部署深度學習模型之最大池化層替換策略

華為的海思平台有一套自己的深度學習推理框架nnie,可實現在邊緣端硬體實現深度學習模型的部署,一般的部署套路是從訓練框架的模型轉到onnx模型,再轉到caffe模型,然後由caffe模型轉到nnie的wk模型。由於nnie所支援的運算元列表有限,經常會發生caffe nnie轉換過程中報錯的現象。筆...

深度學習池化

在卷積神經網路中,我們經常會碰到池化操作,而池化層往往在卷積層後面,通過池化來降低卷積層輸出的特徵向量,同時改善結果 不易出現過擬合 為什麼可以通過降低維度呢?因為影象具有一種 靜態性 的屬性,這也就意味著在乙個影象區域有用的特徵極有可能在另乙個區域同樣適用。因此,為了描述大的影象,乙個很自然的想法...

卷積池化計算 深度學習

卷積後輸出大小 w 影象寬,h 影象高,d 影象深度 通道數 f 卷積核寬高,n 卷積核 過濾器 個數 s 步長,p 用零填充個數 卷積後輸出影象大小 width w f 2p s 1 height h f 2p s 1 卷積後輸出影象深度 d n 輸出影象大小 width,height,n wei...