天天看點

DL:深度學習架構Pytorch、 Tensorflow各種角度對比

先看兩個架構實作同樣功能的代碼

1、Pytorch、Tensorflow代碼比較

DL架構之PyTorch:PyTorch的簡介、安裝、使用方法之詳細攻略

DL架構之Tensorflow:Tensorflow的簡介、安裝、使用方法之詳細攻略

DL:深度學習架構Pytorch、 Tensorflow各種角度對比——案例代碼實作

2、Tensorflow(資料即是代碼,代碼就是資料)+Pytorch(随着進展定義、更改和執行節點)

        兩種架構都在張量上運作,把任何模型都看作一個有向非循環圖(DAG),但對于如何定義它們,PyTorch 和 TensorFlow 差別很大。

在便利性和上手難度上,PyTorch 遠勝于TensorFlow ,

(1)、原因是PyTorch 是基于動态圖,而TensorFlow 是基于靜态計算圖,是以PyTorch 能随時列印tensor的值,但是TensorFlow 需要設定回調的方法才能列印.

如果想在TensorFlow 中想判斷一個變量的值的正确性,隻能使用assert方法,這一點确實TensorFlow 不及PyTorch ,

上手難度上PyTorch 也是比TensorFlow 容易。

        TensorFlow 遵循“資料即是代碼,代碼就是資料”的理念。在 TensorFlow 中,在跑模型之前會靜态的定義圖形。和外界的所有聯系都是通過 tf.Session 對象和 tf.Placeholder,它們都是會在模型運作被外部資料取代的張量。

        在 PyTorch 中,會更動态一些:你可以随着進展定義、更改和執行節點,沒有特殊的會話界面或占位符。

        整體來看,PyTorch 和 Python 結合的更緊湊些,多數時候會感覺更原生。而在 TensorFlow 裡寫東西時,有時你會覺得你的模型好像躲在一堵牆後面一樣,就通過牆上的幾個洞洞跟你交流。當然了,這也看每個人的喜好和品味。 PyTorch 更适用于研究、愛好者和小規模項目的快速原型開發。TensorFlow 更适合大規模部署,尤其是涉及跨平台和嵌入式部署時。

3、TensorFlow —Google—像架構+靜态圖+公司好手,不易調試+額外概念(會話、圖、變量範圍、占位符),序列化更強大+支援移動和嵌入式部署+大規模分布式+強大的可視化工具

      PyTorch 開始會看起來很像一個架構。回想一下,程式設計架構會在特定領域為我們提供有用的抽象,用它們可以很友善的解決具體問題。而這是架構和庫的的本質差別之處。

(1)、TensorFlow基于靜态圖:在 TensorFlow 中,圖結構是靜态的,也就是說圖在「編譯」之後再運作。需要先建構一個計算圖,建構好了之後,這樣一個計算圖是不能夠變的了,然後再傳入不同的資料進去,進行計算。即固定了計算的流程,是以變得不太靈活。

   1)、如果要去改變計算的邏輯,或者随着時間變化的計算邏輯,這樣的動态計算TensorFlow是實作不了的,或者是很麻煩。

(2)、TensorFlow不易調試:調試 TensorFlow 則沒這麼容易。它有兩個選擇,一是從會話中請求你想檢查的變量,而是學會使用 TensorFlow 調試器(tfdbg)。

   1)、TensorFlow 則不同,你可以選擇用一個叫 tfdbg 的特殊工具,它能讓你在運作時評估 TensorFlow 表達式,浏覽所有張量,在會話範圍中操作。當然,無法用它調試 Python 代碼,是以無需單獨使用 pdb。

(3)、TensorFlow上手需學習額外概念—會話、圖、變量範圍、占位符:可以将 TensorFlow 看作是一種嵌入 Python 的程式設計語言。當你編寫 TensorFlow 代碼時,它會被 Python編譯成圖(graph),然後由 TensorFlow 執行引擎運作。

   1)、是以,TensorFlow 還有一些需要額外學習的概念,比如會話(session)、圖、變量範圍、占位符。要讓基本的模型跑起來也需要更多樣闆代碼。上手 TensorFlow 的時間肯定會比 PyTorch 長。

(4)、TensorFlow的序列化更強大:TensorFlow 的 Saver 對象也很容易使用,而且也為檢查點提供了更多選擇。TensorFlow 在序列化方面的主要優勢是整個計算圖都可以儲存為 protocol buffer。這既包括參數,也包括運算。然後這個圖可以用其它支援的語言(C++、Java)加載。對于不支援 Python 的部署環境來說,這是非常重要的功能。而且理論上,這個功能也可以在你修改模型的源代碼,但又想運作舊模型時為你提供幫助。

(5)、TensorFlow 支援移動和嵌入式部署:但是在 TensorFlow 上,要将模型部署到安卓或 iOS 上需要不小的工作量,但至少你不必使用 Java 或 C++ 重寫你模型的整個推理部分。

  1)、對于高性能伺服器上的部署,還有 TensorFlow Serving 可用。除了性能方面的優勢,TensorFlow Serving 的另一個重要特性是無需中斷服務,就能實作模型的熱插拔。

(6)、TensorFlow 的資料加載 比較複雜:我還沒找到 TensorFlow 的非常有用的資料加載工具(讀取器、隊列、隊列運作器等等)。部分原因是要将你想并行運作的所有預處理代碼加入到 TensorFlow 圖中并不總是那麼簡單直接(比如計算頻譜圖)。另外,TensorFlow 的 API 本身也更加冗長,學習起來也更難。

(7)、TensorFlow 的裝置管理預設即可:裝置管理的無縫性能非常好,通常你不需要指定任何東西,因為預設的設定就很好。比如說,TensorFlow 假設如果存在可用的 GPU,你就希望在 GPU 上運作。

   1)、TensorFlow 裝置管理的唯一缺陷是它會預設占用所有可用的 GPU 上的所有記憶體,即使真正用到的隻有其中一個。但也有一種簡單的解決方案,就是指定 CUDA_VISIBLE_DEVICES。有時候人們會忘記這一點,就會讓 GPU 看起來很繁忙,盡管實際上它們啥也沒幹。

(8)、TensorFlow的強大的可視化工具TensorBoard:TensorBoard 是一個用于可視化訓練機器學習模型各個方面的工具。它是 TensorFlow 項目産出的最有用的功能之一。僅需在訓練腳本中加入少許代碼,你就可以檢視任何模型的訓練曲線和驗證結果。TensorBoard 作為一個網頁服務運作,可以尤其友善地可視化存儲在 headless 節點上的結果。

  1)、展示模型圖形、繪制标量變量、可視化分布和直方圖、可視化圖形  播放音頻

(9)、TensorFlow持支援分布式執行、支援大規模分布式訓練:在GPU的分布式計算上更為出色,在資料量巨大時效率比pytorch要高一些。

4、PyTorch —FaceBook—像庫+動态圖+科研好手,易了解且易調試+結合NumPy更易上手,小規模項目+支援分布式執行+暫時不支援分布式訓練

      TensorFlow 給人的感覺更像是一個庫,而非一個架構:所有的操作都為低階操作,你需要寫很多樣闆代碼,即便你可能并不想寫(比如,一遍又一遍的定義方差和權重···)。

(1)、PyTorch基于動态圖:建立和運作計算圖可能是這兩個架構差别最大的地方。在 PyTorch 中,圖結構是動态的,也就是說圖是在運作時建立的。即就和python的邏輯是一樣的,要對變量做任何操作都是靈活的。

(2)、PyTorch容易了解且易調試: 簡單的圖建構方式更容易了解,但也許更重要的是也更容易調試。調試 PyTorch 代碼就跟調試 Python 代碼一樣。你可以使用 pdb,并且可以在任何地方設定斷點。

  1)、 PyTorch 的計算圖是在運作時定義,可以用 pdb,ipdb,PyCharm 這些 Python 調試工具或者以前的可靠的列印語句也行。

(3)、PyTorch結合NumPy更易上手:PyTorch 本質上是支援 GPU 的 NumPy 替代,配備了可用于建構和訓練深度神經網絡的更進階的功能。是以如果你熟悉 NumPy、Python 和常用的深度學習抽象(卷積層、循環層、SGD 等),那 PyTorch 就很容易學。

(4)、PyTorch序列化的API比較簡單:在這兩種架構中,儲存和加載模型都很簡單。PyTorch 有一個非常簡單的 API,既可以儲存模型的所有權重,也可以 pickle(加工)整個類。

(5)、PyTorch不支援移動和嵌入式部署:而包括 PyTorch 在内的很多深度學習架構都沒有這個能力。

(6)、PyTorch的資料加載 API 設計得很好:資料集、采樣器和資料加載器的接口都是特定的。資料加載器可以接收一個資料集和一個采樣器,并根據該采樣器的排程得出資料集上的一個疊代器(iterator)。并行化資料加載很簡單,隻需為資料加載器傳遞一個 num_workers 參數即可。

(7)、PyTorch 的裝置管理必須指定:而在 PyTorch 中,你必須在啟用了 CUDA 之後明确地将所有東西移到 GPU 上。

(8)、PyTorch 的可視化隻能調用matplotlib 、seaborn等庫:目前 PyTorch 并沒有可以和 Tensorboard 匹敵的工具,不過倒是存在一些內建功能。雖然也能用一些繪圖工具比如 matplotlib 和 seaborn

(9)、PyTorch 支援支援分布式執行、暫時不支援分布式訓練: