caffe中layer層介紹

2021-07-31 21:36:42 字數 3623 閱讀 4805

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...