caffe中backward過程總結

2021-08-04 04:20:49 字數 1921 閱讀 7811

感謝樓主總結!

backward是利用代價函式求取關於網路中每個引數梯度的過程,為後面更新網路引數做準備。求取梯度的過程也是乙個矩陣運算的過程,後面會有詳細介紹,本身求取梯度的過程並不是很複雜,而且網路中的各層求取梯度的過程都是相似的。下面就按照backward的執行順序,從最後一層向前介紹caffe的backward的過程。

softmax with loss layer:

按理說每一層應該都要求一層梯度,其中包括對權值,對輸入資料,對偏置分別求取梯度。但是在softmax with loss layer這一層求取梯度的一些過程被省去了,首先這一次只是乙個啟用函式層,沒有權值和偏置引數,然後我們只需要對輸入資料求取梯度,softmax with loss layer的輸入資料其實表示的是原始輸入資料相對於各個標籤的打分,而對於代價函式對這個輸入的梯度已經有專門的迭代演算法來求解。參考:

caffe中的程式對應如下:

for(

inti = 0; i < outer_num_; ++i)   

} else

}  }  // scale gradient

dtype loss_weight = top[0]->cpu_diff()[0] /  

get_normalizer(normalization_, count);  

caffe_scal(prob_.count(), loss_weight, bottom_diff);  

inner product layer:

這是一層全連線層,包含權值,偏置引數,所以在這一層我們要求3個梯度值,第一是對偏置求取梯度,第二是對權值求取梯度,第三是對輸入資料求取梯度,其中對輸入資料求取的梯度和前面類似會反向傳播到前一層。

relu layer:

這一層是inner product layer的啟用函式層,caffe把每層網路的加權求和和啟用函式分成兩層網路來對待,在這層函式裡面由於沒有權值和偏置,所以我們也只是需要對輸入資料求取梯度即可。而由於啟用函式採用的是relu函式,所以對輸入求取梯度也比較簡單,我們利用的結果就是softmax with loss layer層求取的梯度結果進行鏈式求導的,程式如下:

if(propagate_down[0])   

}  

inner product layer:

這一層和前面說的類似,也是乙個全連線層,要分別對權值,偏置,輸入分別求取梯度,其中對輸入引數的梯度會反向傳播到前一層。

pooling layer:

下取樣層根據下取樣方式的不同,求取梯度的方式也不同,對於pooling層,只需要對輸入引數求梯度即可,poling層是沒有權值和偏置引數的。然後再把梯度反向傳播給前一層。在lenet中,pooling層採用的下取樣方法是poolingparameter_poolmethod_max,即在pooling核區域選取乙個最大值作為下取樣的畫素值。那麼對於輸入求取梯度就很容易了,即對輸入的梯度其實就是輸出梯度中對應位置的梯度。關於這個位置資訊是在forward過程中儲存起來的。

convlution layer:

卷積層包含權值引數,偏置引數,所有對卷積層的梯度計算包含計算對權值的梯度,對偏置的梯度,對輸入引數的梯度,同樣對輸入引數的梯度也會反向傳播到前一層中。

pooling layer:

這一層和上面類似,這裡不再介紹。

convolution layer:

該層是對原始輸入資料做第一次卷積,所以這裡只對權值引數和偏置引數計算梯度,而輸入引數就不用計算梯度了,因為這已經是第一層,輸入是原始畫素了,所以也就不需要進行反向傳播了。該層的輸入是28x28的原始畫素,輸出是20個24x24的卷積後的影象,卷積核的大小是5x5。

caffe中的backward理解

1.在本質上backward解決的是導數計算的問題,用的就是bp演算法,所謂的bp演算法就是使用當前層權重對於當前誤差加權然後傳遞到下層節點的乙個流程。下圖是caffe的doc中示意的,這裡面有兩部分,乙個部分就是向下傳遞的對於g的偏導數,這個數值就是反向傳播的輸出 另外一部分就是在當前層中對於當前...

對Pytorch中backward()函式的理解

寫在第一句 這個部落格解釋的也很好,參考了很多 pytorch中的自動求導函式backward 所需引數含義 所以切入正題 backward 函式中的引數應該怎麼理解?官方 如果需要計算導數,可以在tensor上呼叫.backward 1.如果tensor是乙個標量 即它包含乙個元素的資料 則不需要...

虛擬環境python3中安裝caffe過程

一 安裝依賴 sudo apt install no install recommends libboost all dev 在 python 下啟動虛擬環境,在虛擬環境下安裝一些需要的庫。執行 for req in cat requirements.txt do pip install req d...