Keras vs PyTorch:誰是「第一」深度學習框架?

機器之心發表於2018-07-03

選自Deepsense.ai,作者:Rafał Jakubanis、Piotr Migdal,機器之心編譯。

「第一個深度學習框架該怎麼選」對於初學者而言一直是個頭疼的問題。本文中,來自 deepsense.ai 的研究員給出了他們在高階框架上的答案。在 Keras 與 PyTorch 的對比中,作者還給出了相同神經網路在不同框架中效能的基準測試結果。目前在 GitHub 上,Keras 有超過 31,000 個 Stars,而晚些出現的 PyTorch 已有近 17,000 個 Stars。

值得一提的是,儘管在 4 月底 PyTorch 在 0.4 版本中已經加入了對於 Windows 的支援,但其對比 Keras 與 TensorFlow 在 Windows 上的穩定性還略有差距。

兩大框架的連結:

你想學習深度學習嗎?是要將深度學習應用到業務中,還是用深度學習開展副業,抑或只是為了得到一些適合市場需求的技能?無論目標是什麼,選擇合適的深度學習框架是達到目標的第一步。

我們強烈建議你選擇 Keras 或 PyTorch。它們都是非常強大的工具,且不管是學習還是實驗都很有樂趣。我們是從教師和學生的角度考慮的。本文作者 Piotr 在企業舉辦過 Keras 和 PyTorch 研討會,Rafał則正在學習這兩種框架。


簡介

Keras 和 PyTorch 是頗受資料科學家歡迎的深度學習開源框架。

  • Keras 是能夠在 TensorFlow、CNTK、Theano 或 MXNet 上執行的高階 API(或作為 TensorFlow 內的 tf.contrib)。Keras 於 2015 年 3 月首次釋出,之後即因其易用性和語法簡潔性而受到支援,得到快速發展。Keras 是谷歌支援的一款框架。
  • PyTorch 於 2017 年 1 月對外發布,是專注於直接處理陣列表示式的較低階別 API。去年它受到了大量關注,成為學術研究和需要優化自定義表示式的深度學習應用偏好的解決方案。它是 Facebook 支援的一款框架。

在討論二者的具體細節之前,我們想先說明:對於「哪一個框架更好」這個問題我們沒有直接明瞭的答案。選擇哪一個框架最終取決於你的技術背景、需求和期望。本文旨在幫助你更好地瞭解何時應該選擇 Keras 或 PyTorch。


一句話總結

Keras 更容易學習和用標準層進行實驗,即插即用;PyTorch 提供一種較低階別的方法,對於更具備數學背景的使用者來講靈活性更強。


所以說為何不用其他框架呢?

本文不討論選擇 TensorFlow 作為首選深度學習框架的優劣勢,因為我們認為 TensorFlow 與 Keras(TensorFlow 的官方高階庫)和 PyTorch 相比對於新手不夠友好。儘管你可以找到一些 Theano 教程,但它已不再處於活躍開發狀態。Caffe 缺少靈活性,Torch 使用 Lua 語言(然而其重寫非常難:))。MXNet、Chainer 和 CNTK 目前應用不那麼廣泛。


Keras vs PyTorch:易用性和靈活性

Keras 和 PyTorch 的執行抽象層次不同。

Keras 是一個更高階別的框架,將常用的深度學習層和運算封裝進乾淨、樂高大小的構造塊,使資料科學家不用再考慮深度學習的複雜度。

PyTorch 提供一個相對較低階別的實驗環境,使使用者可以更加自由地寫自定義層、檢視數值優化任務。當你可以使用 Python 的全部能量,訪問使用的所有函式的核心,則複雜架構的開發更加直接。這自然會以冗長為代價。

下面用在 Keras 和 PyTorch 中定義的簡單卷積網路來對二者進行對比:


Keras

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPool2D())
model.add(Conv2D(16, (3, 3), activation='relu'))
model.add(MaxPool2D())
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
複製程式碼


PyTorch

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(3, 32, 3)
        self.conv2 = nn.Conv2d(32, 16, 3)
        self.fc1 = nn.Linear(16 * 6 * 6, 10) 
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 6 * 6)
        x = F.log_softmax(self.fc1(x), dim=-1)

        return x

model = Net()
複製程式碼

上述程式碼片段顯示了兩個框架的些微不同。至於模型訓練,它在 PyTorch 中需要大約 20 行程式碼,而在 Keras 中只需要一行。GPU 加速在 Keras 中可以進行隱式地處理,而 PyTorch 需要我們指定何時在 CPU 和 GPU 間遷移資料。

如果你是新手,那麼 Keras 作為更高階別的框架可能具備明顯優勢。Keras 確實可讀性更強,更加簡練,允許使用者跳過一些實現細節,更快地構建自己的第一個端到端深度學習模型。但是,忽略這些細節會限制使用者探索深度學習流程中每個計算模組內在工作原理的機會。使用 PyTorch 會提供更多機會,來更深入地思考深度學習核心概念,如反向傳播以及其他訓練過程。

也就是說,Keras 雖然比 PyTorch 簡單得多,但它絕不是「玩具」,它是初學者以及經驗豐富的資料科學家使用的正經深度學習工具。

例如,在 DSTL 衛星影象特徵檢測 Kaggle 競賽中,最優秀的 3 支隊伍的解決方案都使用了 Keras,第四名(deepsense.ai 隊伍)使用了 PyTorch 和 Keras。

你的深度學習應用所需的靈活性是否超出 Keras 能夠提供的靈活性值得考慮。根據你的需求,遵循 Rule of least power,Keras 可能是最完美的解決方案。


結論

  • Keras:更簡練,更簡單的 API
  • PyTorch:更靈活,鼓勵使用者更深入地理解深度學習概念


Keras vs PyTorch:流行度和可獲取學習資源

框架流行度不僅代表了易用性,社群支援也很重要——教程、程式碼庫和討論組。截至 2018 年 6 月,Keras 和 PyTorch 的流行度不斷增長,不管是 GitHub 還是 arXiv 論文(注意大部分提及 Keras 的論文也提到它的 TensorFlow 後端)。根據 KDnuggets 調查,Keras 和 PyTorch 是增長最快的資料科學工具。

Keras vs PyTorch:誰是「第一」深度學習框架?
Keras vs PyTorch:誰是「第一」深度學習框架?

儘管兩個框架的文件都比較好,但是 PyTorch 的社群支援更強大:其討論板很值得訪問,其中能找到你在文件或 StackOverflow 中找不到的答案。

我們發現基於 Keras 的初學者深度學習課程要比基於 PyTorch 的課程簡單,這使得前者更容易受初學者喜歡。Keras 的程式碼可讀性和無與倫比的易用性使它被深度學習愛好者、教師和實力派 Kaggle 冠軍廣泛使用。

偉大的 Keras 資源和深度學習課程示例,參見 Piotr Migdał寫的文章《Starting deep learning hands-on: image classification on CIFAR-10》,以及 Keras 建立者 François Chollet 寫的書《Deep Learning with Python》。至於 PyTorch 資源,我們推薦官方教程,提供了稍微更有挑戰性的綜合方法來學習神經網路的內在工作原理。


結論

  • Keras:大量可獲取教程和可重用程式碼
  • PyTorch:卓越的社群支援和活躍的開發


Keras vs PyTorch:debug 和內省

Keras 封裝了大量計算模組,這使得確定導致問題的程式碼較為困難。

相比起來,PyTorch 更加詳細,我們可以逐行執行指令碼。和 debug NumPy 類似,我們可以輕鬆訪問程式碼中的所有物件,使用 print 語句(或任何標準 Python debug 語句)檢視有問題的程式碼。

Keras 使用者建立的標準網路要比 PyTorch 使用者建立的標準網路出錯的機率小一個數量級。但是一旦出錯,則損害巨大,且通常很難定位出錯的程式碼行。PyTorch 提供更直接了當的 debug 經驗,而無需關注模型複雜度。此外,當你懷疑哪裡出錯時,你可以查詢 PyTorch repo 檢視可讀程式碼。


結論

  • PyTorch:debug 能力更強
  • Keras:debug 簡單網路的需求的(潛在)頻率更低


Keras vs PyTorch:匯出模型和跨平臺可移植性

在生產環境中,匯出和部署自己訓練的模型時有哪些選擇?

PyTorch 將模型儲存在 Pickles 中,Pickles 基於 Python,且不可移植,而 Keras 利用 JSON + H5 檔案格式這種更安全的方法(儘管在 Keras 中儲存自定義層通常更困難)。另一方面,Keras 也有 R 語言介面,如果你合作的資料分析師團隊使用 R 語言,那麼你會用得上它。

Keras 是在 TensorFlow 上執行的,這意味著它可以通過 TensorFlow for Mobile 和 TensorFlow Lite 享有更多選擇來部署到移動平臺。你編寫的 web 應用也可以通過 TensorFlow.js 或 Keras.js 部署到網頁上。例如,你可以看看這個深度學習驅動的瀏覽器外掛,它可以檢測密集恐懼症觸發因素:github.com/cytadela8/t…

匯出 PyTorch 模型的過程由於其 Python 程式碼的限制而更加費力,目前人們廣泛採用的方法是首先使用 ONNX 將 PyTorch 模型轉換為 Caffe2 形式。


結論

  • Keras 獲勝:它有更多的部署選項(直接通過 TensorFlow 後端),模型匯出也更簡單。


Keras vs PyTorch:效能篇

Donald Knuth 有一句名言:不成熟的優化是程式設計中所有邪惡(至少大部分)的根源。

在大多數情況下,基準測試中的速度差異不應該成為框架選擇的主要標準——特別是在學習階段。GPU 時間比其資料科學家的時間顯然便宜得多。而且,在學習過程中,效能瓶頸大多是由失敗的實現、未優化的網路和資料載入造成的,而不是框架本身的執行速度。當然,為了完整地進行比較,我們還是要介紹這一方面。在這裡我們推薦兩個效能對比結果:

PyTorch 和 TensorFlow 一樣快,在迴圈神經網路上或許更快,相比之下,Keras 通常速度較慢。正如第一篇文章的作者指出的那樣:大多數情況下,高效能框架(即 PyTorch 和 TensorFlow)的計算效率優勢不敵快速開發環境以及 Keras 提供的實驗易用性。

Keras vs PyTorch:誰是「第一」深度學習框架?
Keras vs PyTorch:誰是「第一」深度學習框架?

結論

  • 就訓練速度而言,PyTorch 勝過 Keras


Keras vs PyTorch:對比總結

Keras 和 PyTorch 都是深度學習框架初學者非常棒的選擇。如果你是數學家、研究員或者想要理解模型的本質,那麼可以考慮選擇 PyTorch。在需要更先進的定製化和 debug 時(例如用 YOLOv3 做目標檢測或者帶有注意力的 LSTM),或者當我們需要優化陣列表示式而不是神經網路時(例如矩陣分解或者 word2vec 演算法),PyTorch 真的很棒。

如果你想要一個即插即用的框架,Keras 無疑是更簡單的選擇:快速構建、訓練、評估模型,不需要在數學實現上花費太多的時間。

深度學習的核心概念知識是可轉移的。一旦你掌握了一個環境中的基礎知識,你就能學以致用,掌握新的深度學習庫。

我們鼓勵你在 Keras 和 PyTorch 中都嘗試下簡單的深度學習模型。

Keras vs PyTorch:誰是「第一」深度學習框架?

原文連結:deepsense.ai/keras-or-py…


相關文章