CNN中的反向傳播

數學家是我理想 2021-08-15 21:13:34 阅读数:951

本文一共[544]字,预计阅读时长:1分钟~
cnn 反向

這是我參與8月更文挑戰的第15天,活動詳情查看: 8月更文挑戰

Pooling層的反向傳播

我們知道Pooling操作會使得feature map的尺寸發生變化,假如做 2 × 2 2\times 2 的池化,假設 l + 1 l+1 層的feature map有16個梯度,那麼第 l l 層應該需要64個梯度,做法很簡單,只需要把1個像素的梯度反向傳給4個像素即可,但是要保證傳遞的梯度總和不變。由於有這條原則,因此avg pooling和max pooling的反向傳播並不相同

1. avg pooling

avg pooling的前向傳播就是把一個patch(窗口)內的值求和取平均。那麼反向傳播的過程就是把某個元素的梯度等分成n份,分配給前一層,這樣就保證了池化前後的梯度之和保持不變,還是比較好理解的,圖示如下

avg pooling比較容易讓人理解錯的地方就是以為梯度直接複制N遍,但是這樣會造成loss之和變為原來的N倍,網絡會發生梯度爆炸

2. max pooling

max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳給後一層,而其他像素的值直接被舍弃掉。那麼反向傳播也就是把這個梯度直接傳給前一層某一像素,兒其它像素不接受梯度,也就是0。max pooling和avg pooling操作的不同點在於需要記錄池化時,到底哪個像素的值是最大的,也就是max_id,這個可以看caffe的源碼的pooling_layer.cpp,下面是caffe框架max pooling部分的源碼

// If max pooling, we will initialize the vector index part
if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX
&& top.size() == 1) {
max_idx_.Reshape(bottom[0]->num, channels_, pooled_height_, pooled_width_);
}
複制代碼

源碼中有一個名為max_idx_的變量,這個變量記錄的就是最大值所在的比特置,因為在反向傳播中要用到。前向傳播和反向傳播的過程如下圖所示

版权声明:本文为[數學家是我理想]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815211248074f.html