過去幾年里,Keras 和 PyTorch 日益成為廣受用戶歡迎的兩種深度學(xué)習(xí)庫(kù),因?yàn)樗鼈兪褂闷饋?lái)比 TensorFlow 簡(jiǎn)單多了。 本文將分別對(duì) Keras 和 PyTorch 的四個(gè)方面進(jìn)行比較,你可以根據(jù)兩種框架的優(yōu)劣勢(shì)以及自身的需要選擇其中一種。 Keras 于 2015 年 3 月首次發(fā)布,是能夠在 TensorFlow、CNTK、Theano 或 MXNet 上運(yùn)行的高級(jí) API(或作為 TensorFlow 內(nèi)的 tf.contrib)。Keras 的突出特點(diǎn)在于其易用性,它是迄今為止最容易上手且能夠快速運(yùn)行的框架。此外,Keras 能夠直觀地定義神經(jīng)網(wǎng)絡(luò),函數(shù)式 API 的使用令用戶可以將層定義為函數(shù)。 PyTorch 于 2016 年 10 月發(fā)布,由 Facebook AI 研究團(tuán)隊(duì)開發(fā),是專注于直接處理數(shù)組表達(dá)式的較低級(jí)別 API。與 Keras 相比,你能夠擁有更強(qiáng)的靈活度以及對(duì) PyTorch 的控制,同時(shí)又不需要進(jìn)行太多的聲明式編程(declarative programming)。 有時(shí),深度學(xué)習(xí)從業(yè)者會(huì)糾結(jié)于應(yīng)該使用哪一種框架,這通常取決于個(gè)人喜好。下面將介紹 Keras 和 PyTorch 的幾個(gè)方面對(duì)比,你可據(jù)此做出自己的選擇。 定義模型的類 vs 函數(shù) Keras 在定義深度學(xué)習(xí)模型時(shí)提供函數(shù)式 API。通過函數(shù)式 API,神經(jīng)網(wǎng)絡(luò)被定義為一組序列函數(shù),然后一個(gè)接一個(gè)地得到應(yīng)用。例如,函數(shù)定義層 1 的輸出是函數(shù)定義層 2 的輸入。 在使用 PyTorch 時(shí),用戶將神經(jīng)網(wǎng)絡(luò)設(shè)置為一個(gè)擴(kuò)展了 Torch 庫(kù)中 torch.nn. 模塊的類。與 Keras 類似,PyTorch 為用戶提供作為組件的層,但由于這些層屬于 Python 類,所以它們是類__init__() 方法中的引用,并通過類的 forward() 方法執(zhí)行。 相比而言,PyTorch 能夠令你訪問 Python 的所有類別特征,而不只是簡(jiǎn)單的函數(shù)調(diào)用。定義網(wǎng)絡(luò)變得更加清晰,而且優(yōu)雅。但如果你認(rèn)為以最快的速度編寫網(wǎng)絡(luò)代碼最為重要,則 Keras 對(duì)你來(lái)說(shuō)更加易于使用。 張量和計(jì)算圖 vs 標(biāo)準(zhǔn)陣列 對(duì)于一般程序員來(lái)說(shuō),Keras API 會(huì)隱藏大量的混亂細(xì)節(jié),定義網(wǎng)絡(luò)層也非常直觀。因而,你在默認(rèn)設(shè)置下就足以入門。但當(dāng)你想要實(shí)現(xiàn)一個(gè)非常先進(jìn)或「獨(dú)特的」模型時(shí),才真正需要深入了解低級(jí)和本質(zhì)的 TensorFlow。 但當(dāng)你真正深入了解低級(jí) TensorFlow 代碼時(shí),就會(huì)遇到一些挑戰(zhàn)。你需要確保所有矩陣乘法對(duì)齊。更不要想著將層輸出打印出來(lái)了,因?yàn)槟銜?huì)在終端上打印出一個(gè)很好的張量定義(Tensor definition)。 相較于 Keras,PyTorch 在這些方面往往更加寬容。你只需要了解每個(gè)層的輸入和輸出大小就可以了,并且 PyTorch 在這一點(diǎn)上做得非常好,你可以快速掌握。你不需要構(gòu)建抽象的計(jì)算圖(其內(nèi)部情況你在調(diào)試時(shí)無(wú)法看到)。 PyTorch 的另一個(gè)優(yōu)點(diǎn)在于其平滑性(smoothness),你可以在 Torch 張量和 Numpy 矩陣之間來(lái)回切換。但如果開發(fā)者需要實(shí)現(xiàn)一些自定義內(nèi)容,則 TF 張量和 Numpy 矩陣之間的切換可能會(huì)很麻煩,這要求他們對(duì) TensorFlow 有一個(gè)透徹了解。 實(shí)際上,PyTorch 的交互運(yùn)算更加簡(jiǎn)單,兩步即可:將 Torch 張量(變量對(duì)象)轉(zhuǎn)換成 Numpy,然后進(jìn)行反向運(yùn)算即可。 當(dāng)然,如果你不需要實(shí)現(xiàn)任何獨(dú)特的內(nèi)容,則 Keras 也表現(xiàn)的非常好,因?yàn)槟悴粫?huì)遇到任何 TensorFlow 障礙。但如果想要實(shí)現(xiàn)一些獨(dú)特的內(nèi)容,則 PyTorch 可能會(huì)表現(xiàn)得更加平滑。 訓(xùn)練模型 開始訓(xùn)練 利用 Keras 訓(xùn)練模型超級(jí)簡(jiǎn)單!只需要一個(gè)簡(jiǎn)單的.fit(),你就可以開啟模型訓(xùn)練之旅。 而利用 PyTorch 訓(xùn)練模型包含以下幾個(gè)步驟:
所以,就訓(xùn)練模型來(lái)說(shuō),PyTorch 較為繁瑣。 控制 CPU vs GPU 模式
如果你已經(jīng)安裝了 tensorflow-gpu,則在 Keras 中能夠使用 GPU 并且會(huì)默認(rèn)完成。然后,如果你想要將某些運(yùn)算轉(zhuǎn)移至 CPU,則可以以單行方式完成。 但對(duì)于 PyTorch 來(lái)說(shuō),你必須顯式地為每個(gè) torch 張量和 numpy 變量啟動(dòng) GPU。這樣代碼會(huì)比較混亂。并且如果你想在 CPU 和 GPU 之間來(lái)回移動(dòng)以執(zhí)行不同運(yùn)算,則很容易出錯(cuò)。 例如,為了將之前的模型轉(zhuǎn)移到 GPU 上運(yùn)行,則需要以下步驟: 因而,Keras 在簡(jiǎn)潔性和默認(rèn)設(shè)置方面優(yōu)于 PyTorch。 作者通常建議初學(xué)者從 Keras 開始。Keras 絕對(duì)是理解和使用起來(lái)最簡(jiǎn)單的框架,能夠很快地上手運(yùn)行。你完全不需要擔(dān)心 GPU 設(shè)置、處理抽象代碼以及其他任何復(fù)雜的事情。你甚至可以在不接觸任何 TensorFlow 單行代碼的情況下,實(shí)現(xiàn)自定義層和損失函數(shù)。 但如果你開始深度了解到深度網(wǎng)絡(luò)的更細(xì)粒度層面或者正在實(shí)現(xiàn)一些非標(biāo)準(zhǔn)的事情,則 PyTorch 是你的首選庫(kù)。使用 PyTorch 需要進(jìn)行一些額外操作,但這不會(huì)減緩你的進(jìn)程。你依然能夠快速實(shí)現(xiàn)、訓(xùn)練和測(cè)試網(wǎng)絡(luò),并享受簡(jiǎn)單調(diào)試帶來(lái)的額外益處。 參考鏈接:https:///keras-vs-pytorch-for-deep-learning-a013cb63870d 轉(zhuǎn)自機(jī)器之心 |
|
來(lái)自: LibraryPKU > 《機(jī)器學(xué)習(xí)》