1. 初識caffe
1.1. caffe相對與其他dl框架的優點和缺點:
優點:
缺點:對於某些研究方向來說的人並不適合。這個需要對caffe的結構有一定了解,(後面提到)。
1.2. caffe**層次。
回答裡面有人說熟悉blob,layer,net,solver這樣的幾大類,我比較贊同。我基本是從這個順序開始學習的,這四個類複雜性從低到高,貫穿了整個caffe。把他們分為三個層次介紹。
2.2. layer:
2.2.1. 5大layer派生型別
caffe十分強調網路的層次性,也就是說卷積操作,非線性變換(relu等),pooling,權值連線等全部都由某一種layer來表示。具體來說分為5大類layer
2.2.2. layer的重要成員函式
在layer內部,資料主要有兩種傳遞方式,
正向傳導(forward)和
反向傳導(backward)。forward和backward有cpu和gpu(部分有)兩種實現。caffe中所有的layer都要用這兩種方法傳遞資料。
virtual
void
forward
(const
vector
<
blob
<
dtype
>*>
&bottom
,vector
<
blob
<
dtype
>*>
*top)=
0;virtual
void
backward
(const
vector
<
blob
<
dtype
>*>
&top
,const
vector
<
bool
>
&propagate_down
,vector
<
blob
<
dtype
>*>
*bottom)=
0;
layer類派生出來的層類通過這實現這兩個虛函式,產生了各式各樣功能的層類。forward是從根據bottom計算top的過程,backward則相反(根據top計算bottom)。注意這裡為什麼用了乙個包含blob的容器(vector),對於大多數layer來說輸入和輸出都各連線只有乙個layer,然而對於某些layer存在一對多的情況,比如losslayer和某些連線層。在網路結構定義檔案(*.proto)中每一層的引數bottom和top數目就決定了vector中元素數目。
layers
2.2.3. layer的重要成員變數
loss
vector
<
dtype
>
loss_
;
每一層又有乙個loss_值,只不多大多數layer都是0,只有losslayer才可能產生非0的loss_。計算loss是會把所有層的loss_相加。
learnable parameters
vector
<
shared_ptr
<
blob
<
dtype
>
>
>
blobs_
;
前面提到過的,layer學習到的引數。
2.3. net:
net用容器的形式將多個layer有序地放在一起,其自身實現的功能主要是對逐層layer進行初始化,以及提供update( )的介面(更新網路引數),本身不能對引數進行有效地學習過程。
vector> > layers_;
同樣net也有它自己的
vector
<
blob
<
dtype
>*>&
forward
(const
vector
<
blob
<
dtype
>*
>
&bottom
,dtype
*loss
=null
);void
net<
dtype
>::
backward
();
他們是對整個網路的前向和方向傳導,各呼叫一次就可以計算出網路的loss了。
2.4. solver
這個類中包含乙個net的指標,主要是實現了訓練模型引數所採用的優化演算法,它所派生的類就可以對整個網路進行訓練了。
shared_ptr> net_;
不同的模型訓練方法通過過載函式computeupdatevalue( )實現計算update引數的核心功能
virtual void computeupdatevalue() = 0;
最後當進行整個網路訓練過程(也就是你執行caffe訓練某個模型)的時候,實際上是在執行caffe.cpp中的train( )函式,而這個函式實際上是例項化乙個solver物件,初始化後呼叫了solver中的solve( )方法。而這個solve( )函式主要就是在迭代執行下面這兩個函式,就是剛才介紹的哪幾個函式。
computeupdatevalue
();net_
->
update
();
至此,從底層到頂層對caffe的主要結構都應該有了大致的概念。為了集中重點介紹caffe的**結構,文中略去了大量caffe相關的實現細節和技巧,比如layer和net的引數如何初始化,proto檔案的定義,基於cblas的卷積等操作的實現(cblas實現卷積這一點我的個人主頁ganyufei
中的《caffe學習筆記5-blas與boost::thread加速》有介紹)等等就不一一枚舉了。
整體來看layer部分**最多,也反映出caffe比較重視豐富網路單元的型別,然而由於caffe的**結構高度層次化,使得某些研究以及應用(比如研究類似非逐層連線的神經網路這種複雜的網路連線方式)難以在該平台實現。這也就是一開始說的乙個不足。
另外,caffe基本資料單元都用blob,使得資料在記憶體中的儲存變得十分高效,緊湊,從而提公升了整體訓練能力,而同時帶來的問題是我們看見的一些可讀性上的不便,比如forward的引數也是直接用blob而不是設計乙個新類以增強可讀性。所以說效能的提公升是以可讀性為代價的。
最後一點也是最重要的一點,我從caffe學到了很多。第一次看的c++專案就看到這麼好的**,實在是受益匪淺,在這裡也感謝作者賈揚清等人的貢獻。
caffe中增加自己的layer
假設新增加的層命名為 new 1.在src proto的layerparameter 的 layertype下 加 new 數字 2.在src layer factory.cpp中,加 case layerparameter layertype new return new newlayer par...
caffe原始碼解析 層(layer)的註冊與管理
caffe中所有的layer都是類的結構,它們的構造相關的函式都註冊在乙個全域性變數g registry 中。首先這個變數的型別 creatorregistry是乙個map定義,public typedef shared ptr creator const layerparameter typede...
caffe中關於layer定義的筆記
很多初次閱讀caffe原始碼的同學可能不知道其中的layer具體是如何被定義的。假如我自己寫了個新的 layer,caffe是怎麼知道它的存在的呢?怎麼呼叫它的建構函式的呢?caffe為了管理各種各樣的layer,實現了叫做 工廠模式 的設計方法。它的長處是,我們在新增自己的layer時不需要修改c...