Caffe 全稱為 Convolutional Architecture for Fast Feature Embedding,是一個被廣泛使用的開源深度學習框架(在 TensorFlow 出現之前一直是深度學習領域 GitHub star 最多的項目),目前由伯克利視覺學中心(Berkeley Vision and Learning Center,BVLC)進行維護。Caffe 的創始人是加州大學伯克利的 Ph.D.賈揚清,他同時也是TensorFlow的作者之一,曾工作於 MSRA、NEC 和 Google Brain,目前就職於 Facebook FAIR 實驗室。Caffe 的主要優勢包括如下幾點。
容易上手,網絡結構都是以配置文件形式定義,不需要用代碼設計網絡。
訓練速度快,能夠訓練 state-of-the-art 的模型與大規模的數據。
組件模塊化,可以方便地拓展到新的模型和學習任務上。
Caffe 的核心概念是 Layer,每一個神經網絡的模塊都是一個 Layer。Layer 接收輸入數據,同時經過內部計算產生輸出數據。設計網絡結構時,只需要把各個 Layer 拼接在一起構成完整的網絡(通過寫 protobuf 配置文件定義)。比如卷積的 Layer,它的輸入就是圖片的全部像素點,內部進行的操作是各種像素值與 Layer 參數的 convolution 操作,最后輸出的是所有卷積核 filter 的結果。每一個 Layer 需要定義兩種運算,一種是正向(forward)的運算,即從輸入數據計算輸出結果,也就是模型的預測過程;另一種是反向(backward)的運算,從輸出端的 gradient 求解相對於輸入的 gradient,即反向傳播算法,這部分也就是模型的訓練過程。實現新 Layer 時,需要將正向和反向兩種計算過程的函數都實現,這部分計算需要用戶自己寫 C++或者 CUDA (當需要運行在 GPU 時)代碼,對普通用戶來說還是非常難上手的。正如它的名字 Convolutional Architecture for Fast Feature Embedding 所描述的,Caffe 最開始設計時的目標只針對於圖像,沒有考慮文本、語音或者時間序列的數據,因此 Caffe 對卷積神經網絡的支持非常好,但對時間序列 RNN、LSTM 等支持得不是特別充分。同時,基於 Layer 的模式也對 RNN 不是非常友好,定義 RNN 結構時比較麻煩。在模型結構非常復雜時,可能需要寫非常冗長的配置文件才能設計好網絡,而且閱讀時也比較費力。
Caffe 的一大優勢是擁有大量的訓練好的經典模型(AlexNet、VGG、Inception)乃至其他 state-of-the-art (ResNet等)的模型,收藏在它的 Model Zoo (http://github.com/BVLC/ caffe/wiki/Model-Zoo)。因為知名度較高,Caffe 被廣泛地應用於前沿的工業界和學術界,許多提供源碼的深度學習的論文都是使用 Caffe 來實現其模型的。在計算機視覺領域 Caffe 應用尤其多,可以用來做人臉識別、圖片分類、位置檢測、目標追蹤等。雖然 Caffe 主要是面向學術圈和研究者的,但它的程序運行非常穩定,代碼質量比較高,所以也很適合對穩定性要求嚴格的生產環境,可以算是第一個主流的工業級深度學習框架。因為 Caffe 的底層是基於 C++的,因此可以在各種硬件環境編譯並具有良好的移植性,支持 Linux、Mac 和 Windows 系統,也可以編譯部署到移動設備系統如 Android 和 iOS 上。和其他主流深度學習庫類似,Caffe 也提供了 Python 語言接口 pycaffe,在接觸新任務,設計新網絡時可以使用其 Python 接口簡化操作。不過,通常用戶還是使用 Protobuf 配置文件定義神經網絡結構,再使用 command line 進行訓練或者預測。Caffe 的配置文件是一個 JSON 類型的 .prototxt 文件,其中使用許多順序連接的 Layer 來描述神經網絡結構。Caffe 的二進制可執行程序會提取這些 .prototxt 文件並按其定義來訓練神經網絡。理論上,Caffe 的用戶可以完全不寫代碼,只是定義網絡結構就可以完成模型訓練了。Caffe 完成訓練之后,用戶可以把模型文件打包制作成簡單易用的接口,比如可以封裝成 Python 或 MATLAB 的 API 。不過在 .prototxt 文件內部設計網絡節構可能會比較受限,沒有像 TensorFlow 或者 Keras 那樣在 Python 中設計網絡結構方便、自由。更重要的是,Caffe 的配置文件不能用編程的方式調整超參數,也沒有提供像 Scikit-learn 那樣好用的 estimator 可以方便地進行交叉驗證、超參數的 Grid Search 等操作。
Caffe 在 GPU 上訓練的性能很好(使用單塊 GTX 1080 訓練 AlexNet 時一天可以訓練上百萬張圖片),但是目前僅支持單機多 GPU 的訓練,沒有原生支持分布式的訓練。慶幸的是,現在有很多第三方的支持,比如雅虎開源的 CaffeOnSpark,可以借助 Spark 的分布式框架實現 Caffe 的大規模分布式訓練。
官方網址:http://caffe.berkeleyvision.org/
GitHub:http://github.com/BVLC/caffe