認識Caffe與Caffe2php
目錄:css
1、Caffe的做者-賈揚清python
2、Caffe簡介--Caffe、Caffe二、Caffe2Gogit
3、認識Caffe程序員
4、認識Caffe2github
5、認識Caffe2Gogolang
正文:算法
1、Caffe的做者-賈揚清docker
Caffe 做者:賈揚清,任Facebook研究科學家,曾在Google Brain工做。在AI領域有數年的研究經歷。在UC Berkeley得到計算機科學博士學位,在清華大學得到碩士和本科學位。對兩款流行的深度學習框架作過貢獻:Caffe的做者,TensorFlow的做者之一。數據庫
做者工做經歷:2016年2月從Google離職,加入Facebook,致力於前沿AI研究和平臺開發。2013年12月到2016年2月在Google Brain擔任研究科學家,致力於前沿的深度學習研究和工程,參與了ImgeNet2014比賽、移動端深度學習、Google下一代AI平臺TensorFlow開發、基於深度學習的產品開發和產品諮詢等。
2、Caffe簡介--Caffe、Caffe二、Caffe2Go
(2.3) Caffe2go是一個以開源項目Caffe2爲基礎、使用Unix理念構建的輕量級、模塊化框架。其核心架構很是輕量化,並且能夠附加多個模塊。它是Facebook開發的一個能夠在移動平臺上實時獲取、分析、處理像素的深度學習框架Caffe2Go。
Caffe2發佈後,外界最多的討論之一,就是發出」Caffe2和Caffe有何不一樣?」的疑問。賈揚清曾解釋過一次:「目前Caffe2還不能徹底替代Caffe,還缺很多東西,例如CuDNN。與Caffe2相比,Caffe仍然是主要的穩定版本,在生產環境中使用仍然推薦Caffe」。如今Caffe2正式發佈,這個推薦應該要改爲新版本了。
3、認識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來支持。
4、認識Caffe2
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),直接升級可能會影響現有服務,因此只能源碼編譯安裝各類依賴。當時比較頭疼的問題有兩個:
docker
固然,如今有了docker,這些都再也不是問題了。但當時前先後後安裝了好多遍,又是改代碼,又是改Makefile,每次都挺麻煩。
記得當時爲了簡化依賴,我還開了個坑simple_Caffe,準備作兩件事:
但後來深度學習的工做告一段落,懶癌發做,就一直沒填坑 :
如今新版的 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級別存儲,這樣作雖然簡單直觀,但有如下幾個問題:
其實最後一個問題是我常常所遇到的問題,感謝開源,有不少現成的模型能夠直接使用,我通常會挑選合適的模型進行finetune,不多會從零開始訓練(只有個家用級別的GPU,也訓不起來,哈哈)。作的多了,就會想,若是可方便的方式進行finetune就行了,好比我基本都在搞分類識別,基本都會保留前幾層的卷積參數不動,用來提取中級特徵,若是Net的組成方式更加靈活,不一樣的訓練能夠載入使用相同的layer,相似與數據並行,就能夠同時訓練出好幾組模型了。
新版 caffe2 的Net組成,也採用了 tensorflow、mxnet 等這些框架使用 operator 方式,由更細粒度的 operator 組合而成。當粒度變小時,能夠作的優化就更多了:
在源碼的scripts文件夾中,能夠看到iOS、Android、Raspberry PI、windows等平臺的編譯腳本,而僅僅改動幾行,就能夠支持watchOS,很好很強大,具體能夠看看這個Pull Request。
基礎數據 Blob
caffe2 中把 caffe 中的 Blob 進行擴展,支持了更多的類型,這就讓 Binary Net 和模型的量化壓縮變得可行。這兩個在工業界應該關注更多一些,畢竟關乎成本,它們可讓模型在現有的 CPU 機器上可實用,進一步能夠應用到手機端。目前動輒幾10、幾百MB的模型,怎麼嵌入到手機端,確實是個大問題啊(怪不得 facebook 的 iOS 端的安裝包愈來愈大,會不會和這個有關?哈哈)。
總結
caffe2 能夠看做是 caffe 更細粒度的重構,在實用的基礎上,增長了擴展性和靈活性。做爲 caffe 的重度用戶,caffe2 解決了個人好幾個痛點,後續我會從源碼角度進行深刻學習,會在樹莓派上進行測試,同時我業餘也在使用 golang 進行初版 caffe 模型的量化壓縮和可視化的研究,即 gocaffe,對這方面感興趣的朋友能夠關注微博或者微信公衆號:hackcv,一塊兒交流學習。
5、認識Caffe2Go
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體驗,好比,在拍下一個視頻後,你能夠當即把它轉換成梵高的風格。」