2021-05-12 14:32:11
Caffe基礎介紹
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來支援。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-11/124915.htm
相關文章