Caffe的简介、依赖、框架
1. 官網介紹
1. Caffe
Caffe是一個以表達式、速度和模塊化為核心的深度學習框架,由BLVC(Berkeley Vision and Learning Center)和社區貢獻者開發。項目創建者是賈揚清。
2. Feature
- Expressive architecture
具有表現力的結構鼓勵應用和創新。模型及優化是通過配置定義的,而不是使用硬編碼的方式。可以在GPU和CPU之間無縫切換,可以用GPU訓練,然后部署到集群或移動設備上。
- Extensible code
具有擴展性的代碼促進了Caffe的積極發展。Caffe第一年fork超過一千次,有許多有意義的貢獻和反饋。由于眾多的貢獻者,Caffe框架跟蹤并實現了當前最新的代碼和模型。
- Speed
快速性使Caffe適合研究實驗和工業開發。Caffe在單個的NVIDIA K40 GPU上每天能處理6千萬張圖片。識別時速度為1ms/張,訓練時速度為4ms/張,BLVC相信Caffe具有最快的卷積神經網絡實現。
- Community
Caffe已經支持學術研究項目,啟動原型,甚至支持大規模視覺、語音和多媒體的工業應用。
3. Document
- DIY Deep Learning for Vision with Caffe
一個介紹Caffe的PPT
- Tutorial Documentation
實踐指導和框架參考
- Installation instructions
安裝,已經在Ubuntu,Red Hat,OS X上測試過了。
- Model Zoo
模型規范及已經訓練的模型
- API Documentation
API文檔,通過代碼中的注釋生成的。
4. Demo
- ImageNet tutorial
在ImageNet上訓練和測試CaffeNet。
- LeNet MNIST Tutorial
Yann LeCun的手寫字符識別,訓練和測試。
- CIFAR-10 tutorial
CIFAR-10數據集上Caffe的訓練與測試。
- Fine-tuning for style recognition
ImageNet上訓練的CaffeNet在Flickr Style數據集上的調優。
- Feature extraction with Caffe C++ code
用Caffe工具提取CaffeNet和AlexNet特征。
- CaffeNet C++ Classification example
用底層API進行圖像的簡單分類
- Web demo
運行在Flask web服務器上的圖像分類Demo
- Siamese Network Tutorial
在MNIST數據集上訓練和測試siamese網絡。
5. NoteBook Demo
- Image Classification and Filter Visualization
通過預先訓練的模型進行圖像實時識別,對神經網絡的每層特征和參數進行可視化,可以了解可視化的神經網絡接口。
- Learning LeNet
使用Python定義、訓練、測試經典的LeNet。
- Fine-tuning for Style Recognition
在新數據集上對ImageNet上訓練的CaffeNet進行調優。
- Off-the-shelf SGD for classification
使用Caffe作為一般的SGD優化器在非圖像的HDF5數據上訓練邏輯回歸。
- Multilabel Classification with Python Data Layer
使用Python數據層在PASCAL VOC上進行多標簽分類。
- Editing model parameters
怎樣修改神經網絡,手動改變模型參數來進行定制化使用。
- R-CNN detection
在Python中使用預先訓練的模型作為檢測器來進行目標檢測。
- Siamese network embedding
提取特征、繪制Siamese網絡嵌入。
6. Philosophy
- Expression
模型和優化都是通過純文本模式定義的而不是通過代碼的方式。
- Speed
對于研究和工業而言,在最新的模型和大規模數據上具有同樣的速度是關鍵。
- Modularity
新任務及設置要求靈活性和可擴展性
- Openness
科學和應用進展需要通用的代碼、參考模型和再現性。
- Community
學術研究、啟動原型和工業應用通過在BSD-2項目中的聯合討論和開發實現所有共享。
7. Tour
- Net,Lays and Blobs
Caffe模型的結構組成
- Forward/Backward
分層結構模型的基本計算
- Loss
通過損失函數定義要學習的任務
- Solver
求解程序協調模型優化
- Layer Catalogue
這一層是建模和計算的基本單元,Caffe的目錄包含最新模型的層
- Interfaces
命令行,Python,MATLAB
- Data
怎樣將模型輸入變為Caffe能處理的數據
- Caffeinated Convolution
Caffe怎樣計算卷積
2. 普通介紹
1. Caffe介紹
在深度學習領域,Caffe框架是人們無法繞過的一座山。Caffe是一個用C++編寫的深度學習框架,作者是UC Berkeley博士賈揚清,Caffe。由于Caffe清晰、高效,因此在深度學習中被廣泛使用,用戶逐漸地也形成了一個開放的社區,一些重要的研究成果(主要是各種模型)被引入到了Caffe中,例如著名的AlexNet。?
Caffe無論在結構、性能上,還是在代碼質量上,都是一款非常出色的開源框架。它將深度學習的每一個細節都原原本本地展現出來,大大降低了人們學習、研究和開發的難度。
Caffe是純粹的C++/CUDA架構,支持命令行、Python和MATLAB接口。Caffe的清晰性表現在網絡結構與參數都獨立于代碼,用戶只要以普通文本(但需遵循一定的簡單格式)就可以定義好自己的神經網絡,并按自己的需要進行調整。而高效性則體現在對CUDA的支持,GPU 運算能極大地提高圖像處理的速度,同時Caffe提供了在CPU模式和GPU模式之間的無縫切換。
2. Caffe特點
-
上手快:模型與相應優化都是以文本形式而非代碼形式給出。Caffe給出了模型的定義、最優化設置以及預訓練的權重,方便立即上手。
-
速度快:能夠運行最棒的模型與海量的數據。Caffe與cuDNN結合使用,測試AlexNet模型,在K40上處理每張圖片只需要1.17ms.
-
模塊化:方便擴展到新的任務和設置上。可以使用Caffe提供的各層類型來定義自己的模型。
-
開放性:公開的代碼和參考模型用于再現。
-
社區好:可以通過開源社區和Github參與討論和開發。
參考資料:
-
Caffe官網
-
http://www.zmonster.me/2015/07/21/caffe-base-usage.html
-
http://www.cnblogs.com/zdz8207/p/DeepLearning-Caffe.html
Caffe是一個開源的深度學習框架,其實現依賴于許多其它的庫,下面將分別介紹Caffe所需的依賴庫。
1. OpenCV
OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫。OpenCV是由英特爾公司發起并參與開發,以BSD許可證授權發行,可以在商業和研究領域中免費使用。OpenCV可用于開發實時的圖像處理、計算機視覺以及模式識別程序。
2. Boost
Boost C++庫是一個經過千錘百煉、可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的發動機之一。 Boost庫由C++標準委員會庫工作組成員發起,在C++社區中影響甚大。 Boost庫為我們帶來了最新、最酷、最實用的技術,是不折不扣的“準”標準庫。Boost作為一個準標準庫,相當于STL的延續和擴充,它的設計理念和STL比較接近,都是利用泛型讓復用達到最大化。不過相比于STL,Boost更加實用。STL集中在算法部分,而Boost包含了不少工具類,可以完成比較具體的工作。Boost主要包含以下幾個大類:字符串及文本處理、容器、迭代器(Iterator)、算法、函數對象和高階編程、泛型編程、模板元編程、預處理元編程、并發編程、數學相關、糾錯和測試、數據結構、輸入/輸出、跨語言支持、內存相關、語法分析、雜項。
3. CUDA
CUDA(Compute Unified Device Architecture,統一計算架構)是由NVIDIA所推出的一種集成技術,是NVIDIA推出的運算平臺。CUDA是由NVIDIA推出的通用并行計算架構,該架構使GPU能夠解決復雜的計算問題。 它包含了CUDA指令集架構(ISA)以及GPU內部的并行計算引擎。從CUDA體系結構的組成來說,包含了三個部分:開發庫、運行期環境和驅動。開發庫是基于CUDA技術所提供的應用開發庫。運行期環境提供了應用開發接口和運行期組件,包括基本數據類型的定義和各類計算、類型轉換、內存管理、設備訪問和執行調度等函數。驅動部分基本上可以理解為是CUDA-enable的GPU的設備抽象層,提供硬件設備的抽象訪問接口。CUDA提供運行期環境也是通過這一層來實現各種功能的。
4. BLAS
BLAS(Basic Linear Algebra Subprograms,基礎線性代數程序集)是一個應用程序接口(API)標準,用以規范發布基礎線性代數操作的數值庫(如矢量或矩陣乘法)。在高性能計算領域,BLAS被廣泛使用。Caffe推薦的BLAS(Basic Linear Algebra Subprograms)有三個選擇ATLAS,Intel MKL,OpenBLAS。其中ATLAS是caffe是默認選擇的,其開源免費,如果沒有安裝CUDA的不太推薦使用,因為對CPU多線程的支持不太好;Intel MKL是商業庫要收費,學生可申請試用,賈揚清安裝的是MKL,估計效果應該是最好的;OpenBLAS開源免費,支持CPU多線程。
5. LevelDB
LevelDB是一個由Google公司所研發的鍵/值對(Key/Value Pair)嵌入式數據庫管理系統編程庫,以開源的BSD許可證發布,是Caffe支持的數據格式之一。LevelDb有如下一些特點:
-
首先,LevelDb是一個持久化存儲的KV系統,和Redis這種內存型的KV系統不同,LevelDb不會像Redis一樣狂吃內存,而是將大部分數據存儲到磁盤上。
-
其次,LevleDb在存儲數據時,是根據記錄的key值有序存儲的,就是說相鄰的key值在存儲文件中是依次順序存儲的,而應用可以自定義key大小比較函數,LevleDb會按照用戶定義的比較函數依序存儲這些記錄。
-
再次,像大多數KV系統一樣,LevelDb的操作接口很簡單,基本操作包括寫記錄,讀記錄以及刪除記錄。也支持針對多條操作的原子批量操作。
-
另外,LevelDb支持數據快照(snapshot)功能,使得讀取操作不受寫操作影響,可以在讀操作過程中始終看到一致的數據。
6. LMDB
LMDB是一種小型的鍵值對數據庫,具有一些非常優異的特性:
-
有序的映射接口(鍵一直是按字典排序的)
-
讀寫事務:讀不會鎖住寫,寫也不會鎖住讀
-
讀取數據代價很低
-
內存映射,允許零拷貝查找和迭代
-
維護不需要外部進程或后臺線程
雖然LMDB的內存消耗是LevelDB的1.1倍,但是LMDB的速度比LevelDB快10%至15%,更重要的是LMDB允許多種訓練模型同時讀取同一組數據集。因此LMDB取代了LevelDB成為Caffe默認的數據集生成格式。
7. GLog
Google的Glog是一個應用程序的日志庫。它提供基于C++風格的流的日志API,以及各種輔助的宏。打印日志只需以流的形式傳給 LOG(level) 。
8. GFlags
GFlags是Google的一個開源的處理命令行參數的庫,使用C++開發,具備Python接口,可以替代getopt。GFlags使用起來比getopt方便,但是不支持參數的簡寫。
9. Protobuff
Google Protocol Buffer(簡稱Protobuf) 是Google公司內部的混合語言數據標準,它提供了一種靈活、高效、自動序列化結構數據的機制,但是比XML更小、更快、更簡單。僅需要自定義一次你所需的數據格式,然后用戶就可以使用Protobuf編譯器自動生成各種語言的源碼,方便的讀寫用戶自定義的格式化的數據。與語言無關,與平臺無關,還可以在不破壞原數據格式的基礎上,依據老的數據格式,更新現有的數據格式。它們用于RPC 系統和持續數據存儲系統。Protobuf是一種輕便高效的結構化數據存儲格式,可以用于結構化數據串行化,或者說序列化。它很適合做數據存儲或RPC數據交換格式。可用于通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。目前提供了C++、Java、Python三種語言的API。
10. HDF5
HDF(英語:Hierarchical Data Format)指一種為存儲和處理大容量科學數據設計的文件格式及相應庫文件。HDF最早由NCSA開發,目前在非盈利組織HDF小組維護下繼續發展。當前流行的版本是HDF5。?
HDF5文件包含兩種基本數據對象:
-
群組(group):類似文件夾,可以包含多個數據集或下級群組。
-
數據集(dataset):數據內容,可以是多維數組,也可以是更復雜的數據類型。
群組和數據集都支持元數據,用戶可以自定義其屬性,提供附加信息。HDF現在被眾多商業與非商業平臺支持,包括Java,MATLAB/Scilab,Octave,IDL,Python和R。
11. Snappy
Snappy(以前稱Zippy)是Google基于LZ77的思路用C++語言編寫的快速數據壓縮與解壓程序庫,并在2011年開源。它的目標并非最大壓縮率或與其他壓縮程序庫的兼容性,而是非常高的速度和合理的壓縮率。LevelDB需要Snappy的支持。
?
Caffe的設計
根據賈揚清的分享整理
Caffe遵循了神經網絡的一個假設:所有的計算都是以layer形式表示的,layer的作用就是根據輸入數據,輸出一些計算以后的結果。以卷積為例,就是輸入一幅圖像,然后與這一層的參數(filter)進行卷積運算,然后輸出卷積的結果。每一個layer需要進行兩種運算:1.forward,從輸入計算輸出;2.backward根據上面的梯度(gradient)來計算相對于輸入的梯度。在每個layer都實現了這兩個函數以后,我們可以將很多層連接成一個網絡,這個網絡做的事情就是輸入我們的數據(圖像或者語音或者whatever),然后來計算我們需要的輸出(比如說識別的label)。在訓練時,我們可以根據已有的label來計算loss和gradient,然后用gradient來update網絡的參數。這個就是Caffe的一個基本流程!
Caffe主要結構
Caffe代碼本身非常模塊化,主要由4部分組成Blob,Layer,Net和Solver。
- Blob
Blob主要用來表示網絡中的數據,包括訓練數據,網絡各層自身的參數,網絡之間傳遞的數據都是通過Blob來實現的,同時Blob數據也支持在CPU與GPU上存儲,能夠在兩者之間做同步。
- Layer
Layer是對神經網絡中各種層的一個抽象,包括卷積層和下采樣層,還有全連接層和各種激活函數層等等。同時每種Layer都實現了前向傳播和反向傳播,并通過Blob來傳遞數據。
- Net
Net是對整個神經網絡的表示,由各種Layer前后連接組合而成,也是我們要構建的網絡模型。
- Solver
Solver定義了針對Net網絡模型的求解方法,記錄神經網絡的訓練過程,保存神經網絡模型參數,中斷并恢復網絡的訓練過程。自定義Solver能夠實現不同的神經網絡求解方式。
Caffe整體架構
Caffe的架構與其它的深度學習框架稍微不同,它沒有根據算法實現過程的方式來進行編碼,而是以系統級的抽象作為整體架構,逐層的封裝實現細節,使得上層的架構變得很清晰。Caffe的整體架構如下:
1. SyncedMem
這個類的主要功能是封裝CPU和GPU的數據交互操作。一般來說,數據的流動形式都是:硬盤->CPU內存->GPU內存->CPU內存->(硬盤),所以在寫代碼的過程中經常會寫CPU/GPU之間數據傳輸的代碼,同時還要維護CPU和GPU兩個處理端的內存指針。這些事情處理起來不會很難,但是會很繁瑣。因此SyncedMem的出現就是把CPU/GPU的數據傳輸操作封裝起來,只需要調用簡單的接口就可以獲得兩個處理端同步后的數據。
2. Blob
Blob是用于存儲數據的對象,在Caffe中各種數據(圖像輸入、模型參數)都是以Blob的形式在網絡中傳輸的,Blob提供統一的存儲操作接口,可用來保存訓練數據、模型參數等,同時Blob還能在CPU和GPU之間進行同步以支持CPU/GPU的混合運算。?
這個類做了兩個封裝:一個是操作數據的封裝,使用Blob可以操縱高維的數據,快速訪問其中的數據,變換數據的維度等;另一個是對原始數據和更新量的封裝,每一個Blob中都有data和diff兩個數據指針,data用于存儲原始數據,diff用于存儲反向傳播(Backpropagation)的梯度更新值。Blob使用了SyncedMem,這樣便于訪問不同的處理端。Blob基本實現了整個Caffe數據結構部分的封裝,在Net類中可以看到所有的前后向數據和參數都用Blob來表示就足夠了。數據的抽象到這個就可以了,接下來作層級的抽象。神經網絡的前后向計算可以做到層與層之間完全獨立,只要每個層按照一定的接口規則實現,就可以確保整個網絡的正確性。
3. Layer
Layer是網絡Net的基本單元,也是Caffe中能在外部進行調整的最小網絡結構單元,每個Layer都有輸入Blob和輸出Blob。Layer(層)是Caffe中最龐大最繁雜的模塊,它是神經網絡的基本計算單元。由于Caffe強調模塊化設計,因此只允許每個layer完成一類特定的計算,例如convolution操作、pooling、非線性變換、內積運算,以及數據加載、歸一化和損失計算等。Caffe中layer的種類有很多,具體的種類及功能請看官方文檔。在創建一個Caffe模型的時候,也是以Layer為基礎進行的。Layer是一個父類,它的下面還有各種實現特定功能的子類,例如data_layer,conv_layer,loss_layer等。Layer是通過LayFactory來創建的。
4. Net
Net是一個完整的深度網絡,包含輸入層、隱藏層、輸出層,在Caffe中一般是一個卷積神經網絡(Convolution Neural Networ,CNN)。通過定義不同類型的Layer,并用Blob將不同的Layer連接起來,就能產生一個Net。Net將數據Blob和層Layer組合起來做進一步的封裝,對外提供了初始化和前后傳播的接口,使得整體看上去和一個層的功能類似,但內部的組合可以是多種多樣的。值得一提的是,每一層的輸入輸出數據統一保存在Net中,同時每個層內的參數指針也保存在Net中,不同的層可以通過WeightShare共享相同的參數,因此可以通過配置來實現多個神經網絡層之間共享參數的功能。一個Net由多個Layer組成。一個典型的網絡從data layer(從磁盤中載入數據)出發到loss layer結束。
5. Solver
有了Net就可以進行神經網絡的前后向傳播計算了,但是還缺少神經網絡的訓練和預測功能,Solver類進一步封裝了訓練和預測相關的一些功能。它還提供了兩個接口:一個是更新參數的接口,繼承Solver可以實現不同的參數更新方法,如Momentum,Nesterov,Adagrad等,因此可以使用不同的優化算法。另一個接口是訓練過程中每一輪特定狀態下的可注入的一些回調函數,在代碼中這個回調點的直接使用者就是多GPU訓練算法。Solver定義了針對Net網絡模型的求解方法,記錄網絡的訓練過程,保存網絡模型參數,中斷并恢復網絡的訓練過程。自定義Solver能夠實現不同的神經網絡求解方式。閱讀Solver的代碼可以了解網絡的求解優化過程。Solver是一個父類,它下面還有實現不同優化方法的子類,例如sgd_solver,adagrad_sovler等,Solver是通過SolverFactory來創建的。
6. Proto
caffe.proto位于…/src/caffe/proto目錄下,在這個文件夾下還有一個.pb.cc和一個.pb.h文件,這兩個文件都是由caffe.proto編譯而來的。 在caffe.proto中定義了很多結構化數據,包括:?
BlobProto、Datum、FillerParameter、NetParameter、SolverParameter、SolverState、LayerParameter、ConcatParameter、ConvolutionParameter、DataParameter、DropoutParameter、HDF5DataParameter、HDF5OutputParameter、ImageDataParameter、InfogainLossParameter、InnerProductParameter、LRNParameter、MemoryDataParameter、PoolingParameter、PowerParameter、WindowDataParameter、V0LayerParameter。
7. IO
除了上面的東西之外,還需要輸入數據和參數。DataReader和DataTransformer幫助準備輸入數據,Filler對參數進行初始化,一些Snapshot方法可以對模型進行持久化。
參考資料:
- https://zhuanlan.zhihu.com/p/21796890
總結
以上是生活随笔為你收集整理的Caffe的简介、依赖、框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 能识别nvme的pe启动_PE系统纯净(
- 下一篇: Android模拟器Genymotion