小菜一開始學習caffe的時候,是去網上找了一些有關caffe的介紹的資料和一些部落格,還看了caffe的建立者賈揚清對caffe的一個簡單介紹,如果英語比較好的人,你們可以去賈揚清的首頁上去看看caffe的介紹。下面介紹的内容也是小菜查找了許多部落格選了一篇比較好的部落格的内容。其他的可以看看後面的連接配接。這裡就不一一介紹了!
Caffe的全稱是:Convolutional architecture forfast feature embedding,它是一個清晰、高效的深度學習架構,它是開源的,核心語言是C++,它支援指令行、Python和Matlab接口,它既可以在CPU上運作也可以在GPU上運作。它的license是BSD 2-Clause。
Deep Learning比較流行的一個原因,主要是因為它能夠自主地從資料上學到有用的feature。特别是對于一些不知道如何設計feature的場合,比如說圖像和speech。
Caffe的設計:
基本上,Caffe follow了神經網絡的一個簡單假設----所有的計算都是以layer的形式表示的,layer做的事情就是處理一些資料,然後輸出一些計算以後的結果。比如說卷積,就是輸入一個圖像,然後和這一層的參數(filter)做卷積,然後輸出卷積的結果。
每一個layer需要做兩個計算:
Forward:是從輸入計算輸出
Backward:是從上面給的gradient來計算相對于輸入的gradient
隻要這兩個函數實作了以後,我們就可以把很多層連接配接成一個網絡,這個網絡做的事情就是輸入我們的資料(圖像或者語音或者whatever),然後來計算我們需要的輸出(比如說識别的label),在training的時候,我們可以根據已有的label來計算loss和gradient,然後用gradient來update網絡的參數,這個就是Caffe的一個基本流程。
基本上,最簡單地用Caffe上手的方法就是先把資料寫成Caffe的格式,然後設計一個網絡,然後用Caffe提供的solver來做優化看效果如何,如果你的資料是圖像的話,可以從現有的網絡,比如說alexnet或者googlenet開始,然後做fine tuning,如果你的資料稍有不同,比如說是直接的float vector,你可能需要做一些custom的configuration,Caffe的logistic regression example興許會很有幫助。
Fine tune方法:
fine tuning的想法就是說,在imagenet那麼大的資料集上train好一個很牛的網絡了,那别的task上肯定也不錯,是以我們可以把pretrain的網絡拿過來,然後隻重新train最後幾層,重新train的意思是說,比如我以前需要classify imagenet的一千類,現在我隻想識别是狗還是貓,或者是不是車牌,于是我就可以把最後一層softmax從一個4096*1000的分類器變成一個4096*2的分類器,這個strategy在應用中非常好使,是以我們經常會先在imagenet上pretrain一個網絡,因為我們知道imagenet上training的大概過程會怎麼樣。
Caffe可以應用在視覺、語音識别、機器人、神經科學和天文學。
Caffe提供了一個完整的工具包,用來訓練、測試、微調和部署模型。
Caffe的亮點:
1) 子產品化:Caffe從一開始就設計得盡可能子產品化,允許對新資料格式、網絡層和損失函數進行擴充。
2) 表示和實作分離:Caffe的模型(model)定義是用ProtocolBuffer語言寫進配置檔案的。以任意有向無環圖的形式,Caffe支援網絡架構。Caffe會根據網絡的需要來正确占用記憶體。通過一個函數調用,實作CPU和GPU之間的切換。
3) 測試覆寫:在Caffe中,每一個單一的子產品都對應一個測試。
4) (Python和Matlab接口:同時提供Python和Matlab接口。
5) 預訓練參考模型:針對視覺項目,Caffe提供了一些參考模型,這些模型僅應用在學術和非商業領域,它們的license不是BSD。
Caffe架構:
1) 資料存儲:
Caffe通過”blobs”即以4維數組的方式存儲和傳遞資料。Blobs提供了一個統一的記憶體接口,用于批量圖像(或其它資料)的操作,參數或參數更新。Models是以Google Protocol Buffers的方式存儲在磁盤上。大型資料存儲在LevelDB資料庫中。
2) 層:
一個Caffe層(Layer)是一個神經網絡層的本質,它采用一個或多個blobs作為輸入,并産生一個或多個blobs作為輸出。網絡作為一個整體的操作,層有兩個關鍵職責:前向傳播,需要輸入并産生輸出;反向傳播,取梯度作為輸出,通過參數和輸入計算梯度。Caffe提供了一套完整的層類型。
3) 網絡和運作方式:
Caffe保留所有的有向無環層圖,確定正确的進行前向傳播和反向傳播。Caffe模型是終端到終端的機器學習系統。一個典型的網絡開始于資料層,結束于loss層。通過一個單一的開關,使其網絡運作在CPU或GPU上。在CPU或GPU上,層會産生相同的結果。
4) 訓練一個網絡:
Caffe訓練一個模型(Model)靠快速、标準的随機梯度下降算法。
在Caffe中,微調(Fine tuning),是一個标準的方法,它适應于存在的模型、新的架構或資料。對于新任務,Caffe 微調舊的模型權重并按照需要初始化新的權重。
Blobs,Layers,and Nets:深度網絡的組成模式表示為資料塊工作的内部連接配接層的集合。以它自己的model模式,Caffe定義了層層(layer-by-layer)網絡。Caffe網絡定義了從低端到頂層整個model,從輸入資料到loss層。随着資料通過網絡的前向傳播和反向傳播,Caffe存儲、通信、資訊操作作為Blobs。Blob是标準陣列和統一記憶體接口架構。Blob用來存儲資料、參數以及loss。随之而來的layer作為model和計算的基礎,它是網絡的基本單元。net作為layer的連接配接和集合,網絡的搭建。blob較長的描述了layer與layer或net是怎樣進行資訊存儲和通信的。Solver是Net的求解。
Blob 存儲和傳輸:一個blob是對要處理的實際資料的封裝,它通過Caffe傳遞。在CPU和GPU之間,blob也提供同步能力。在數學上,blob是存儲連續的N維數組陣列。
Caffe通過blobs存儲和傳輸資料。blobs提供統一的記憶體接口儲存資料,例如,批量圖像,model參數,導數的優化。
Blobs隐藏了計算和混合CPU/GPU的操作根據需要從主機CPU到裝置GPU進行同步的開銷。主機和裝置的記憶體是按需配置設定。
對于批量圖像資料,blob正常容量是圖像數N*通道數K*圖像高H*圖像寬W。在布局上,Blob存儲以行為主,是以最後/最右邊的次元改變最快。例如,在一個4D blob中,索引(n, k, h, w)的值實體位置索引是((n *K + k) * H + h) * W + w。對于非圖像應用,用blobs也是有效的,如用2D blobs。
參數blob尺寸根據目前層的類型和配置而變化。
一個blob存儲兩塊記憶體,data和diff,前者是前向傳播的正常資料,後者是通過網絡計算的梯度。
一個blob使用SyncedMem類同步CPU和GPU之間的值,為了隐藏同步的詳細資訊和盡量最小的資料傳輸。
Layer計算和連接配接:Layer是模型(model)的本質和計算的基本單元。Layer卷積濾波、pool、取内積、應用非線性、sigmoid和其它元素轉換、歸一化、載入資料,計算losses。
每一個layer類型定義了三個至關重要的計算:設定、前向和反向。(1)、設定:初始化這個layer及在model初始化時連接配接一次;(2)、前向:從底部對于給定的輸入資料計算輸出并傳送到頂端;(3)、反向:對于給定的梯度,頂端輸出計算這個梯度到輸入并傳送到低端。
有兩個前向(forward)和反向(backward)函數執行,一個用于CPU,一個用于GPU。
Caffe layer的定義由兩部分組成,層屬性和層參數。
每個layer有輸入一些’bottom’blobs,輸出一些’top’ blobs.
Net定義和操作:net由組成和分化共同定義了一個函數和它的梯度。每一層輸出計算函數來完成給定的任務,每一層反向從學習任務中通過loss計算梯度.Caffe model是終端到終端的機器學習引擎。
Net是layers組成的有向無環圖(DAG)。一個典型的net開始于資料層,此layer從磁盤加載資料,終止于loss層,此layer計算目标任務,如分類和重建。
Model初始化通過Net::Init()進行處理。初始化主要做了兩件事:通過建立blobs和layers來建構整個DAG,調用layers的SetUp()函數。它也做了一系列的其它bookkeeping(簿記)的事情,比如驗證整個網絡架構的正确性。
Solver優化一個model通過首先調用forward得到輸出和loss,然後調用backward生成model的梯度,接着合并梯度到權值(weight)更新盡量減少loss.Solver, Net和Layer之間的分工,使Caffe保持子產品化和開放式發展。
Loss:在Caffe中,作為大多數機器學習,學習(learning)是通過loss函數(error, cost, or objective函數)來驅動。一個loss函數指定了學習的目标通過映射參數設定(例如,目前的網絡權值)到一個标量值。是以,學習的目标是找到最小化loss函數權值的設定。
在Caffe中,loss是由網絡的forward計算。每一個layer采用一組輸入blobs(bottom,表示輸入),并産生一組輸出blobs(top,表示輸出)。一些layer的輸出可能會用在loss函數中。對于分類任務,一個典型的loss函數選擇是SoftmaxWithLoss函數。
Loss weights:net通過許多個layers産生一個loss,loss weights能被用于指定它們的相對重要性。
按照慣例,帶有”loss”字尾的Caffe layer類型應用于loss函數,但其它layers是被假定為純碎用于中間計算。然而,任一個layer都能被用于loss,通過添加一個”loss_weight”字段到一個layer定義。
在Caffe中,最後的loss是被計算通過所有的weighted loss加和通過網絡。
Solver:
Solver通過協調網絡的前向推理和後向梯度形成參數更新試圖改善loss達到model優化。Learning的職責是被劃分為Solver監督優化和産生參數更新,Net産生loss和梯度。
Caffe solver方法:
随機梯度下降(StochasticGradient Descent, type:”SGD”);
AdaDelta(type:”AdaDelta”);
自适應梯度(Adaptive Gradient,type:”AdaGrad”);
Adam(type:”Adam”);
Nesterov’sAccelerated Gradient(type:”Nesterov”);
RMSprop(type:”RMSProp”).
Solver作用:Solver是Net的求解.
(1)、優化bookkeeping、建立learning訓練網絡、對網絡進行評估;
(2)、調用forward/backward疊代優化和更新參數;
(3)、定期評估測試網絡;
(4)、整個優化快照model和solver狀态。
Solver的每一次疊代執行:
(1)、調用網絡forward計算輸出和loss;
(2)、調用網絡backward計算梯度;
(3)、按照solver方法,采用漸變進行參數更新;
(4)、按照學習率、曆史和方法更新solver狀态。通過以上執行來獲得所有的weights從初始化到learned model.
像Caffe models,Caffe solvers也可以在CPU或GPU模式下運作。
solver方法處理最小化loss的總體優化問題。
實際的weight更新是由solver産生,然後應用到net參數。
Layer Catalogue:為了建立一個Caffe model,你需要定義model架構在一個prototxt檔案(protocolbuffer definition file)中。Caffe layers和它們的參數是被定義在protocol buffer definitions檔案中,對于Caffe工程是caffe.proto.
Vision Layers:Vision layers通常以圖像作為輸入,并産生其它圖像作為輸出:
(1)、Convolution(Convolution):卷積層通過将輸入圖像與一系列可學習的濾波進行卷積,在輸出圖像中,每一個産生一個特征圖;
(2)、Pooling(Pooling);
(3)、Local Response Normalization(LRN);
(4)、im2col;
Loss Layers:Loss驅動學習通過比較一個輸出對應一個目标和配置設定成本到最小化。Loss本身是被計算通過前向傳輸,梯度到loss是被計算通過後向傳輸:
Ø Softmax(SoftmaxWithLoss);
Ø Sum-of-Squares/Euclidean(EuclideanLoss);
Ø Hinge/Margin(HingeLoss);
Ø SigmoidCross-Entropy(SigmoidCrossEntropyLoss);
Ø Infogain(InfogainLoss);
Ø Accuracy andTop-k;
Activation/NeuronLayers:一般Activation/Neuron Layers是逐元素操作,輸入一個bottom blob,産生一個同樣大小的topblob:
Ø ReLU/Rectified-Linearand Leaky-ReLU(ReLU);
Ø Sigmoid(Sigmoid);
Ø TanH/Hyperbolic Tangent(TanH);
Ø Absolute Value(AbsVal);
Ø Power(Power);
Ø BNLL(BNLL);
Data Layers:資料輸入Caffe通過Data Layers,它們在網絡的低端。資料可以來自于:高效的資料庫(LevelDB或LMDB)、直接來自記憶體、在不注重效率的情況下,也可以來自檔案,磁盤上HDF5資料格式或普通的圖像格式:
Ø Database(Data);
Ø In-Memory(MemoryData);
Ø HDF5Input(HDF5Data);
Ø HDF5 Output(HDF5Output);
Ø Images(ImageData);
Ø Windows(WindowData);
Ø Dummy(DummyData);
Common Layers:
Ø InnerProduct(InnerProduct);
Ø Splitting(Split);
Ø Flattening(Flatten);
Ø Reshape(Reshape);
Ø Concatenation(Concat);
Ø Slicing(Slice);
Ø Elementwise Operations(Eltwise);
Ø Argmax(ArgMax);
Ø Softmax(Softmax);
Ø Mean-VarianceNormalization(MVN);
Data:在Caffe中,資料存儲在Blobs中。Data Layers加載輸入和儲存輸出通過轉換從blob到其它格式。普通的轉換像mean-subtraction和feature-scaling是通過配置datalayer來完成。新的輸入類型需要開發一個新的data layer來支援。
以上内容來自于Caffe官方網站的翻譯和一些網絡blog的整理,主要參考:
1. 《Caffe: Convolutional Architecture for Fast Feature Embedding》
2. http://caffe.berkeleyvision.org/tutorial/
3. http://suanfazu.com/t/caffe/281/3
4. http://mp.weixin.qq.com/s?__biz=MzAxNTE2MjcxNw==&mid=206508839&idx=1&sn=4dea40d781716da2f56d93fe23c158ab#rd
5. https://yufeigan.github.io/