想要學習深度學習,就要掌握一個有效的深度學習框架。那麼現在都有哪些主流的深度學習開源框架,它們各自的優/缺點又是什麼呢?
在工程實踐中,我們認為,要選擇一個得心應手的深度學習框架,主要從框架的流行程度和應用場景出發。
-
對想要入門深度學習的使用者來說,選擇一個比較流行的框架意味著能從多種渠道中獲得更多的支援,譬如書籍、部落格、GitHub 專案等;
-
對專門從事深度學習模型開發的使用者來說,選擇一個適合應用場景的框架,使用一門合適的開發語言,將會使模型開發達到事半功倍的效果。
下面介紹現在主流的深度學習開源框架,幫助讀者對這些框架有直觀的認識。
主流的深度學習開源框架
這是一個深度學習框架群雄逐鹿的年代,許多深度學習框架在湧現、合併,抑或凋零,其中包括 TensorFlow、Keras、CNTK、PyTorch、MXNet、Theano 等,它們的背後是 Google、Microsoft、Facebook、Amazon 等科技巨頭。
就目前的情況來看:
-
在 Google 的號召下,TensorFlow 擁有眾多的開發者,在關注度和使用者數上都佔據絕對優勢。
-
Keras 作為“框架上的框架”,以其易用性吸引了不少支援者。
-
Facebook 的 PyTorch、Amazon 的 MXNet、Microsoft 的 CNTK 等各有一技之長,在目前深度學習的戰場上立有一席之地。
-
而曾經的霸主 Theano,在沒有大公司的支援下,開始沒落。
對準備入門深度學習的人來說,深度學習框架在 GitHub上的活躍度可以作為一個重要的參考指標。在 GitHub 上,被 Star(收藏)和 Fork(分支)越多,意味著有越多的開發者選擇了這個深度學習框架。
我總結了在 GitHub上(到 2019-02-01 為止)各個主流深度學習框架的活躍度,以及它們對程式語言和系統的支援情況,如下表所示。
主流深度學習框架的活躍度
框架名稱 |
GitHub的活躍度 |
維護團隊 |
支援語言 |
支援系統 |
程式設計模式 |
Star (數量) |
Fork (數量) |
貢獻者數量 |
TensorFlow |
119730 |
71727 |
1817 |
Google |
Python、C++、 Java、 Go |
Linux、macOS、 Windows 、 Raspberry Pi |
符號式程式設計 |
Keras |
37850 |
14450 |
771 |
Google |
Python、 R |
Linux、macOS、 Windows |
符號式程式設計 |
PyTorch |
24331 |
5778 |
906 |
Facebook |
Python、C++ |
Linux、macOS、 Windows |
指令式程式設計 |
MXNet |
16255 |
5842 |
667 |
DMLC、 Amazon |
Python、C++、 Clojure、Julia、 Perl、R、Scala、 Java |
Linux、macOS、 Windows、Raspberry Pi、NVIDIA Jetson |
符號式程式設計和指令式程式設計的混合程式設計 |
CNTK |
15721 |
4213 |
191 |
Microsoft |
Python、C++、 C#/.NET、Java |
Linux、Windows |
符號式程式設計 |
Theano |
8667 |
2479 |
334 |
蒙特利爾 大學 |
Python |
Linux、macOS、Windows |
符號式程式設計 |
從深度學習開源框架統計表中,我們可以看到:
1) TensorFlow 處於毫無疑問的霸主地位,其 Star 數和 Fork 數均超過了表中其他開源框架的 Star 數和 Fork 數的總和。
2) 在對語言的支援上,Python 為最受歡迎的語言,所有框架均支援 Python 或者 Python 優先。Python 的優雅、簡潔,使得其具有較低的使用門檻和極高的程式設計效率,能夠更快地嘗試不同的引數組合以及更複雜的模型。
C++ 排名第二,除 Theano 和 Keras 外,其他深度學習框架底層都是由 C/C++ 語言編寫的,保證了模型訓練的速度和效率。
其他語言支援的框架各有不同,譬如 TensorFlow 支援Go語言、MXNet 支援 Scala 語言、CNTK 支援 C# 語言等。
3) 在支援的系統上,所有框架基本都支援 Linux、macOS 和 Windows 這3個主流系統(除 CNTK 缺少對 macOS 的原生支援外),TensorFlow 和 MXNet 還支援 Raspberry Pi(樹莓派),MXNet 還支援 NVIDIA Jetson。
4) 在程式設計模式上,Theano、TensorFlow、CNTK、Keras 為符號式程式設計;PyTorch 為指令式程式設計;MXNet 比較特殊,支援符號式程式設計和指令式程式設計的混合程式設計。
【答疑解惑】程式設計模式與計算圖
程式設計模式通常分為指令式程式設計(imperative style programs)和符號式程式設計(symbolic style programs)。
符號式程式設計
符號式程式設計將計算過程抽象為計算圖。使用計算圖可以方便地描述計算過程,所有輸入節點、運算節點、輸出節點均被符號化處理。計算圖通過建立輸入節點到輸出節點的傳遞閉包,從輸入節點出發,沿著傳遞閉包完成數值計算和資料流動,直到輸出節點。
這個過程經過計算圖優化,以資料流方式完成,節省了記憶體空間,計算速度快,但不適合程式偵錯。
因為符號式程式設計中的計算圖先定義後執行(define and run),也被稱為靜態計算圖。
指令式程式設計
指令式程式設計就是輸入什麼便執行什麼,在執行語句時馬上進行計算,對語句基本沒有優化,按原有邏輯執行,容易理解和偵錯。指令式程式設計在執行過程中定義(define by run)的計算圖,是動態計算圖。