谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社群歡迎的兩種深度學習框架。那麼究竟哪種框架最適宜自己手邊的深度學習專案呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。
如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網路」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。為了幫助開發這些架構,谷歌、Facebook 和 Uber 等科技巨頭已經為 Python 深度學習環境釋出了多款框架,這讓人們可以更輕鬆地學習、構建和訓練不同型別的神經網路。本文將詳細介紹和比較兩種流行的框架:TensorFlow 與 PyTorch。
目錄
谷歌的 TensorFlow
Facebook 的 PyTorch
我們可以用 TensorFlow 和 PyTorch 構建什麼?
PyTorch 和 TensorFlow 對比
PyTorch 和 TensorFlow 的優點和缺點
PyTorch 和 TensorFlow 安裝、版本、更新
TensorFlow 還是 PyTorch?我的建議
谷歌的 TensorFlow
TensorFlow 是谷歌的開發者創造的一款開源的深度學習框架,於 2015 年釋出。官方研究釋出於論文《TensorFlow:異構分散式系統上的大規模機器學習》。
TensorFlow 現已被公司、企業與創業公司廣泛用於自動化工作任務和開發新系統,其在分散式訓練支援、可擴充套件的生產和部署選項、多種裝置(比如安卓)支援方面備受好評。
Facebook 的 PyTorch
論文地址:https://openreview.net/pdf?id=BJJsrmfCZ
PyTorch 很簡潔、易於使用、支援動態計算圖而且記憶體使用很高效,因此越來越受歡迎。接下來還會更詳細地介紹。
我們可以用 TensorFlow 和 PyTorch 構建什麼?
神經網路起初是被用於解決手寫數字識別或用相機識別汽車註冊車牌等簡單的分類問題。但隨著近來框架的發展以及英偉達高計算效能圖形處理單元(GPU)的進步,我們可以在 TB 級的資料上訓練神經網路並求解遠遠更加複雜的問題。一個值得提及的成就是在 TensorFlow 和 PyTorch 中實現的卷積神經網路在 ImageNet 上都達到了當前最佳的表現。訓練後的模型可以用在不同的應用中,比如目標檢測、影像語義分割等等。
儘管神經網路架構可以基於任何框架實現,但結果卻並不一樣。訓練過程有大量引數都與框架息息相關。舉個例子,如果你在 PyTorch 上訓練一個資料集,那麼你可以使用 GPU 來增強其訓練過程,因為它們執行在 CUDA(一種 C++ 後端)上。TensorFlow 也能使用 GPU,但它使用的是自己內建的 GPU 加速。因此,根據你所選框架的不同,訓練模型的時間也總是各不相同。
TensorFlow 頂級專案
Magenta:一個探索將機器學習用作創造過程的工具的開源研究專案:https://magenta.tensorflow.org/
Sonnet:這是一個基於 TensorFlow 的軟體庫,可用於構建複雜的神經網路:https://sonnet.dev/
Ludwig:這是一個無需寫程式碼就能訓練和測試深度學習模型的工具箱:https://uber.github.io/ludwig/
PyTorch 頂級專案
PYRO:這是一種用 Python 編寫的通用概率程式語言(PPL),後端由 PyTorch 支援:https://pyro.ai (https://pyro.ai/)
這些只是基於 TensorFlow 和 PyTorch 構建的少量框架和專案。你能在 TensorFlow 和 PyTorch 的 GitHub 和官網上找到更多。
PyTorch 和 TensorFlow 對比
PyTorch 和 TensorFlow 的關鍵差異是它們執行程式碼的方式。這兩個框架都基於基礎資料型別張量(tensor)而工作。你可以將張量看作是下圖所示的多維陣列。
機制:動態圖定義與靜態圖定義
TensorFlow 框架由兩個核心構建模組組成:
一個用於定義計算圖以及在各種不同硬體上執行這些圖的執行時間的軟體庫。
一個具有許多優點的計算圖(後面很快就會介紹這些優點)。
當你在 TensorFlow 中執行程式碼時,計算圖是以靜態方式定義的。與外部世界的所有通訊都是通過 tf.Sessionobject 和 tf.Placeholder 執行,它們是在執行時會被外部資料替換的張量。例如,看看以下程式碼段:
下圖是 TensorFlow 中執行程式碼之前以靜態方式生成計算圖的方式。計算圖的核心優勢是能實現並行化或依賴驅動式排程(dependency driving scheduling),這能讓訓練速度更快,更有效率。
類似於 TensorFlow,PyTorch 也有兩個核心模組:
計算圖的按需和動態構建
Autograd:執行動態圖的自動微分
根據你所用的框架,在軟體領域有很大的不同。TensorFlow 提供了使用 TensorFlow Fold 庫實現動態圖的方式,而 PyTorch 的動態圖是內建的。
分散式訓練
PyTorch 和 TensorFlow 的一個主要差異特點是資料並行化。PyTorch 優化效能的方式是利用 Python 對非同步執行的本地支援。而用 TensorFlow 時,你必須手動編寫程式碼,並微調要在特定裝置上執行的每個操作,以實現分散式訓練。但是,你可以將 PyTorch 中的所有功能都復現到 TensorFlow 中,但這需要做很多工作。下面的程式碼片段展示了用 PyTorch 為模型實現分散式訓練的簡單示例:
視覺化
在訓練過程的視覺化方面,TensorFlow 更有優勢。視覺化能幫助開發者跟蹤訓練過程以及實現更方便的除錯。TensorFlow 的視覺化庫名為 TensorBoard。PyTorch 開發者則使用 Visdom,但是 Visdom 提供的功能很簡單且有限,所以 TensorBoard 在訓練過程視覺化方面更好。
跟蹤和視覺化損失和準確度等指標
視覺化計算圖(操作和層)
檢視權重、偏差或其它張量隨時間變化的直方圖
展示影像、文字和音訊資料
分析 TensorFlow 程式
Visdom 的特性
處理回撥
繪製圖表和細節
管理環境
生產部署
在將訓練好的模型部署到生產方面,TensorFlow 顯然是贏家。我們可以直接使用 TensorFlow serving 在 TensorFlow 中部署模型,這是一種使用了 REST Client API 的框架。
用 PyTorch 和 TensorFlow 定義一個簡單的神經網路
我們比較一下如何在 PyTorch 和 TensorFlow 中宣告神經網路。
近期 Keras 被合併到了 TensorFlow 庫中,這是一個使用 TensorFlow 作為後端的神經網路框架。從那時起,在 TensorFlow 中宣告層的句法就與 Keras 的句法類似了。首先,我們宣告變數並將其分配給我們將要宣告的架構型別,這裡的例子是一個 Sequential() 架構。
TensorFlow 和 PyTorch 的優缺點
TensorFlow和PyTorch各有其優缺點。
簡單的內建高階 API
使用 TensorBoard 視覺化訓練
通過 TensorFlow serving 容易實現生產部署
很容易的移動平臺支援
開源
良好的文件和社群支援
靜態圖
除錯方法
難以快速修改
類 Python 的程式碼
動態圖
輕鬆快速的編輯
良好的文件和社群支援
開源
很多專案都使用 PyTorch
視覺化需要第三方
生產部署需要 API 伺服器
PyTorch 和 TensorFlow 安裝、版本、更新
PyTorch 安裝
pip3 install torch torchvision複製程式碼
pip3 install https://download.pytorch.org/whl/cu90/torch-1.1.0-cp36-cp36m-win_amd64.whlpip3 install https://download.pytorch.org/whl/cu90/torchvision-0.3.0-cp36-cp36m-win_amd64.whl複製程式碼
macOS、Linux 和 Windows
# Current stable release for CPU-onlypip install tensorflow# Install TensorFlow 2.0 Betapip install tensorflow==2.0.0-beta1複製程式碼