認識Caffe與Caffe2
認識Caffe與Caffe2
目錄:
一、Caffe的作者-賈揚清
二、Caffe簡介--Caffe、Caffe2、Caffe2Go
三、認識Caffe
四、認識Caffe2
五、認識Caffe2Go
正文:(轉自:https://www.cnblogs.com/carle-09/p/9033608.html)
一、Caffe的作者-賈揚清
Caffe 作者:賈揚清,任Facebook研究科學家,曾在Google Brain工作。在AI領域有數年的研究經曆。在UC Berkeley獲得計算機科學博士學位,在清華大學獲得碩士和大學學位。對兩款流行的深度學習架構做過貢獻:Caffe的作者,TensorFlow的作者之一。
作者工作經曆:2016年2月從Google離職,加入Facebook,緻力于前沿AI研究和平台開發。2013年12月到2016年2月在Google Brain擔任研究科學家,緻力于前沿的深度學習研究和工程,參與了ImgeNet2014比賽、移動端深度學習、Google下一代AI平台TensorFlow開發、基于深度學習的産品開發和産品咨詢等。
二、Caffe簡介--Caffe、Caffe2、Caffe2Go
Caffe的全稱是:Convolutional architecture forfast feature embedding,它是一個清晰、高效的深度學習架構,它是開源的,核心語言是C++,它支援指令行、Python和Matlab接口,它既可以在CPU上運作也可以在GPU上運作。它的license是BSD 2-Clause。Deep Learning比較流行的一個原因,主要是因為它能夠自主地從資料上學到有用的feature。特别是對于一些不知道如何設計feature的場合,比如說圖像和speech。 (2.1) Caffe是一款知名的深度學習架構,由加州大學伯克利分校的賈揚清博士于2013年在Github上釋出。自那時起,Caffe在研究界和工業界都受到了極大的關注。Caffe的使用比較簡單,代碼易于擴充,運作速度得到了工業界的認可,同時還有十分成熟的社群。
(2.2) Caffe2是在2017年4月18日開幕的 F8 年度開發者大會上,Facebook 釋出的一款全新的開源深度學習架構。
(2.3) Caffe2go是一個以開源項目Caffe2為基礎、使用Unix理念建構的輕量級、子產品化架構。其核心架構非常輕量化,而且可以附加多個子產品。它是Facebook開發的一個可以在移動平台上實時擷取、分析、處理像素的深度學習架構Caffe2Go。
Caffe2釋出後,外界最多的讨論之一,就是發出”Caffe2和Caffe有何不同?”的疑問。賈揚清曾解釋過一次:“目前Caffe2還不能完全替代Caffe,還缺不少東西,例如CuDNN。與Caffe2相比,Caffe仍然是主要的穩定版本,在生産環境中使用仍然推薦Caffe”。現在Caffe2正式釋出,這個推薦應該要改成新版本了。
三、認識Caffe
對于剛開始學習深度學習的同學來說,Caffe是一款十分适合的開源架構。可其他同類型的架構,它又一個最大的特點,就是代碼和架構比較簡單,适合深入了解分析。接下來,将要介紹的内容都是Caffe中成型很久的内容,如今絕大多數版本的Caffe都包含這些功能。關于Caffe下載下傳和安裝的内容請各位根據官方網站指導進行下載下傳和安裝,這裡就不再贅述。
Caffe的設計:
基本上,Caffe 遵循了神經網絡的一個簡單假設----所有的計算都是以layer的形式表示的,layer做的事情就是處理一些資料,然後輸出一些計算以後的結果。比如說卷積,就是輸入一個圖像,然後和這一層的參數(filter)做卷積,然後輸出卷積的結果。
每一個layer需要做兩個計算:1,Forward是從輸入計算輸出。2,Backward是從上面給的gradient來計算相對于輸入的gradient。
隻要這兩個函數實作了以後,我們就可以把很多層連接配接成一個網絡,這個網絡做的事情就是輸入我們的資料(圖像或者語音等),然後來計算我們需要的輸出(比如說識别的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 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
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來支援。
四、認識Caffe2
Caffe2支援:caffe 轉caffe2模型轉caffe2模型。據Caffe2的第一個正式版本釋出時,官方介紹說:這是一個輕量化和子產品化的深度學習架構,在強調輕便性的同時,也保持了可擴充性和計算性能。
Caffe2的特性:
- Caffe2架構可以通過一台機器上的多個GPU或具有一個及多個GPU的多台機器來進行分布式訓練。 - 也可以在iOS系統、Android系統和樹莓派(Raspberry Pi)上訓練和部署模型。 - 隻需要運作幾行代碼即可調用Caffe2中預先訓練好的Model Zoo模型。 - Caffe2架構已經應用在Facebook平台上。 - NVIDIA(英偉達),Qualcomm(高通),Intel(英特爾),Amazon(亞馬遜)和Microsoft(微軟)等公司的雲平台都已支援Caffe2。 - GitHub上有Caffe2的源代碼。
Caffe2和Caffe有何不同? Caffe2釋出後,外界最多的讨論之一,就是發出上述疑問。去年12月,賈揚清曾經解釋過一次:“目前Caffe2還不能完全替代Caffe,還缺不少東西,例如CuDNN。與Caffe2相比,Caffe仍然是主要的穩定版本,在生産環境中使用仍然推薦Caffe”。 現在Caffe2正式釋出,這個推薦肯定要改成新版本了。 Caffe2的基本計算機關是Operator。對于适當數量和類型的輸入參數,每個Operator都包括所需的計算邏輯。Caffe和Caffe2的總體差異如下圖所示:
官方提供了從Caffe遷移到Caffe2的教程,據說這個遷移非常簡單。 Caffe2和PyTorch有何不同? 這是另外一個疑問。 Caffe2長于移動和大規模部署。雖然Caffe2新增了支援多GPU的功能,這讓新架構與Torch具有了相同的GPU支援能力,但是如前所述,Caffe2支援一台機器上的多個GPU或具有一個及多個GPU的多台機器來進行分布式訓練。 PyTorch适合進行研究、實驗和嘗試不同的神經網絡;而Caffe2更偏向于工業應用,而且重點關注在移動端上的表現。 賈揚清現身說法 Caffe2釋出後,作者賈揚清在reddit上連發四記解答。“Yangqing here”,賈揚清一上來就表明了身份。
有人問搞出Caffe2意義何在?現在已經有PyTorch、TensorFlow、MXNet等諸多架構。 賈揚清說Caffe2和PyTorch團隊緊密合作。他們把Caffe2視作一種生産力的選擇,而把Torch視作研究型的選擇。而在建構AI子產品時,他們也持有一種“非架構”的理念,例如Gloo、NNPACK和FAISS等可以被用于任何深度學習架構。 有人問Caffe2接受外部貢獻麼? 賈揚清說大愛外部貢獻,也會在開源方面繼續努力。 有人問Caffe2是否用了Torch的代碼庫,以及CUDA等相關支援的問題。 賈揚清說他們正在計劃讓Caffe2和Torch和PyTorch共享後端,這幾個架構已經共享Gloo用于分布式訓練,THCTensor、THNN和其他C/C++庫也将會共享。 在GPU層面,Caffe2使用了CUDA和CUDNN。賈揚清和團隊也試驗了OpenCL,但是感覺用NVIDIA的GPU CUDA效果更好。 另外在其他平台(例如iOS上),Caffe2使用了特定的工具,例如Metal。一兩天内,官方會釋出Metal的實施。 有人問Caffe2支援動态圖麼? 賈揚清給出否定的回答,他表示這是Caffe2和PyTorch團隊有意做出的選擇。Caffe2的任務就是提供最佳的性能,而如果想要極端靈活的計算,請選擇PyTorch。賈揚清認為這是一個更好的方式,因為“一個架構通吃”可能會影響性能。 是以,目前Caffe2隻支援非常有限的動态控制,例如動态RNN。 此外,功能特性:重視移動計算——Caffe2針對ARM CPU進行了優化,擁有超越機載GPU的優勢。它支援Andriod和iOS。輕量級和可擴充支援分布式計算可用于生産環境Python和C ++ API“代碼編寫一次,可到處運作”。作為一個kickstart,Caffe2還提供了内置的标準深度學習架構模型,以便任何人都可以在此基礎上進行開發,而不必從頭開始。 Facebook釋出的廣泛流行的PyTorch架構,PyTorch是專為研究建立神經網絡和實驗而開發的。Caffe2是專為移動生産環境而設計的,可以在各種移動平台上部署大規模資料。 Caffe2的承諾: 建構可用和穩定的開源庫比看起來更困難,這也是很多深度學習庫,如Tensorflow無法更新的原因之一。特别是在像深度學習這樣的熱門領域,管理開放源代碼庫是一項艱巨的任務。由于有太多的貢獻者,管理程式員們提出的要求是很乏味的,所造成的延誤反過來又會讓程式員們失望。為了解決這個問題,Caffe2開發商已經承諾更快和更透明地接受貢獻者的建議,進一步增強Caffe2。 此外,FAIR已經承諾了PyTorch和Caffe2之間的互操作性,是以可以使用Caffe2将實驗模型直接部署到移動平台上,進而滿足許多AI創業公司的願望。 但這裡要注意的是,Caffe2不支援動态圖表,因為它可能會産生移動平台目前無法支援的計算負載。
再引用:http://www.hackcv.com/index.php/archives/110/?utm_source=tuicool&utm_medium=referral 前幾天 facebook 開源的 caffe2,讓我們在深度學習架構上又多了一個選擇。caffe2 宣稱是輕量級、子產品化和可擴充的一個架構,code once,run anywhere。作為一個老 caffe 玩家,自是要好好研究一番。
依賴處理
第一版 caffe 的依賴是個讓人頭疼的事,尤其是在公司舊版的伺服器上安裝時,需要花費大量的時間折騰。伺服器的系統舊,python的版本低(2.4),直接更新可能會影響現有服務,是以隻能源碼編譯安裝各種依賴。當時比較頭疼的問題有兩個:
- 依賴裡面套着依賴:glog需要gflags,gflags需要cmake(版本低了,好像也會有問題),numpy依賴python的版本和Cython,等等。
- 解決完一台的問題,下一台還會出現新問題。
docker
當然,現在有了docker,這些都不再是問題了。但當時前前後後安裝了好多遍,又是改代碼,又是改Makefile,每次都挺麻煩。
記得當時為了簡化依賴,我還開了個坑simple_Caffe,準備做兩件事:
- 去掉依賴,有些依賴其實并不會用到,比如資料庫部分,我隻用到lmdb,就不需要leveldb和hdf5的依賴。
- 把training和inference分開,衆所周知,training是個費時費力的活,為了得到一個有效的模型,需要多台機器長時間的工作,但inference也許僅僅需要一台就夠了,而inference也僅是載入模型權重參數,建構網絡,可以對依賴做簡化的。
但後來深度學習的工作告一段落,懶癌發作,就一直沒填坑 :
現在新版的 caffe2 通過簡化依賴,按需配置,完美的解決了這些問題。在 caffe2 的檔案夾中,隻有core和proto兩個檔案夾是必須的,其他都是可配置的。而所謂的code once,run everywhere,核心就在于此。
Deep_Learning/caffe2/caffe2(master⚡)» tree -d .
.
├── binaries
├── contrib
│ ├── docker-ubuntu-14.04
│ ├── gloo
│ ├── mpscnn-fb
│ ├── nccl
│ ├── nervana
│ ├── nnpack
│ ├── prof
│ ├── snpe-fb
│ ├── torch
│ └── warpctc
├── core
├── cuda_rtc
├── db
├── distributed
├── experiments
│ ├── operators
│ └── python
├── image
├── mkl
│ └── operators
├── mpi
├── operators
├── proto
├── python
│ ├── docs
│ ├── examples
│ ├── helpers
│ ├── layers
│ ├── mint
│ │ ├── static
│ │ │ └── css
│ │ └── templates
│ ├── models
│ ├── operator_test
│ ├── predictor
│ ├── tutorial
│ └── tutorials
│ ├── experimental
│ └── images
├── queue
├── sgd
├── test
│ └── assets
└── utils
├── mkl
└── threadpool
48 directories
這樣,就可以針對不同的需求做不同的選擇,靈活性更大。
Net 組成方式
第一版的 caffe 的 Net 由粒度較粗的layer組成,即每個layer的 weight 和 bias 都以layer級别存儲,這樣做雖然簡單直覺,但有以下幾個問題:
- 針對具體平台做優化時,就會比較繁瑣,現有的代碼隻有GPU和CPU的版本,即forward_cpu,forward_gpu,如果針對arm優化,則不僅僅添加該layer的arm實作,還要修改其他地方的代碼。
- 添加新的layer實作,需要修改caffe.proto檔案,重新編譯,而且當新的layer是已有幾個layer的組合時,比如LRN layer,就由split layer、power layer和pooling layer組成,複用起來稍有複雜。
- weight 和 bias 參數和 layer 綁定在一起,finetune 也會稍顯複雜,修改Net的prototext檔案,指定哪些layer的參數保持不變,哪些layer的參數需要重新學習。
其實最後一個問題是我經常所遇到的問題,感謝開源,有很多現成的模型可以直接使用,我一般會挑選合适的模型進行finetune,很少會從零開始訓練(隻有個家用級别的GPU,也訓不起來,哈哈)。做的多了,就會想,如果可友善的方式進行finetune就好了,比如我基本都在搞分類識别,基本都會保留前幾層的卷積參數不動,用來提取中級特征,如果Net的組成方式更加靈活,不同的訓練可以載入使用相同的layer,類似與資料并行,就可以同時訓練出好幾組模型了。
新版 caffe2 的Net組成,也采用了 tensorflow、mxnet 等這些架構使用 operator 方式,由更細粒度的 operator 組合而成。當粒度變小時,可以做的優化就更多了:
- 多平台的支援變得更加容易了,operator 僅僅是處理資料的邏輯,這就可以有針對性的優化。這個優化不僅包括單個 operator 在新平台的支援,還包括多個 operator 組合的優化。
- layer 變成了 operator 的組合,剝離了 weight 和 bias 的參數,一方面生成新的 layer更加友善,另一方面也可對 weight 和 bias 控制。就像 output=f(wx+b),當把w和b都當成了參數,就可以把一個函數變成一類函數了。
- 最大的好處,我覺得還是可以聲明式的編寫神經網絡了,這個和第一版 caffe 相比,就類似使用所見即所得的方式 vs 使用latex 編寫文檔一樣。
在源碼的scripts檔案夾中,可以看到iOS、Android、Raspberry PI、windows等平台的編譯腳本,而僅僅改動幾行,就可以支援watchOS,很好很強大,具體可以看看這個Pull Request。
基礎資料 Blob
caffe2 中把 caffe 中的 Blob 進行擴充,支援了更多的類型,這就讓 Binary Net 和模型的量化壓縮變得可行。這兩個在工業界應該關注更多一些,畢竟關乎成本,它們可以讓模型在現有的 CPU 機器上可實用,進一步可以應用到手機端。目前動辄幾十、幾百MB的模型,怎麼嵌入到手機端,确實是個大問題啊(怪不得 facebook 的 iOS 端的安裝包越來越大,會不會和這個有關?哈哈)。
總結
caffe2 可以看作是 caffe 更細粒度的重構,在實用的基礎上,增加了擴充性和靈活性。作為 caffe 的重度使用者,caffe2 解決了我的好幾個痛點,後續我會從源碼角度進行深入學習,會在樹莓派上進行測試,同時我業餘也在使用 golang 進行第一版 caffe 模型的量化壓縮和可視化的研究,即 gocaffe,對這方面感興趣的朋友可以關注微網誌或者微信公衆号:hackcv,一起交流學習。
五、認識Caffe2Go
原文:code.facebook.com
Caffe2Go是一個以開源項目Caffe2為基礎、使用Unix理念建構的輕量級、子產品化架構。其核心架構非常輕量化,而且可以附加多個子產品。它是Facebook開發的一個可以在移動平台上實時擷取、分析、處理像素的深度學習架構Caffe2Go。考慮到速度是計算密集型移動應用的核心,該架構的輕量化設計讓他們可以針對特定平台上定義的操作符進行優化。Caffe2go提升了AI處理速度,讓它可以在移動終端上運作。但要實作實時性,并提供高品質、高分辨率的圖像,風格轉換模型也需要進行優化。Caffe2go是Facebook的第二個AI平台,第一個是已有的開源深度學習架構Torch。但是現在,Facebook将Caffe2go推上了戰略地位,因為“它的大小、速度和靈活性”。
引用:“随着視訊成為越來越流行的社交方式,我們希望為每個人提供最先進的創作工具來表現自己。我們最近開始在 Facebook 應用程式上測試一個新的創意效果相機,可以幫助人們即時把視訊轉換成藝術作品風格。這種技術被稱為“風格轉移”(style transfer)。它能從一種繪畫風格中提取藝術性特質,例如梵高畫的風格,并将其應用到其他圖像和視訊中。這種詭計在技術上難以實作的原因在于,它通常需要把内容發送到資料中心,然後在大型計算機伺服器上進行處理。但現在,我們在移動裝置上開發了一個新的深度學習平台,首次實作了實時的捕獲、分析,和像素處理——這一最先進的技術隻在手上就能實作。這個成熟的深度學習系統叫 Caffe2Go,它的架構現在已經嵌入我們的手機app中。通過把用于處理圖像和視訊的AI模型壓縮100倍,我們能夠在iOS和Android裝置上高效運作各種深度神經網絡。最終,我們能夠為一些移動裝置提供的AI推斷所需時間不及1/20秒,也就是50毫秒——人眨一下眼睛需要1/3秒,也就是300毫秒。
這個相機中的風格轉移工具是兩種技術的結合:Caffe2go運作庫和風格轉移模型。由于我們的AI團隊同時研究算法和大規模系統,他們開發的新模型完美實作了這兩種追求,使風格轉移既品質高又快速。這兩種技術的結合能讓你在舉起手機拍攝視訊時,感覺拿着梵高的畫筆。
這項工作開始于三個月前,當時還沒有人做這樣的研究:将基于AI的風格轉移技術視作一個創造性工具,讓它在人們的移動裝置上實時運作。跨産品、技術和研究團隊的一群人參與進這個項目。Facebook AI 研究團隊的 Justin Johnson 是有關該技術的一篇基礎研究論文的作者,為這個項目做了一些前期研究。我們的應用機器學習團隊一直緻力于開發一個可以在移動裝置上運作的AI平台。相機産品團隊對使用者的需求非常了解。還有另外許多人也為此作出了貢獻,這些團隊為在移動裝置上運作高度優化的神經網絡制作了一流的解決方案。
Caffe2Go:更輕便,更快。人工智能已經對計算機科學産生了深遠的影響,但它大部分局限于大型資料中心,這些資料中心往往遠離實際使用以AI為動力的服務的人。是以,任何标榜能“實時”用AI處理某物的技術仍然受到延遲的影響,因為資料必須發送到資料中心,以在GPU上運作。我們也認為讓人們随身帶着超級計算機是不切實際的,是以我們試圖找到一種方法,讓AI能在最無處不在的裝置——智能手機上的CPU上工作。
手機能夠實時地看、說、了解,而無需連接配接到遠端伺服器,但它們也有局限性。雖然近年來手機的計算能力有了顯著的提升,每秒能夠執行數十億次數學運算,但它們仍受到諸如功率、存儲器、計算能力等的各種資源限制,需要更聰明的軟體設計。是以,對機器學習系統來說,手機既是機會也是挑戰。
我們應對這個挑戰的方案是設計一個非常輕量級,而且子產品化的架構。為此,我們在開源Caffe2項目之上利用Unix原理。這確定了連接配接元件的核心架構非常輕量,而且能夠附加多個子產品——包括專門為移動裝置進行的優化。我們使用一個精益算法架構,允許工程師将抽象運算描述為一個有向無環圖(DAG),同時確定圖中可以執行的這些節點的輸入和輸出沒有被強加限制。這讓我們的工程團隊能夠在不同平台上實作并優化子產品,同時能輕松地把這些子產品連接配接起來。當DAG實際運作時,它能利用各種硬體功能最快地實作具現化。
由于速度是計算密集型移動應用程式的核心,尤其是圖像和視訊應用,架構設計的輕量能讓我們為已定義的運算符執行平台特定的優化。一個著名的例子是Caffe2內建在我們的移動運作庫中的名為NNPack的庫。利用移動CPU的NEON功能,我們能顯著提高移動計算的速度。在 iOS裝置上,我們還開始內建加速功能,例如Metal語言。所有這些都是通過子產品化設計完成的,無需改變正常模型定義。是以,算法端和運作庫端能夠安全地彼此依賴,不需要擔心任何潛在的不相容性。
友好的開發環境:Caffe2也是我們的第一個具有産業實力的深度學習平台,可以在四個平台上用同樣的代碼集全速運作:伺服器CPU,GPU,iOS和Android。由于子產品化設計,架構可以使用相同的語言,但要分别在各個平台上優化。這是一個對開發者隐藏的實作細節,例如,架構可以在手機(iOS和Android)的NNPack和伺服器GPU的CUDNN之間選擇。是以,開發者可以專業于算法的工作,而不用研究怎樣運作卷積。
開發者還能從最新的設計部署中獲益。從開發者的角度看,縮減手機的運作時間是一個難題,因為手機的工具鍊并不像桌上型電腦和伺服器那樣強大。我們通過壓縮神經網絡以比對硬體來解決這一問題。Caffe2go 中一個序列化的網絡在手機和伺服器上都能實作相同的輸出。最終,我們能把主要的工作轉移到伺服器環境中,模型訓練、性能觀察、使用者體驗研究等。如果一切進展順利,我們僅需要設定一個按鈕,就能再轉移到手機環境中。
風格轉換模型訓練:風格轉換的概念并不新鮮,最早提出是在2015年8月的一篇會議論文 A Neural Algorithm for Artistic Style。但是,當時的技術處理速度極慢并且要求強大的伺服器。論文發表後的幾個月,圈内的研究員提升了這一技術并且把速度提升了好幾個次元,但是,對計算能力依然有很高的要求。
Caffe2go 把這一AI處理過程變得更快,并且在手持裝置上就能完成。但是,風格轉化模型依然要進行優化,來保證體驗可以實時進行,同時保持好品質、高分辨率的圖像。
有效模型尺寸優化:傳統的風格轉化研究模型(即使是前饋變量)都是很大的(指的是參數的數量),并且很慢。我們的目标是建立一個風格轉換應用,能運作新的、更小的同時更有效的模型,來生成高品質的視訊,視訊能達到20FPS,能在iphone6或以上的裝置中運作,并且避免掉幀。
我們采用了三個主要的方法,來縮減模型的尺寸,我們對卷積層數量進行了優化(這是處理過程最消耗時間的部分),也對每一層的寬度進行了優化,在處理過程中,我們還調整了空間分辨率。通過調整需要處理的圖像特征數量,或者調整單獨的處理行為所需要的時間,卷積網絡層的數量和它們的寬度能在獨立的層級使用,進而調整處理所需要的時間。
對于空間分辨率,我們能調整實際的尺寸,也就是在中間層中被處理的那些。通過使用早期池化(縮減被處理的圖像的尺寸)以及後來的去卷積(在處理後放大圖像),我們能加速處理時間,因為系統需要處理的資訊變少了。我們還發現,有了這些技術,我們能極大地縮減訓練網絡的寬度和深度,同時又能確定圖像品質維持在合理的水準。
手機上進行神經網絡訓練:圖像的品質是非常主觀的,并且非常難以衡量,特别是在風格遷移之類的任務上。是以,我們開發了可視化工具,其中包括A/B測試,訓練了不同的模型,來保證我們能得到最佳的圖像品質結果。我們使用的由FBLearner Flow 支援的大型GPU叢集,讓我們可以實作這一目标,因為我們可以快速地掃過大範圍的超參數,比如模型架構、内容/風格權重和縮減采樣,進而發現一個經過良好訓練的回饋風格,能夠滿足我們的性能目标,同時又切實保持并提升了圖檔的品質。
還有很多提升品質的方法,比如,采用即時的标準化而不是常用的分批标準化,能夠在許多風格上産生有益影響。比如,卷積層中避免零填充(zero padding)進而減少棋盤效應(人工痕迹),或者,在風格或者内容圖檔上采用不同的預訓練和後處理過濾層。
風格轉化技術中實作的速度和品質優化結果在Caffe 2 架構上運作,能夠打造一個手機上的實時圖像處理系統。
Caffe2go是Facebook 機器學習産品的核心,将開源。Caffe2go ,加上研究工具鍊比如Torch組成了Facebook 機器學習産品的核心。因為其大小、速度和靈活性上的優勢,我們正在Facebook 的stack 中全面推廣Caffe2go。
我們也非常樂意與整個研究社群分享我們的軟體和設計,這樣我們就能更好地學習如何利用不同硬體平台和算法設計的獨有特性,這對于跨平台機器學習系統來說尤為重要。我們将會在接下來的幾個月内,部分開源這一AI架構。
随着我們不斷進步,你可以想象,可以在(移動)裝置上運作的實時AI技術将能幫助這個世界變得更加開放,讓人與人之間的聯系得以加強,特别是在無障礙和教育等領域。可以拿在手上的智能裝置将會持續地改變我們對智能的定義。擁有像Caffe2go這樣靈活、輕便的學習系統,我們一定會帶來更多美妙的AI和AR體驗,比如,在拍下一個視訊後,你可以立即把它轉換成梵高的風格。”
【. . . . . .本部落格僅作個人生活、工作、學習等的日常記錄。說明: (1) 内容有參考其他部落客、網頁等,有因“懶”直接粘貼來,會備注出處。若遇雷同,或忘備注,并無故意抄襲之意,請諸“原主”諒解,很感謝您的辛勤"筆記"可供本人參考學習。 (2) 如遇同行,有參考學習者,因個人學識有限,不保證所寫内容完全正确。您對本博文有任何的意見或建議,歡迎留言,感謝指正。 (3) 若您認為本主的全部落格還不錯,可以點選關注,便于互相學習。 (4) 感謝您的閱讀,希望對您有一定的幫助。歡迎轉載或分享,但請注明出處,謝謝。. . . . . .】 【轉自: Carole0904 ; 出處: https://www.cnblogs.com/carle-09/ 】