1. 程式人生 > >圖文+程式碼分析:caffe中全連線層、Pooling層、Relu層的反向傳播原理和實現

圖文+程式碼分析:caffe中全連線層、Pooling層、Relu層的反向傳播原理和實現

1.全連線層反向傳播

C為loss
全連線層輸入:(bottom_data) a
全連線層輸出:(top_data) z
假設 a維度K_, z維度N_,則權值矩陣維度為N_行*K_列,batchsize=M_
全連線層每個輸出zi=b+jwijaj

1.1bottom_diff計算:

對bottom_data求導:Caj=iCziziaj=iziwij(batchsize=1時)
當batchsize不為1時,需要分別獲得各個樣本下的結果,組成矩陣:
bottom_diff計算矩陣實現示意圖
caffe實現:

1.2weight_diff計算:

對weight求導:Cwij=Cziziwij=ziaj
當batchsize不為1時,需要將各個樣本下的結果進行求和:
weight_diff計算矩陣實現示意圖
caffe實現:

1.3bias_diff計算:

對bias進行求導:Cb=iCzizib=izi(batchsize=1時)
當batchsize不為1時,需要分別獲得各個樣本下的結果,組成向量:
bias_diff計算矩陣實現示意圖
caffe實現:

2.Pooling層反向傳播

2.1 Max Pooling:

MaxPooling前向傳播示意圖
首先,在前向傳播時,在輸出新的feature map的同時,還要記錄每個輸出點對應於前一層feature map中的位置,放入mask或者top_mask中(top_mask是指,該mask存放在top_data裡當作輸出的一部分)
max pooling 前向傳播caffe實現:

在反向傳播時:將top_diff按照記錄下來的index返回到輸入層中,即只對前向傳播時選中的一些位置進行誤差傳播,如下圖:
MaxPooling反向傳播示意圖
max pooling 反向傳播caffe實現:

2.2 Average Pooling

前向傳播較簡單,block內數值的平均值作為輸出,每個輸出值對應固定的輸入block,如圖:
AveragePooling前向傳播示意圖


反向傳播,將輸出層各個位置的梯度,平均分配到其對應的輸入block中,如圖:
AveragePooling反向傳播示意圖
average pooling 反向傳播caffe實現:

3.Relu層反向傳播

由Relu定義可得其導數:

f(x)={xx>0αxx0,f(x)={1x>0αx0
其中α預設為0
則Relu反向傳播只需判斷原始輸入資料是否大於0,若大於0則將top_diff直接傳到前層,否則將top_diff乘上α傳到前層,如圖:
Relu層前向和反向傳播示意圖
Relu層反向傳播caffe實現: