Tensorflow 與 pytorch對比

1、前言

很多人在學習深度學習時,都會對於學習哪個深度學習的框架而煩惱,到底是Tensorflow 還是 pytourch?一個主流的說法就是如果搞學術研究,那麼就選擇pytourch,如果是搞項目那就選Tensorflow ,但很多人都糾結兩者的區別在哪裏呢,下面就具體的分析一下,看看到底哪個框架適合你。

2、入門時間

PyTorch本質上是Numpy的替代者,而且支持GPU、帶有高級功能,可以用來搭建和訓練深度神經網絡。如果你熟悉Numpy、Python以及常見的深度學習概念(卷積層、循環層、SGD等),會非常容易上手PyTorch。

而TensorFlow1.0可以看成是一個嵌入Python的編程語言。你寫的TensorFlow代碼會被Python編譯成一張圖,然後由TensorFlow執行引擎運行。我見過好多新手,因爲這個增加的間接層而困擾。也正是因爲同樣的原因,TensorFlow有一些額外的概念需要學習,例如會話、圖、變量作用域(variable scoping)、佔位符等。另外還需要更多的樣板代碼才能讓一個基本的模型運行。

對於TensorFlow2.0,在TensorFlow1.0基礎上進一步優化了API,更加方便開發者上手

所以TensorFlow1.0的上手時間,肯定要比PyTorch長,但是如果對於初學者而言,利用TensorFlow2.0中的keras,上手是非常輕鬆的。

3、機制


創建和運行計算圖可能是兩個框架最不同的地方。在PyTorch中,圖結構是動態的,這意味着圖在運行時構建,即在訓練模型時,圖結構可以更改。而在TensorFlow1.0中,圖結構是靜態的,這意味着圖先被“編譯”然後再運行,TensorFlow2.0採用和PyTorch一樣的動態圖結構。舉一個簡單的例子,在PyTorch中你可以用標準的Python語法編寫一個for循環結構,此處T可以在每次執行代碼時改變。

for _ in range(T):
    h = torch.matmul(W, h) + b




而TensorFlow1.0中,這需要使用“控制流操作”來構建圖,例如tf.while_loop。TensorFlow確實提供了dynamic_rnn用於常見結構,但是創建自定義動態計算真的更加困難。

PyTorch中簡單的圖結構更容易理解,更重要的是,還更容易調試。調試PyTorch代碼就像調試Python代碼一樣。你可以使用pdb並在任何地方設置斷點。調試TensorFlow代碼可不容易。要麼得從會話請求要檢查的變量,要麼學會使用TensorFlow的調試器(tfdbg)。

所以,這裏PyTorch和TensorFlow2.0要優於TensorFlow1.0。

4、全面性

隨着PyTorch逐漸成熟,我預計這部分的差距會趨近於零。但目前,TensorFlow還是有一些PyTorch不支持的功能。它們是:

  • 沿維翻轉張量(np.flip, np.flipud, np.fliplr)
  • 檢查無窮與非數值張量(np.is_nan, np.is_inf)
  • 快速傅里葉變換(np.fft)

這些TensorFlow都支持。另外,TensorFlow的contrib軟件包中,有更多PyTorch沒有的高級功能和模型。

這一方面TensorFlow優於PyTorch。

5、序列化

兩種框架下保存和加載模型都很簡單。PyTorch有一個特別簡單的API,可以保存模型的所有權重或pickle整個類。

TensorFlow的Saver對象也很易用,而且爲檢查提供了更多的選項。TensorFlow序列化的主要優點是可以將整個圖保存爲protocol buffer。包括參數和操作。然而圖還能被加載進其他支持的語言(C++、Java)。這對於部署堆棧至關重要。理論上,當你想改動模型源代碼但仍希望運行舊模型時非常有用。

這一方面TensorFlow優於PyTorch。

6、部署

對於小規模的服務器端部署(例如一個Flask web server),兩個框架都很簡單。

對於移動端和嵌入式部署,TensorFlow更好。不只是比PyTorch好,比大多數深度學習框架都要要。

使用TensorFlow,特別是TensorFlow2.0,進一步優化了部署方面的功能。部署在Android或iOS平臺時只需要很小的工作量,至少不必用Java或者C++重寫模型的推斷部分。對於高性能服務器端的部署,還有TensorFlow Serving能用。除了性能之外,TensorFlow Serving一個顯著的優點是可以輕鬆的熱插拔模型,而不會使服務失效。

這一方面TensorFlow優於PyTorch。這也是很多開發人員選擇TensorFlow的一個重要原因,因爲做好的項目最終要部署的實際的場景中。

7、自定義擴展

兩個框架都可以構建和綁定用C、C++、CUDA編寫的自定義擴展。TensorFlow1.0仍然需要更多的樣板代碼,儘管這對於支持多類型和設備可能更好。在PyTorch中,你只需爲每個CPU和GPU編寫一個接口和相應的實現。兩個框架中編譯擴展也是直接記性,並不需要在pip安裝的內容之外下載任何頭文件或者源代碼。

這一方面PyTorch優於TensorFlow,這也是很多學術研究人員選擇PyTorch的一個重要原因。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章