當前位置:
首頁 > 知識 > PyTorch vs TensorFlow,哪個更適合你

PyTorch vs TensorFlow,哪個更適合你

PyTorch vs TensorFlow,哪個更適合你

本文將探討PyTorch和TensorFlow這兩種流行深度學習框架之間的關鍵相似點和不同點。為什麼選擇這兩個框架,而不是其他的呢?目前有很多的深度學習框架,而且很多都可用於實際的生產,我之所以選擇這兩個只是因為我對它們特別感興趣。

起源

TensorFlow由谷歌大腦開發,並且在谷歌公司中廣泛地應用於研究和生產需求。它的前身是閉源的DistBelief。

PyTorch是Torch框架的表親,Torch是基於lua開發的,在Facebook公司里被廣泛使用。然而,PyTorch的出現並不是為了支持流行語言而對Torch進行簡單的包裝,它被重寫和定製出來是為了得到更快的速度和本地化。

比較這兩個框架最好的方法就是用它們編寫代碼。我專門為這篇文章寫了一個jupyter筆記,你可以在這裡找到代碼,文章涉及到的所有的代碼都有。

首先,我們用這兩個框架為下面這個函數編寫一個簡單的近似器:

PyTorch vs TensorFlow,哪個更適合你

我們將嘗試用給定的_x_和函數值_f(x)_來計算未知參數_phi_的值。是的,使用隨機梯度下降演算法對於這個例子來說簡直就是殺雞用牛刀,很容易就能找到解法,但是這個簡單的例子正好能實現我們這篇文章的目的。

我們首先用PyTorch來解決這個問題:

如果你對深度學習框架比較熟悉,那麼你可能已經注意到我們正在純手工打造梯度下降演算法。這很不方便,但很幸運,PyTorch有optimize模塊,其中包含了諸如RMSProp或Adam等流行優化演算法的實現。我們將使用包含momentum的SGD。

PyTorch vs TensorFlow,哪個更適合你

PyTorch的損耗函數和指數圖

正如你所看到的,我們很快就從訓練數據推斷出了真正的指數值。現在我們繼續使用TensorFlow來試試:

PyTorch vs TensorFlow,哪個更適合你

TensorFlow的損耗函數和指數圖

正如你所看到的,TensorFlow也能達到相同的目標。但它需要更多的迭代次數來得到指數值,但我相信,這是因為我沒有弄清楚優化器的參數才使得兩者的結果不具有可比性。

現在我們準備探討一些不同點。

差異0 - 接受度

目前,TensorFlow被許多研究人員和行業專業人士視為一款易於使用的工具。該框架的文檔很齊全,如果官方文檔無法滿足你的需求,還可以在互聯網上找到很多很好的教程。你可以在github上找到數百個已經實現並訓練過的模型。請從這裡開始。

PyTorch相對於其競爭對手而言還比較新(仍處於測試階段),但它發展迅速。文檔和官方教程也很好。 PyTorch還包含了幾個易用並且很流行的計算機視覺架構的實現。

差異1 - 圖的動態定義 vs 靜態定義

兩個框架都是在張量上進行運算,並將任意一個模型看成是有向非循環圖(DAG),但是它們在其定義方面有很大的區別。

TensorFlow遵循「數據即代碼,代碼即數據」的理念。在TensorFlow中,你可以在模型能夠運行之前靜態地定義圖。與外部世界的所有通信都通過tf.Session對象和tf.Placeholder來執行,這兩個張量在運行時會被外部數據替代。

在PyTorch中,圖的定義則更為重要和動態化:你可以隨時定義、隨時更改、隨時執行節點,並且沒有特殊的會話介面或佔位符。總體而言,該框架與Python語言集成地更為緊密,並且在大多數時候用起來感覺更加本地化。而在用TensorFlow開發的時候,你會覺得模型是在一堵牆的後面,僅能通過牆上的幾個小洞與之通訊。不管怎麼說,這個似乎跟個人偏好有關。

然而,這些方法不僅在軟體工程方面有所不同:有幾種動態神經網路架構得益於動態方法。召回RNNs:使用靜態圖,輸入序列長度將保持不變。這意味著如果正在開發一個針對英語語句的情緒分析模型,那麼必須將句子的長度修正為某個最大值,如果序列的長度不夠長,則用零來填充。這個方法似乎不太方便。而且可能會在遞歸RNN和樹RNN方面遇到更多的問題。目前,Tensorflow通過Tensorflow Fold有限地支持動態輸入,而PyTorch則默認支持。

差異2 - 調試

由於PyTorch中的計算圖是在運行的時候定義的,因此你可以使用任何一個你喜歡的調試工具,比如pdb、ipdb、PyCharm調試器或者原始的print語句。

而TensorFlow並不能這樣。你可以選擇使用一款名為tfdbg的特殊工具,該工具允許在運行時評估TensorFlow表達式,並瀏覽會話內的所有張量和操作。當然,你無法使用它來調試任何python代碼,因此有必要另外使用pdb。

PyTorch vs TensorFlow,哪個更適合你

差異3 - 可視化

在可視化方面,Tensorboard非常棒。該工具包含在TensorFlow里,它對於調試和比較不同的訓練過程非常有用。例如,在訓練模型的時候,你可以在調整某些超參數之後再訓練一遍。兩次運行過程可以同時顯示在Tensorboard上,以顯示它們之間存在的差異。Tensorboard能夠:

  • 顯示模型圖

  • 繪製標量變數

  • 使分布和直方圖可視化

  • 使圖像可視化

  • 使嵌入可視化

  • 播放音頻

Tensorboard能夠顯示通過tf.summary模塊收集的各種摘要。我們將為前面提到的那個指數例子定義摘要操作,並使用tf.summary.FileWriter將其保存到磁碟上。

執行tensorboard --logdir=./tensorboard以啟動Tensorboard。這個工具對於雲實例來說非常方便,因為它是一個webapp。

目前,PyTorch並沒有一個類似於Tensorboard的工具,但有一個可以將Tensorboard集成進來的工具。或者,也可以免費使用標準繪圖工具:matplotlib和seaborn。

差異4 - 部署

對於部署來說,TensorFlow贏得太輕鬆了:它有一個名叫TensorFlow Serving的框架,用於在一個指定的gRPC伺服器上部署模型。

讓我們把目光轉向PyTorch。我們可以使用Flask或者另一種替代方法來基於模型編寫一個REST API。如果gRPC不合適的話,這也可以用TensorFlow模型來完成。但是,如果要考慮到性能,那麼TensorFlow Serving可能就是一個更好的選擇了。

Tensorflow還支持分散式訓練,但PyTorch目前不支持。

差異5 - 框架還是庫

我們來為手寫數字構建一個CNN分類器。現在,PyTorch看起來真的像一個*框架*了。回想一下,編程框架的作用是為我們提供某個領域的有用抽象,並提供一個方便的方式讓我們能夠使用這些抽象來解決一些具體的問題。這就是框架與庫的本質區別。

在這裡,我們將介紹datasets模塊,它包含了用於評測深度學習架構的流行數據集的包裝。另外nn.Module可用於構建一個自定義的卷積神經網路分類器。 nn.Module是PyTorch提供的一個構建塊,可用於創建複雜的深度學習架構。 torch.nn包中有大量可用作模型基礎的模塊。

這是https://github.com/pytorch/examples/blob/master/mnist/main.py稍做修改後的版本:

純TensorFlow看起來更像是一個庫,而不是框架:所有的操作都在低層次進行,因此你不得不編寫大量的樣板代碼(我們需要一次又一次地定義這些偏差和權重等等)。

隨著時間的推移,TensorFlow高層次包裝的整個生態環境開始出現。並且其中的每一個都旨在簡化庫的使用。其中有很多都在tensorflow.contrib模塊中(這個模塊的API並不穩定),而有些則開始遷移到主代碼倉庫中(參見tf.layers)。

所以,在使用TensorFlow以及選擇適合任務的框架上有著很大的自由度,你可以在這些框架中選擇:TFLearn、tf.contrib.learn、Sonnet、Keras、或者純tf.layers等等。老實說,對於Keras,值得寫一篇文章推薦一下,但現在已經超出了本文的範圍。

在這裡,我們將使用tf.layerstf.contrib.learn來構建CNN分類器。其代碼遵循tf.layers官方教程:

所以,TensorFlow和PyTorch都提供了有用的抽象來減少樣板代碼的數量並加快模型的開發。它們之間主要的區別在於,PyTorch可能感覺更「Python化」,並且有面向對象的方法,而TensorFlow則有多個框架可供選擇。

就個人而言,我認為PyTorch更為清晰,對開發者更為友好。它的torch.nn.Module讓你能夠以面向對象的方式來定義可重用的模塊,這種方法非常靈活非常強大。然後,你可以使用torch.nn.Sequential來組成各種模塊。此外,你還可以以函數的形式使用所有的內置模塊,這非常方便。總的來說,API的各個方面用起來都很順手。

當然,你可以用純TensorFlow編寫出非常簡潔的代碼,但你需要更強的編碼能力和不斷試錯才能達到這個目標。而如果使用諸如Keras或者TFLearn這樣的高層次框架的話,就可能會降低TensorFlow本身所具有的靈活性。

結論

TensorFlow是一個非常強大非常成熟的深度學習庫,具有非常強大的可視化功能,以及有多個可供選擇的框架來進行高級模型開發。它具有用於生產的部署選項,以及對移動平台的支持。 如果你有以下需求,那麼TensorFlow是一個很好的選擇:

  • 開發生產模型

  • 開發需要部署在移動平台上的模型

  • 需要良好的社區支持和齊全的文檔

  • 想要各種形式的豐富的學習資源(TensorFlow有一個大型開放式網路課程)

  • 想要或需要使用Tensorboard

  • 需要大規模的分散式模型訓練

PyTorch仍然是一個年輕的框架,但其發展速度越來越快。如果你有以下需求,它可能會比較適合你:

  • 用於研究,或者是用於生產的非功能性需求並不是很苛刻

  • 需要更好的開發和調試體驗

  • 愛所有Python化的東西

如果你有時間,最好兩個都試試,看看哪個最能滿足你的需求。

文章原標題《PyTorch vs TensorFlow?—?spotting the difference》,作者:Kirill Dubovikov,譯者:夏天,審校:主題曲哥哥。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲棲社區 的精彩文章:

簡單聊聊VPC和SDN/NFV
不容錯過!阿里巴巴機器學習系列課程
詳解阿里雲企業辦公解決方案,開啟辦公「輕」時代
1人1台電腦1周可以處理10000+的訂單嗎?
巧用阿里雲共享帶寬包,為企業降低50%帶寬成本

TAG:雲棲社區 |

您可能感興趣

如何使用 TensorFlow mobile將PyTorch和Keras 部署到移動設備
Variable和Tensor合併後,PyTorch的代碼要怎麼改?
Oracle開源GraphPipe:幾行代碼讓你在TensorFlow部署PyTorch模型
TensorFlow與PyTorch之爭,哪個框架最適合深度學習
用Pytorch 實現的 Capsule Network
深度學習戰爭:Facebook 支持的 PyTorch與Google的TensorFlow
正式支持Transformer與TensorBoard,PyTorch 1.2新鮮出爐
HiddenLayer:可視化PyTorch、TensorFlow神經網路圖的輕量級工具!
用英偉達Jetson Nano運行PyTorch&Fast.ai
類Keras的PyTorch 深度學習框架——PyToune
融合 Caffe2、ONNX 的新版 PyTorch 發布在即,能否趕超 TensorFlow?
僅僅一年PyTorch擠下Keras成第二,TensorFlow老大地位不穩
資源 | HiddenLayer:可視化PyTorch、TensorFlow神經網路圖的輕量級工具!
Facebook將推出PyTorch 1.0,整合Caffe2+PyTorch
GitHub趨勢榜第一:TensorFlow+PyTorch深度學習資源大匯總
Pytorch實現Logistic回歸二分類
ArXiv最火深度學習框架:TensorFlow第一,PyTorch第二!
如何在CUDA中為Transformer編寫一個PyTorch自定義層
TensorFlow 2.0和PyTorch誰更好?大牛們爭了好幾天
Karpathy更新深度學習開源框架排名:TensorFlow第一,PyTorch第二