選自Medium

作者:Karan Jakhar

機器之心編譯

參與:小舟、魔王

如何選擇工具對深度學習初學者是個難題。本文作者以 Keras 和 Pytorch 庫爲例,提供瞭解決該問題的思路。

當你決定學習深度學習時,有一個問題會一直存在——學習哪種工具?

深度學習有很多框架和庫。這篇文章對兩個流行庫 Keras 和 Pytorch 進行了對比,因爲二者都很容易上手,初學者能夠輕鬆掌握。

那麼到底應該選哪一個呢?本文分享了一個解決思路。

做出合適選擇的最佳方法是對每個框架的代碼樣式有一個概覽。開發任何解決方案時首先也是最重要的事就是開發工具。你必須在開始一項工程之前設置好開發工具。一旦開始,就不能一直換工具了,否則會影響你的開發效率。

作爲初學者,你應該多嘗試不同的工具,找到最適合你的那一個。但是當你認真開發一個項目時,這些事應該提前計劃好。

每天都會有新的框架和工具投入市場,而最好的工具能夠在定製和抽象之間做好平衡。工具應該和你的思考方式和代碼樣式同步。因此要想找到適合自己的工具,首先你要多嘗試不同的工具。

我們同時用 Keras 和 PyTorch 訓練一個簡單的模型。如果你是深度學習初學者,對有些概念無法完全理解,不要擔心。從現在開始,專注於這兩個框架的代碼樣式,儘量去想象哪個最適合你,使用哪個工具你最舒服,也最容易適應。

這兩個工具最大的區別在於:PyTorch 默認爲 eager 模式,而 Keras 基於 TensorFlow 和其他框架運行(現在主要是 TensorFlow),其默認模式爲圖模式。最新版本的 TensorFlow 也提供類似 PyTorch 的 eager 模式,但是速度較慢。

如果你熟悉 NumPy,你可以將 PyTorch 視爲有 GPU 支持的 NumPy。此外,現在有多個具備高級 API(如 Keras)且以 PyTorch 爲後端框架的庫,如 Fastai、Lightning、Ignite 等。如果你對它們感興趣,那你選擇 PyTorch 的理由就多了一個。

在不同的框架裏有不同的模型實現方法。讓我們看一下這兩種框架裏的簡單實現。本文提供了 Google Colab 鏈接。打開鏈接,試驗代碼。這可以幫助你找到最適合自己的框架。

我不會給出太多細節,因爲在此,我們的目標是看一下代碼結構,簡單熟悉一下框架的樣式。

Keras 中的模型實現

以下示例是數字識別的實現。代碼很容易理解。你需要打開 colab,試驗代碼,至少自己運行一遍。

Keras 自帶一些樣本數據集,如 MNIST 手寫數字數據集。以上代碼可以加載這些數據,數據集圖像是 NumPy 數組格式。Keras 還做了一點圖像預處理,使數據適用於模型。

以上代碼展示了模型。在 Keras(TensorFlow)上,我們首先需要定義要使用的東西,然後立刻運行。在 Keras 中,我們無法隨時隨地進行試驗,不過 PyTorch 可以。

以上的代碼用於訓練和評估模型。我們可以使用 save() 函數來保存模型,以便後續用 load_model() 函數加載模型。predict() 函數則用來獲取模型在測試數據上的輸出。

現在我們概覽了 Keras 基本模型實現過程,現在來看 PyTorch。

PyTorch 中的模型實現

研究人員大多使用 PyTorch,因爲它比較靈活,代碼樣式也是試驗性的。你可以在 PyTorch 中調整任何事,並控制全部,但控制也伴隨着責任。

在 PyTorch 裏進行試驗是很容易的。因爲你不需要先定義好每一件事再運行。我們能夠輕鬆測試每一步。因此,在 PyTorch 中 debug 要比在 Keras 中容易一些。

接下來,我們來看簡單的數字識別模型實現。

以上代碼導入了必需的庫,並定義了一些變量。n_epochs、momentum 等變量都是必須設置的超參數。此處不討論細節,我們的目的是理解代碼的結構。

以上代碼旨在聲明用於加載訓練所用批量數據的數據加載器。下載數據有很多種方式,不受框架限制。如果你剛開始學習深度學習,以上代碼可能看起來比較複雜。

在此,我們定義了模型。這是一種創建網絡的通用方法。我們擴展了 nn.Module,在前向傳遞中調用 forward() 函數。

PyTorch 的實現比較直接,且能夠根據需要進行修改。

以上代碼段定義了訓練和測試函數。在 Keras 中,我們需要調用 fit() 函數把這些事自動做完。但是在 PyTorch 中,我們必須手動執行這些步驟。像 Fastai 這樣的高級 API 庫會簡化它,訓練所需的代碼也更少。

最後,保存和加載模型,以進行二次訓練或預測。這部分沒有太多差別。PyTorch 模型通常有 pt 或 pth 擴展。

關於框架選擇的建議

學會一種模型並理解其概念後,再轉向另一種模型,並不是件難事,只是需要一些時間。本文作者給出的建議是兩個都學,但是不需要兩個都深入地學。

你應該從一個開始,然後在該框架中實現模型,同時也應當掌握另一個框架的知識。這有助於你閱讀別人用另一個框架寫的代碼。永遠不要被框架限制住。

先從適合自己的框架開始,然後嘗試學習另一個。如果你發現另一個用起來更合適,那麼轉換成另一個。因爲 PyTorch 和 Keras 的大多數核心概念是類似的,二者之間的轉換非常容易。

Colab 鏈接:

PyTorch:https://colab.research.google.com/drive/1irYr0byhK6XZrImiY4nt9wX0fRp3c9mx?usp=sharing

Keras:https://colab.research.google.com/drive/1QH6VOY_uOqZ6wjxP0K8anBAXmI0AwQCm?usp=sharing

原文鏈接:https://medium.com/@karan_jakhar/keras-vs-pytorch-dilemma-dc434e5b5ae0

本文爲機器之心編譯,轉載請聯繫本公衆號獲得授權。

------------------------------------------------

加入機器之心(全職記者 / 實習生): [email protected]

投稿或尋求報道:content @jiqizhixin.com

廣告 & 商務合作: [email protected]

相關文章