歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Caffe基礎介紹

Caffe基礎介紹

日期:2017/2/28 13:56:41   编辑:Linux教程

Caffe的全稱應該是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,它是開源的,核心語言是C++,它支持命令行、Python和Matlab接口,它既可以在CPU上運行也可以在GPU上運行。它的license是BSD 2-Clause。

Deep Learning比較流行的一個原因,主要是因為它能夠自主地從數據上學到有用的feature。特別是對於一些不知道如何設計feature的場合,比如說圖像和speech。

Caffe的設計:基本上,Caffe follow了神經網絡的一個簡單假設----所有的計算都是以layer的形式表示的,layer做的事情就是take一些數據,然後輸出一些計算以後的結果,比如說卷積,就是輸入一個圖像,然後和這一層的參數(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)定義是用Protocol Buffer語言寫進配置文件的。以任意有向無環圖的形式,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(簿記)的事情,比如驗證整個網絡架構的正確性。

Model格式:The models are defined in plaintext protocol buffer schema(prototxt) while the learned models are serialized as binary protocol buffer(binaryproto) .caffemodel files. The model format is defined by the protobufschema in caffe.proto.

Forward and Backward:Forward inference, Backward learning.

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方法:隨機梯度下降(Stochastic Gradient Descent, type:”SGD”);AdaDelta(type:”AdaDelta”);自適應梯度(Adaptive Gradient,type:”AdaGrad”);Adam(type:”Adam”);Nesterov’s Accelerated 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文件(protocol buffer 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是被計算通過後向傳輸:

(1)、Softmax(SoftmaxWithLoss);(2)、Sum-of-Squares/Euclidean(EuclideanLoss);(3)、Hinge/Margin(HingeLoss);(4)、SigmoidCross-Entropy(SigmoidCrossEntropyLoss);(5)、Infogain(InfogainLoss);(6)、Accuracy andTop-k。

Activation/NeuronLayers:一般Activation/Neuron Layers是逐元素操作,輸入一個bottom blob,產生一個同樣大小的top blob:

(1)、ReLU/Rectified-Linearand Leaky-ReLU(ReLU);(2)、Sigmoid(Sigmoid);(3)、TanH/Hyperbolic Tangent(TanH);(4)、Absolute Value(AbsVal);(5)、Power(Power);(6)、BNLL(BNLL)。

Data Layers:數據輸入Caffe通過Data Layers,它們在網絡的低端。數據可以來自於:高效的數據庫(LevelDB或LMDB)、直接來自內存、在不注重效率的情況下,也可以來自文件,磁盤上HDF5數據格式或普通的圖像格式:

(1)、Database(Data);(2)、In-Memory(MemoryData);(3)、HDF5Input(HDF5Data);(4)、HDF5 Output(HDF5Output);(5)、Images(ImageData);(6)、Windows(WindowData);(7)、Dummy(DummyData).

Common Layers:(1)、InnerProduct(InnerProduct);(2)、Splitting(Split);(3)、Flattening(Flatten);(4)、Reshape(Reshape);(5)、Concatenation(Concat);(6)、Slicing(Slice);(7)、Elementwise Operations(Eltwise);(8)、Argmax(ArgMax);(9)、Softmax(Softmax);(10)、Mean-VarianceNormalization(MVN)。

Data:在Caffe中,數據存儲在Blobs中。Data Layers加載輸入和保存輸出通過轉換從blob到其它格式。普通的轉換像mean-subtraction和feature-scaling是通過配置data layer來完成。新的輸入類型需要開發一個新的data layer來支持。

Copyright © Linux教程網 All Rights Reserved