Caffe學習系列(16):caffe的整體流程


     在某社區看到的回答,覺得不錯就轉過來了:http://caffecn.cn/?/question/123

Caffe從四個層次來理解:Blob,Layer,Net,Solver。

1、Blob

    Caffe的基本數據結構,用四維矩陣Batch*Channel*Height*Width表示,存儲了包括神經元的

激活值、參數、以及相應的梯度(dW,db)。其中包含有cpu_data、gpu_data、cpu_diff、gpu_diff、

mutable_cpu_data、mutable_gpu_data、mutable_cpu_diff、mutable_gpu_diff這一堆很像的東西,

分別表示存儲在CPU和GPU上的數據(印象中二者的值好像是會自動同步成一致的)。其中帶data的里面存

儲的是激活值和W、b,diff中存儲的是殘差和dW、db。另外帶mutable和不帶mutable的一對指針所指

的位置是相同的,只是不帶mutable的只讀,而帶mutable的可寫。

2、Layer

     代表神經網絡的層,由各種各樣的層來構成整個網絡。一般一個圖像或樣本會從數據層中讀進來,

然后一層一層的往后傳。除了數據層比較特殊之外,其余大部分層都包含4個函數:LayerSetUp、Reshape、

Forward、Backward。其中LayerSetup用於初始化層,開辟空間,填充初始值什么的。Reshape是對輸入

值進行維度變換,比如pooling接全連接層的時候要先拉成一個向量再計算。Forward是前向傳播,Backward是

后向傳播。

    那么數據是如何在層之間傳遞的呢?每一層都會有一個(或多個)Bottom和top,分別存儲輸入和輸出,

比如bottom[0]->cpu_data()存輸入的神經元激活值,換成top存輸出的,換成cpu_diff()存的是激活值的殘差

換成gpu是存在GPU上的數據,再帶上mutable就可寫了,這些是神經元激活值相關的,如果這個層前后有多個輸入輸出層,

就會有bottom[1],比如accuracy_layer就有兩個輸入,fc8和label。而每層的參數會存在this->blobs_里,一般this->blobs_[0]

存W,this->blobs_[1]存b,this->blobs_[0]->cpu_data()存的是W的值,this->blobs_[0]->cpu_diff()存的梯度dW,b和db也

類似,然后換成gpu是存在GPU上的數據,再帶上mutable就可寫了。

3、Net

     Net就是把各種層按train_val.prototxt的定義堆疊在一起,首先進行每個層的初始化,然后不斷進行Update,每更新一次就

進行一次整體的前向傳播和反向傳播,然后把每層計算得到的梯度計算進去,完成一次更新,這里注意每層在Backward中只是計

算dW和db,而W和b的更新是在Net的Update里最后一起更新的。而且在caffe里訓練模型的時候一般會有兩個Net,一個train一

個test。剛開始訓練網絡時前面的一大堆輸出,網絡的結構什么的也都是這里輸出的。

4、Solver

     Solver是按solver.prototxt的參數定義對Net進行訓練首先會初始化一個TrainNet和一個TestNet,然后其中的Step函數會

對網絡不斷進行迭代,主要就是兩個步驟反復迭代:①不斷利用ComputeUpdateValue計算迭代相關參數,比如計算learning rate,

把weight decay調用Net的Update函數對整個網絡進行更新。迭代中的一大堆輸出也是在這里輸出的,比如當前的loss

和learning rate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM