TensorFlow、PyTorch 是目前佔有率最高的深度學習框架,初學者常會問『應該選擇PyTorch或 TensorFlow套件』,依個人看法,PyTorch、TensorFlow好比倚天劍與屠龍刀,各有擅場,兩個套件的發展重點有所不同,例如在偵錯方面,PyTorch比較容易,但TensorFlow/Keras建模、訓練、預測都只要一行程式,另外,物件偵測主流演算法YOLO,第四版以TensorFlow開發,第五版則以PyTorch開發,若我們只懂TensorFlow,那就無法使用最新版了。
差異比較
PyTorch 認為兩個主要對手,『TensorFlow 1.x版把簡單的事情複雜化』,『Keras把複雜的事情太過簡化』,因而促使TensorFlow 2.x版依據Keras規格重新開發並納入TensorFlow中,現在Keras已變成TensorFlow最重要的模組。
而PyTorch特色如下:
1. Python First:PyTorch開發團隊認為Python及相關套件功能已經相當強大,不須另外發明輪子(Reinvent the wheel),直接與Python生態環境緊密結合。
2. 除錯容易:TensorFlow/Keras 提供 fit 一行指令即可進行模型訓練,雖然簡單,但不易偵錯(Debug),PyTorch須自行撰寫優化求解的程序,雖然繁瑣,但在過程中可插入任意的程式碼偵錯或查看預測結果、損失函數變化,不必等到模型訓練完成。
3. GPU 記憶體管理較佳,筆者使用GTX1050Ti,記憶體只有4GB 時,同時執行2個以TensorFlow 開發的Notebook 檔案時,常會發生記憶體不足的狀況,但使用PyTorch,即使3、4 個Notebook 檔案也沒有問題。
4. 程式可自行決定變數及模型要在 CPU 或 GPU 運算:雖然比較麻煩,但可優化記憶體的使用,TensorFlow則是自行偵測GPU,如果有。則預設會使用GPU運算,反之,會使用CPU。
一致的學習路徑
雖然存在以上差異,PyTorch與TensorFlow基本設計概念是相通的,採用相同的approach,可以一併學會兩個套件。
梯度下降法是神經網路主要求解的方法,計算過程會使用張量 (Tensor) 運算,另外,在反向傳導的過程中,則要進行偏微分,計算梯度,如下圖:
基於上述求解過程的需求,大多數的深度學習套件至少會具備下列功能:
1. 張量運算:包括各種向量、矩陣運算。
2. 自動微分 (Auto Differentiation):透過偏微分計算梯度。
3. 提供各種神經層 (Layers) 及神經網路 (Neural Network) 模型構建。
因此,學習的路徑可以從簡單的張量運算開始,再逐漸熟悉高階的神經層函數,以奠定扎實的基礎。
在上述學習路徑中,我們會發現TensorFlow/PyTorch基本設計概念是一致的:
1. TensorFlow/PyTorch張量 (Tensor) 均與NumPy陣列相容,不論是資料結構或是運算,包括 Broadcasting 機制。
2. 自動微分、梯度下降也是如此,只是語法不同而已。
3. 都支援順序型 (Sequential)、Functional API模型。
4. 均建議使用 Dataset/Data Loader 作為模型的資料來源。
《開發者傳授 PyTorch 秘笈》/ 陳昭明 著