caffe中forward過程總結 2

2021-07-12 02:20:56 字數 2274 閱讀 7488

前面 總結的是caffe有和卷積有關的forward過程,下面我們總結一下卷積之後和全連線網路inner product layer有關的forward過程。

第一層inner product void innerproductlayer::forward_cpu(const vector*>& bottom, const vector*>& top):

這層的輸入是50x4x4,總共有800個輸入,而輸出的寬度是500,所以該層有500個神經元分別與輸入進行全連線,每個神經元都有自己的權值向量,所以關於權值就有500x800個,還有就是該層乙個batch中有64個樣本。和前面卷積層類似,我們要做的就是用一次矩陣運算,得出關於各個神經元輸入和權值矩陣相乘的結果。在caffe中矩陣的構造如下圖所示:

第乙個矩陣表示輸入資料,總共有64個50x4x4=800的資料;第二個矩陣表示權值矩陣,可以看出對於每乙個神經元,都分別有800個權值引數,而500個神經元就有800x500個權值引數;第三個矩陣就是輸出矩陣,對應乙個batch中的64個樣本,每個樣本的寬度是500。bias的矩陣運算這裡我們就不說了。

啟用函式層void relulayer::forward_cpu(const vector*>& bottom, const vector*>& top):

傳統神經網路的每一層都有乙個activation function,caffe中是把加權求和和啟用函式分為兩層,啟用函式層就比較簡單了,這一層啟用函式層的輸入是64x500,對應的輸出也是64x500,所做的運算就是用relu函式對輸入做個運算,關於為什麼選取relu函式,這有很多考慮,這裡暫且不深究。

第二層inner product void innerproductlayer::forward_cpu(const vector*>& bottom, const vector*>& top):

這層inner product的輸入寬度是500,同時有64個樣本;輸出寬度是10,同時也有64個樣本。和上面一樣,我們也想用一次矩陣運算,得到64個樣本的加權求和結果。矩陣的構造和上面也是類似的:

第乙個矩陣表示輸入,資料寬度500,總共64個樣本,所以矩陣就是64x500;第二個矩陣表示權值矩陣,該層有10個神經元,用樣,每個神經元和輸入都是全連線,所以該層的權值引數總共有500x10個;第三個矩陣就表示最後的輸出,輸出寬度為10,樣本數量為64;

啟用函式層void softmaxwithlosslayer::forward_cpu(const vector*>& bottom, const vector*>& top):

這一層的啟用函式就比較特殊,因為該層採用了softmax回歸,關於softmax在另一篇總結中有介紹,該啟用函式把該層的10個輸入看成是輸入在每個標籤上的打分,分數越高,說明輸入越有可能輸入對應的標籤;而該層的輸出是輸入輸入對應標籤上的概率,該層可以分為兩步,

第一步是利用該層的子層:softmax_layer_->forward(softmax_bottom_vec_, softmax_top_vec_)獲取輸入在對應標籤上的概率,關於輸入是如何轉化稱概率的在softmax的總結中有介紹。

第二部是求取代價函式,代價函式其實對應的就是輸入在正確標籤上的概率,只不過為了計算和後面的優化簡便取了log元算,我們的目的就是讓輸入在正確的標籤上的概率最大,程式如下:

for (int i = 0; i < outer_num_; ++i)

dcheck_ge(label_value, 0);

dcheck_lt(label_value, prob_.shape(softmax_axis_));

loss -= log(std::max(prob_data[i * dim + label_value * inner_num_ + j],

dtype(flt_min))); // cost function

++count;}}

loss就是我們最終求取的代價函式。outer_num_對應的就是我們的樣本數,意思就是我們會連續對乙個batch中的64個樣本求取代價函式,然後求取平均值作為這一次farward迭代的代價函式值。

至此,forward過程就結束了,接下來就是利用求取的代價函式再進行backward求取代價函式相對於網路中每乙個引數的梯度,然後利用梯度更新權值。本文是以lenet網路訓練為例,其他網路的forward過程和本文總結的大同小異,只是層數不同或者啟用函式不同而已。

caffe中forward過程總結(1)

感謝作者總結!caffe中最重要的兩個部分就是forward和backward的過程,farward是根據輸入資料正向 輸入屬於哪一類 backward是根據輸出的結果求得代價函式,然後根據代價函式反向求去其相對於各層網路引數的梯度的過程。我們先對farward過程做一下總結。caffe中有兩個過程...

caffe中forward過程總結(2)

感謝作者總結 第一層inner product void innerproductlayer forward cpu const vector bottom,const vector top 這層的輸入是50x4x4,總共有800個輸入,而輸出的寬度是500,所以該層有500個神經元分別與輸入進行全...

caffe中backward過程總結

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