圖文+程式碼分析:caffe中全連線層、Pooling層、Relu層的反向傳播原理和實現
阿新 • • 發佈:2019-02-14
1.全連線層反向傳播
設為loss
全連線層輸入:(bottom_data)
全連線層輸出:(top_data)
假設 維度K_, 維度N_,則權值矩陣維度為N_行*K_列,batchsize=M_
全連線層每個輸出
1.1bottom_diff計算:
對bottom_data求導:(batchsize=1時)
當batchsize不為1時,需要分別獲得各個樣本下的結果,組成矩陣:
caffe實現:
1.2weight_diff計算:
對weight求導:
當batchsize不為1時,需要將各個樣本下的結果進行求和:
caffe實現:
1.3bias_diff計算:
對bias進行求導:(batchsize=1時)
當batchsize不為1時,需要分別獲得各個樣本下的結果,組成向量:
caffe實現:
2.Pooling層反向傳播
2.1 Max Pooling:
首先,在前向傳播時,在輸出新的feature map的同時,還要記錄每個輸出點對應於前一層feature map中的位置,放入mask或者top_mask中(top_mask是指,該mask存放在top_data裡當作輸出的一部分)
max pooling 前向傳播caffe實現:
在反向傳播時:將top_diff按照記錄下來的index返回到輸入層中,即只對前向傳播時選中的一些位置進行誤差傳播,如下圖:
max pooling 反向傳播caffe實現:
2.2 Average Pooling
前向傳播較簡單,block內數值的平均值作為輸出,每個輸出值對應固定的輸入block,如圖:
反向傳播,將輸出層各個位置的梯度,平均分配到其對應的輸入block中,如圖:
average pooling 反向傳播caffe實現:
3.Relu層反向傳播
由Relu定義可得其導數:
其中預設為0
則Relu反向傳播只需判斷原始輸入資料是否大於0,若大於0則將top_diff直接傳到前層,否則將top_diff乘上傳到前層,如圖:
Relu層反向傳播caffe實現: