決戰紫禁之巔之深度學習框架篇:Keras VS PyTorch
選自towardsdatascience
作者:George Seif
機器之心編譯
參與:杜偉、一鳴
Keras和PyTorch之爭由來已久。一年前,機器之心就曾做過此方面的探討:《Keras vs PyTorch:誰是「第一」深度學習框架?》。現在PyTorch已經升級到1.x版本,而Keras也在進一步發展,情況發生了怎樣的變化呢?本文從四個方面對Keras和PyTorch各自的優劣勢做了進一步詳述,相信讀者會對如何選擇適合自己的框架有更清楚的認知。
TensorFlow 是很多科學家、工程師和開發人員的首個深度學習框架。雖然 TensorFlow 1.0 早在 2017 年 2 月就發布了,但使用過程中對用戶不太友好。
過去幾年裡,Keras 和 PyTorch 日益成為廣受用戶歡迎的兩種深度學習庫,因為它們使用起來比 TensorFlow 簡單多了。
本文將分別對 Keras 和 PyTorch 的四個方面進行比較,你可以根據兩種框架的優劣勢以及自身的需要選擇其中一種。
Keras 和 PyTorch 簡介
Keras 於 2015 年 3 月首次發布,是能夠在 TensorFlow、CNTK、Theano 或 MXNet 上運行的高級 API(或作為 TensorFlow 內的 tf.contrib)。Keras 的突出特點在於其易用性,它是迄今為止最容易上手且能夠快速運行的框架。此外,Keras 能夠直觀地定義神經網路,函數式 API 的使用令用戶可以將層定義為函數。
PyTorch 於 2016 年 10 月發布,由 Facebook AI 研究團隊開發,是專註於直接處理數組表達式的較低級別 API。與 Keras 相比,你能夠擁有更強的靈活度以及對 PyTorch 的控制,同時又不需要進行太多的聲明式編程(declarative programming)。
選擇 Keras 還是 PyTorch?
有時,深度學習從業者會糾結於應該使用哪一種框架,這通常取決於個人喜好。下面將介紹 Keras 和 PyTorch 的幾個方面對比,你可據此做出自己的選擇。
定義模型的類 vs 函數
Keras 在定義深度學習模型時提供函數式 API。通過函數式 API,神經網路被定義為一組序列函數,然後一個接一個地得到應用。例如,函數定義層 1 的輸出是函數定義層 2 的輸入。
在使用 PyTorch 時,用戶將神經網路設置為一個擴展了 Torch 庫中 torch.nn. 模塊的類。與 Keras 類似,PyTorch 為用戶提供作為組件的層,但由於這些層屬於 Python 類,所以它們是類__init__() 方法中的引用,並通過類的 forward() 方法執行。
相比而言,PyTorch 能夠令你訪問 Python 的所有類別特徵,而不只是簡單的函數調用。定義網路變得更加清晰,而且優雅。但如果你認為以最快的速度編寫網路代碼最為重要,則 Keras 對你來說更加易於使用。
張量和計算圖 vs 標準陣列
對於一般程序員來說,Keras API 會隱藏大量的混亂細節,定義網路層也非常直觀。因而,你在默認設置下就足以入門。但當你想要實現一個非常先進或「獨特的」模型時,才真正需要深入了解低級和本質的 TensorFlow。
但當你真正深入了解低級 TensorFlow 代碼時,就會遇到一些挑戰。你需要確保所有矩陣乘法對齊。更不要想著將層輸出列印出來了,因為你會在終端上列印出一個很好的張量定義(Tensor definition)。
相較於 Keras,PyTorch 在這些方面往往更加寬容。你只需要了解每個層的輸入和輸出大小就可以了,並且 PyTorch 在這一點上做得非常好,你可以快速掌握。你不需要構建抽象的計算圖(其內部情況你在調試時無法看到)。
PyTorch 的另一個優點在於其平滑性(smoothness),你可以在 Torch 張量和 Numpy 矩陣之間來回切換。但如果開發者需要實現一些自定義內容,則 TF 張量和 Numpy 矩陣之間的切換可能會很麻煩,這要求他們對 TensorFlow 有一個透徹了解。
實際上,PyTorch 的交互運算更加簡單,兩步即可:將 Torch 張量(變數對象)轉換成 Numpy,然後進行反向運算即可。
當然,如果你不需要實現任何獨特的內容,則 Keras 也表現的非常好,因為你不會遇到任何 TensorFlow 障礙。但如果想要實現一些獨特的內容,則 PyTorch 可能會表現得更加平滑。
訓練模型
開始訓練
利用 Keras 訓練模型超級簡單!只需要一個簡單的.fit(),你就可以開啟模型訓練之旅。
而利用 PyTorch 訓練模型包含以下幾個步驟:
每一批次的訓練開始時初始化梯度
在模型中運行前向傳播
運行後向傳播
計算損失和更新權重
所以,就訓練模型來說,PyTorch 較為繁瑣。
控制 CPU vs GPU 模式
我們需要更多算力。
如果你已經安裝了 tensorflow-gpu,則在 Keras 中能夠使用 GPU 並且會默認完成。然後,如果你想要將某些運算轉移至 CPU,則可以以單行方式完成。
但對於 PyTorch 來說,你必須顯式地為每個 torch 張量和 numpy 變數啟動 GPU。這樣代碼會比較混亂。並且如果你想在 CPU 和 GPU 之間來回移動以執行不同運算,則很容易出錯。
例如,為了將之前的模型轉移到 GPU 上運行,則需要以下步驟:
因而,Keras 在簡潔性和默認設置方面優於 PyTorch。
選擇 Keras 或 PyTorch 的一般性建議
作者通常建議初學者從 Keras 開始。Keras 絕對是理解和使用起來最簡單的框架,能夠很快地上手運行。你完全不需要擔心 GPU 設置、處理抽象代碼以及其他任何複雜的事情。你甚至可以在不接觸任何 TensorFlow 單行代碼的情況下,實現自定義層和損失函數。
但如果你開始深度了解到深度網路的更細粒度層面或者正在實現一些非標準的事情,則 PyTorch 是你的首選庫。使用 PyTorch 需要進行一些額外操作,但這不會減緩你的進程。你依然能夠快速實現、訓練和測試網路,並享受簡單調試帶來的額外益處。
參考鏈接:https://towardsdatascience.com/keras-vs-pytorch-for-deep-learning-a013cb63870d
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
------------------------------------------------
※系統探討「跨語言詞嵌入」,這是一本剛出爐新書
※做數據只知道Excel?Jupyter Notebook也要學起來了
TAG:機器之心 |