谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社區歡迎的兩種深度學習框架。那麼究竟哪一種框架最適宜本身手邊的深度學習項目呢?本文做者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了本身的建議。
若是你在讀這篇文章,那麼你可能已經開始了本身的深度學習之旅。若是你對這一領域還不是很熟悉,那麼簡單來講,深度學習使用了「人工神經網絡」,這是一種相似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。爲了幫助開發這些架構,谷歌、Facebook 和 Uber 等科技巨頭已經爲 Python 深度學習環境發佈了多款框架,這讓人們能夠更輕鬆地學習、構建和訓練不一樣類型的神經網絡。本文將詳細介紹和比較兩種流行的框架:TensorFlow 與 PyTorch。git
谷歌的 TensorFlowgithub
Facebook 的 PyTorch編程
咱們能夠用 TensorFlow 和 PyTorch 構建什麼?後端
PyTorch 和 TensorFlow 對比api
PyTorch 和 TensorFlow 的優勢和缺點數組
PyTorch 和 TensorFlow 安裝、版本、更新bash
TensorFlow 仍是 PyTorch?個人建議服務器
TensorFlow 是谷歌的開發者創造的一款開源的深度學習框架,於 2015 年發佈。官方研究發佈於論文《TensorFlow:異構分佈式系統上的大規模機器學習》。網絡
TensorFlow 現已被公司、企業與創業公司普遍用於自動化工做任務和開發新系統,其在分佈式訓練支持、可擴展的生產和部署選項、多種設備(好比安卓)支持方面備受好評。數據結構
論文地址:https://openreview.net/pdf?id=BJJsrmfCZ
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 的關鍵差別是它們執行代碼的方式。這兩個框架都基於基礎數據類型張量(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各有其優缺點。
簡單的內置高級 API
使用 TensorBoard 可視化訓練
經過 TensorFlow serving 容易實現生產部署
很容易的移動平臺支持
開源
良好的文檔和社區支持
靜態圖
調試方法
難以快速修改
類 Python 的代碼
動態圖
輕鬆快速的編輯
良好的文檔和社區支持
開源
不少項目都使用 PyTorch
可視化須要第三方
生產部署須要 API 服務器
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複製代碼