RTFSC | Caffe 源碼閱讀 (其一)

建議安裝scitools套裝的understand對(duì)源碼進(jìn)行閱讀凛辣。可以對(duì)整個(gè)工程的代碼進(jìn)行解析后以整個(gè)工程都可以快速地jump to definition相赁。以及可以對(duì)整體代碼進(jìn)行更近一步的解析衷戈。反正無(wú)比好用侨拦,墻裂推薦。

Overview

Overview

我們今天主要講一下layers的源碼

layers

layers overview

我們發(fā)現(xiàn)每一種layer都分成.cpp和.cu兩種赠幕。其實(shí)很好理解俄精,.cpp的是cpu版本的,.cu是cuda版本的榕堰。

conv_layer.cpp

我們先來(lái)看看INSTANTIATE_CLASS(ConvolutionLayer);這個(gè)宏操作干了什么

INSTANTIATE_CLASS

簡(jiǎn)要介紹一下這個(gè)宏操作涉及的##(concatenate)和template specialization.

宏操作##

簡(jiǎn)單來(lái)說(shuō)就是把signal的字符鏈接起來(lái)
舉個(gè)例子

#define cat(a, b) a##b

辣么

printf("%d\n", cat(a,1));

就等價(jià)于

printf("%d\n", a1);

template instantiation

我們使用template的時(shí)候?qū)嶋H上是implicitly實(shí)例化了template的一個(gè)class嘀倒,然而我們也有explicit version.

類似于

template class SampleClass<int>;

注意區(qū)別于template specialization.(模板類/函數(shù)特化是定義在規(guī)定了特定typename的template的定義)

好吧其實(shí)這些都沒(méi)什么卵用。我們其實(shí)更在乎Forward和Backward局冰。

總所周知,CNN主要有一個(gè)end to end的過(guò)程,遵循bp網(wǎng)絡(luò)的定義灌危,有forward也有backward康二。我們來(lái)簡(jiǎn)單看看這個(gè)forward和backward的過(guò)程應(yīng)該怎么寫

CPU version

forward
cpu forward

計(jì)算forward的被分成了兩個(gè)部分。實(shí)際上就是

o = w*i + b

第一部分的w*i對(duì)應(yīng)的就是

this->forward_cpu_gemm(bottom_data + n * this->bottom_dim_, 
          weight, top_data + n * this->top_dim_);

第二部分(bias)對(duì)應(yīng)的就是

if (this->bias_term_) { 
    const Dtype* bias = this->blobs_[1]->cpu_data(); 
    this->forward_cpu_bias(top_data + n * this->top_dim_, bias);
}

出于好奇我們?cè)龠M(jìn)一步看看這兩個(gè)函數(shù)是怎么做的

cpu_gemm cpu_bias

首先介紹一下什么是im2col
http://www.zhihu.com/question/28385679

相當(dāng)于把運(yùn)算分解成兩部勇蝙,首先第一步把矩陣變成一個(gè)一個(gè)的col沫勿,然后再相乘。特別的當(dāng)矩陣是1x1的時(shí)候或者需要skip im2col的時(shí)候(后面一個(gè)什么鬼我還不太清楚味混,總之一般情況下先理解第一個(gè))不需要im2col(廢話)产雹。

為什么要這么做呢?
相當(dāng)于卷積被分解成了

o = col2im(w*im2col(i)) + b)

為什么要這么做呢翁锡?
好求導(dǎo)奥凇!
可以參考
http://zhangliliang.com/2015/02/11/about-caffe-code-convolutional-layer/
(啥時(shí)候才能趕上人家的水平馆衔。瘟判。。角溃。

至于細(xì)節(jié)部分拷获,我想講講我在閱讀中有困難的地方,那就是維數(shù)的問(wèn)題减细。在conv_layer.cpp部分中匆瓜,其實(shí)只是用到了batch_size那一個(gè)維度以及之前和多少個(gè)前面的層連接。沒(méi)有涉及到后面三維ChannelxWeightxHeight未蝌。

而在后面的部分驮吱,使用了im2col把WxH兩個(gè)維度壓成一個(gè)維度V, 于是就有了CxV的一個(gè)矩陣。convolution網(wǎng)絡(luò)層的參數(shù)大小是C_bottom(上一層channel數(shù))xC_top(輸出channel數(shù))树埠,正好對(duì)應(yīng)一個(gè)矩陣乘法糠馆。

接下來(lái)forward部分的代碼屬于很好理解但是文字不好表述的部分(各種offset以及矩陣乘法函數(shù)的各種參數(shù)等等)。所以就不贅述了怎憋。

backward
backward

結(jié)構(gòu)和forward類似又碌。由于backward的原因應(yīng)該考慮top的size九昧。

backward_cpu_gemm backward_cpu_bias

有了上面所說(shuō)的,其實(shí)這一步也是通過(guò)im2col把卷積變成全連接層的形式毕匀,類似于普通o=ai+b進(jìn)行求導(dǎo)铸鹰。

GPU version

外層的套路和CPU version幾乎是一樣的

conv_layer.cu
gpu_gemm gpu_bias
gpu_gemm gpu_bias

Titan X 3000多個(gè)核心呢。皂岔。蹋笼。≡甓猓快得飛起來(lái)剖毯,一般Caffe的網(wǎng)絡(luò)GPU都是CPU的30倍左右。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末教馆,一起剝皮案震驚了整個(gè)濱河市逊谋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌土铺,老刑警劉巖胶滋,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異悲敷,居然都是意外死亡究恤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門后德,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)部宿,“玉大人,你說(shuō)我怎么就攤上這事瓢湃】呱停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵箱季,是天一觀的道長(zhǎng)涯穷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)藏雏,這世上最難降的妖魔是什么拷况? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮掘殴,結(jié)果婚禮上赚瘦,老公的妹妹穿的比我還像新娘。我一直安慰自己奏寨,他們只是感情好起意,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著病瞳,像睡著了一般揽咕。 火紅的嫁衣襯著肌膚如雪悲酷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天亲善,我揣著相機(jī)與錄音设易,去河邊找鬼。 笑死蛹头,一個(gè)胖子當(dāng)著我的面吹牛顿肺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渣蜗,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屠尊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了耕拷?” 一聲冷哼從身側(cè)響起知染,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斑胜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嫌吠,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡止潘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辫诅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凭戴。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炕矮,靈堂內(nèi)的尸體忽然破棺而出么夫,到底是詐尸還是另有隱情,我是刑警寧澤肤视,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布档痪,位于F島的核電站,受9級(jí)特大地震影響邢滑,放射性物質(zhì)發(fā)生泄漏腐螟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一困后、第九天 我趴在偏房一處隱蔽的房頂上張望乐纸。 院中可真熱鬧,春花似錦摇予、人聲如沸汽绢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宁昭。三九已至跌宛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間久窟,已是汗流浹背秩冈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斥扛,地道東北人入问。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稀颁,于是被迫代替她去往敵國(guó)和親芬失。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Caffe GitHub頁(yè)面 1. Caffe目錄結(jié)構(gòu) data/用于存放下載的訓(xùn)練數(shù)據(jù)docs/ 幫助文檔exa...
    sixfold_yuan閱讀 1,671評(píng)論 3 14
  • 很實(shí)用的編程英語(yǔ)詞庫(kù)匾灶,共收錄一千五百余條詞匯棱烂。 第一部分: application 應(yīng)用程式 應(yīng)用、應(yīng)用程序app...
    春天的蜜蜂閱讀 1,351評(píng)論 0 22
  • 一阶女、總體流程 caffe主要有四個(gè)功能模塊颊糜。 a) Blob 主要用來(lái)表示網(wǎng)絡(luò)中的數(shù)據(jù),包括訓(xùn)練數(shù)據(jù)秃踩,網(wǎng)絡(luò)各層自身...
    人生若離閱讀 3,120評(píng)論 0 1
  • 計(jì)算機(jī)英語(yǔ)(編程詞匯大全) application 應(yīng)用程式 應(yīng)用衬鱼、應(yīng)用程序 application framew...
    朱森閱讀 595評(píng)論 0 1
  • //作者:JRZAlan //備注:第一次做簡(jiǎn)書(shū),希望能對(duì)大家起到幫助。 這是對(duì)一些計(jì)算機(jī)編程語(yǔ)言的一些英語(yǔ)單詞,...
    JRZAlan閱讀 16,848評(píng)論 0 77