如果你需要深度學(xué)習(xí)模型,那么 PyTorch 和 TensorFlow 都是不錯(cuò)的選擇。
并非每個(gè)回歸或分類問題都需要通過深度學(xué)習(xí)來解決。甚至可以說,并非每個(gè)回歸或分類問題都需要通過機(jī)器學(xué)習(xí)來解決。畢竟,許多數(shù)據(jù)集可以用解析方法或簡(jiǎn)單的統(tǒng)計(jì)過程進(jìn)行建模。
另一方面,在某些情況下,深度學(xué)習(xí)或深度遷移學(xué)習(xí)可以幫助你訓(xùn)練更準(zhǔn)確的模型。在這些情況下,你可以考慮使用 PyTorch 和 TensorFlow ,特別是如果你所需的訓(xùn)練模型與其中一個(gè)框架模型庫中的模型類似。
PyTorch
PyTorch 建立在舊版的 Torch 和 Caffe2 框架之上。如其名所示,PyTorch采用了腳本語言 Python,并利用改版后的Torch C/CUDA作為后端。PyTorch 項(xiàng)目還融入了 Caffe2 的生產(chǎn)功能。
PyTorch 被稱為“擁有強(qiáng)大 GPU 加速功能的 Python 版 Tensor 和動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)?!边@意味著什么?
Tensor(張量)是一種物理學(xué)和工程學(xué)中廣泛使用的數(shù)學(xué)結(jié)構(gòu)。2 階的 Tensor 是一種特殊的矩陣;而對(duì)向量和張量取內(nèi)積就可以得到另一個(gè)擁有新長(zhǎng)度和新方向的向量。TensorFlow 這個(gè)名字就來自張量在其網(wǎng)絡(luò)模型中流動(dòng)的方式。NumPy 也用到了 Tensor,名為 ndarray 。
GPU 加速是大多數(shù)現(xiàn)代深度神經(jīng)網(wǎng)絡(luò)框架的基礎(chǔ)。動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)是一種特殊的神經(jīng)網(wǎng)絡(luò),每次迭代都會(huì)發(fā)生變化,例如,PyTorch 模型可以在訓(xùn)練期間通過添加和刪除隱藏層,來提高其準(zhǔn)確性和通用性。
PyTorch 會(huì)在每個(gè)迭代中實(shí)時(shí)重建計(jì)算圖。相比之下,在默認(rèn)情況下TensorFlow 會(huì)創(chuàng)建一個(gè)計(jì)算圖,優(yōu)化圖代碼以提高性能,然后訓(xùn)練模型。
雖然急切執(zhí)行模式在 TensorFlow 中剛剛出現(xiàn),但其是 PyTorch 唯一的運(yùn)行方式:API 在被調(diào)用時(shí)會(huì)立即執(zhí)行,而不會(huì)被添加到計(jì)算圖稍后再運(yùn)行。這樣可能看起來計(jì)算效率會(huì)低一些,但是 PyTorch 設(shè)計(jì)的工作方式就是如此,而且實(shí)際上在訓(xùn)練或預(yù)測(cè)速度方面并不遜色。
PyTorch 通過集成加速庫,比如英特爾 MKL、Nvidia cuDNN 和 NCCL 等,最大限度地提升速度。其核心CPU、GPU Tensor和神經(jīng)網(wǎng)絡(luò)后端TH(Torch)、THC(Torch CUDA)、THNN(Torch神經(jīng)網(wǎng)絡(luò))和THCUNN(Torch CUDA神經(jīng)網(wǎng)絡(luò))等,都是使用 C99 API 編寫的單獨(dú)庫。同時(shí),PyTorch 并不是整體式 C++ 框架的 Python 綁定。其目的是與Python 深度集成,并允許使用其他 Python 庫。
Fast.ai與fastai庫
fastai 庫基于 PyTorch,通過現(xiàn)代化的最佳實(shí)踐簡(jiǎn)化了快速準(zhǔn)確的神經(jīng)網(wǎng)絡(luò)訓(xùn)練。它基于對(duì) Fast.ai 深度學(xué)習(xí)最佳實(shí)踐的研究,提供了包括視覺、文本、表格和協(xié)作(協(xié)作過濾)模型在內(nèi)的“開箱即用”支持。
fastai 庫與 PyTorch 的關(guān)系非常類似于 Keras 與 TensorFlow 。但明顯的區(qū)別在于,PyTorch 沒有正式支持 fastai 。
TensorFlow
TensorFlow 是眾多優(yōu)秀的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)框架中最成熟的一個(gè),也是研究論文中引用最多的一個(gè)(即使不算來自谷歌員工的引用也是第一),而且在生產(chǎn)中的使用效果也很好。它可能不是最容易學(xué)習(xí)的框架,但隨著 TensorFlow 2的到來,TensorFlow 的門檻也沒有 2016 年那般高了。TensorFlow 是許多 Google 服務(wù)的基礎(chǔ)。
TensorFlow 2.0 官網(wǎng)對(duì)該項(xiàng)目的描述為:“端到端的開源機(jī)器學(xué)習(xí)平臺(tái)?!保雀柰ㄟ^“平臺(tái)”提供了一個(gè)包含工具、庫以及社區(qū)資源的全方位生態(tài)系統(tǒng),研究人員可以利用這個(gè)平臺(tái)“推動(dòng)機(jī)器學(xué)習(xí)達(dá)到最高水準(zhǔn)”,而開發(fā)人員則可以利用這個(gè)平臺(tái)輕松構(gòu)建和部署基于 AI 的應(yīng)用程序。
TensorFlow 2.0 有四個(gè)主要部分組成:
TensorFlow 核心,一個(gè)用于開發(fā)和培訓(xùn)機(jī)器學(xué)習(xí)模型的開源庫;
TensorFlow.js,一個(gè)在 Web 瀏覽器和 Node.js 上訓(xùn)練和部署模型的 JavaScript庫;
TensorFlow Lite,一個(gè)輕量級(jí)庫,用于在移動(dòng)和嵌入式設(shè)備上部署模型;
TensorFlow Extended,是一個(gè)端到端平臺(tái),用于在大型生產(chǎn)環(huán)境中準(zhǔn)備數(shù)據(jù)、培訓(xùn)、驗(yàn)證和部署模型。
TensorFlow 2.0 的重點(diǎn)放在了簡(jiǎn)單性和易用性上,其這個(gè)版本擁有一系列的新功能,包括急切執(zhí)行、直觀的高級(jí) API 以及可以在任何平臺(tái)上構(gòu)建模型等。急切執(zhí)行意味著 TensorFlow 代碼定義好就可以運(yùn)行,而 TensorFlow 最初的模式需要將節(jié)點(diǎn)和邊添加到計(jì)算圖中,稍后再在會(huì)話中運(yùn)行。
高效地使用 TensorFlow 2.0 方法是,使用高級(jí)的 tf.keras API(而不是舊的低級(jí) AP,這樣可以大大減少需要編寫的代碼量。只需要使用一行代碼就可以構(gòu)建 Keras 神經(jīng)網(wǎng)絡(luò)中的一層,如果利用循環(huán)結(jié)構(gòu),則可以進(jìn)一步減少代碼量。
TensorFlow.js 是一個(gè)利用 JavaScript 開發(fā)和訓(xùn)練機(jī)器學(xué)習(xí)模型,并在瀏覽器或 Node.js 中部署模型的庫。在 TensorFlow.js、ml5.js 之上還有一個(gè)高級(jí)庫,它隱藏了張量和優(yōu)化器的復(fù)雜性。
TensorFlow.js 可以通過瀏覽器支持移動(dòng)設(shè)備和桌面設(shè)備。如果你的瀏覽器支持 WebGL 著色器 API,TensorFlow.js 可以利用它們發(fā)揮 GPU 的優(yōu)勢(shì)。與CPU 后端相比,這可以為你提供高達(dá) 100 倍的加速。在擁有 GPU 的計(jì)算機(jī)上,TensorFlow.js 可以非??焖俚卦跒g覽器中運(yùn)行。
TensorFlow Lite 是一個(gè)用于移動(dòng)設(shè)備的開源深度學(xué)習(xí)框架。目前它可以為iOS、ARM64 和 Raspberry Pi 構(gòu)建模型。TensorFlow Lite 有兩個(gè)主要組件:解釋器和轉(zhuǎn)換器。解釋器可以在許多不同的硬件類型上運(yùn)行經(jīng)過特別優(yōu)化的模型。轉(zhuǎn)換器可以將 TensorFlow 模型轉(zhuǎn)換為高效的形式供解釋器使用,還可引入優(yōu)化以縮小可執(zhí)行文件大小并提高性能。
TensorFlow Extended(TFX)是用于部署生產(chǎn)機(jī)器學(xué)習(xí)管道的端到端平臺(tái)。在你訓(xùn)練好一個(gè)模型后,就需要考慮這方面的工作了。管道包括數(shù)據(jù)驗(yàn)證、功能工程、建模、模型評(píng)估、服務(wù)推斷以及管理在線、原生移動(dòng)和 JavaScript 目標(biāo)的部署。
Keras
Keras 是用于構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的高級(jí)前端規(guī)范和實(shí)現(xiàn)。Keras 支持三種后端深度學(xué)習(xí)框架:TensorFlow、CNTK 和 Theano。目前亞馬遜正在全力為Keras 開發(fā) MXNet 后端。你也可以使用 PlaidML(一個(gè)獨(dú)立的項(xiàng)目)作為Keras 的后端,利用 PlaidML 的 OpenCL 支持所有 GPU 的優(yōu)勢(shì)。
TensorFlow是Keras的默認(rèn)后端,在很多情況下我們也推薦使用TensorFlow,包括通過 CUDA 和 cuDNN 在 Nvidia 硬件上實(shí)現(xiàn) GPU 加速,以及利用 Google Cloud 中的 Tensor 處理單元加速等。Keras 除了可以單獨(dú)安裝之外,TensorFlow 還包含一個(gè)內(nèi)部 tf.keras 類。如上所述,這是TensorFlow 的首選高級(jí)前端。
Keras 提供了一個(gè)高級(jí)環(huán)境,在其 Sequential 模型中向神經(jīng)網(wǎng)絡(luò)添加一層的代碼量可以縮減到一行,編譯和訓(xùn)練模型也分別只需一個(gè)函數(shù)調(diào)用。如果有需要,Keras 也允許你通過其 Model 或函數(shù)式 API 接觸較低層上的代碼。
你還可以利用 Keras 的子類 keras.Model 進(jìn)一步深入,一直到 Python 代碼級(jí)別,直到找到你喜歡的功能 API 。另外,它還有 Scikit-learn API,因此你可以利用 Scikit-learn 網(wǎng)格搜索在 Keras 模型中執(zhí)行超參數(shù)優(yōu)化。
深度學(xué)習(xí)與遷移學(xué)習(xí)
PyTorch 和 TensorFlow 都支持深度學(xué)習(xí)和遷移學(xué)習(xí)。遷移學(xué)習(xí)(有時(shí)稱為自定義機(jī)器學(xué)習(xí))可以從預(yù)先訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型開始,只需為你的數(shù)據(jù)定制最終層即可。
從頭開始訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)非常耗時(shí),并且需要大量標(biāo)記數(shù)據(jù)。遷移學(xué)習(xí)花費(fèi)的時(shí)間更少,而且需要的新標(biāo)記樣本更少,但只有在模型已預(yù)先訓(xùn)練好的情況下,你才可以使用遷移學(xué)習(xí)。幸運(yùn)的是,所有主流的深度學(xué)習(xí)框架都提供了某種形式的模型庫供你挑選模型。
圖像分類中使用的卷積神經(jīng)網(wǎng)絡(luò)(也稱為 ConvNets 或 CNN )是遷移學(xué)習(xí)的代表。PyTorch 和 TensorFlow 都提供了有關(guān)如何使用遷移學(xué)習(xí)來訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)的教程。TensorFlow 的遷移學(xué)習(xí)教程演示了如何使用遷移學(xué)習(xí)提取和微調(diào)特征。PyTorch 的遷移學(xué)習(xí)教程也演示了相同的兩種方法。
實(shí)際上,很少有人從頭開始訓(xùn)練整個(gè)卷積網(wǎng)絡(luò)(利用隨機(jī)的初始化),因?yàn)槟愫茈y擁有足夠大的數(shù)據(jù)集。相反,一般人們會(huì)在非常大的數(shù)據(jù)集(例如ImageNet,其中包含 1,000 個(gè)類別的 120 萬個(gè)圖像)上預(yù)先訓(xùn)練ConvNet,然后以 ConvNet 為起點(diǎn)或通過 ConvNet 提取感興趣的特征。
如何選擇深度學(xué)習(xí)框架
在 PC 和 Mac 出現(xiàn)的早期,人們經(jīng)常會(huì)問我應(yīng)該買哪個(gè)。其實(shí),這個(gè)問題沒有正確的答案,因?yàn)檫@個(gè)問題本身就是一個(gè)錯(cuò)誤,或者我應(yīng)該說“那要看你想用這臺(tái)電腦干什么”,但一般在我問他們幾個(gè)問題后,他們就能找到自己的答案,比如“你想用這臺(tái)電腦干什么?”,或者“你有什么不可或缺的應(yīng)用嗎?”
同樣,“我應(yīng)該使用哪種深度學(xué)習(xí)框架?”也算不上一個(gè)真正的問題。這個(gè)問題同樣取決于你自己,比如首先想一想“你想用你的模型干什么?”,然后再深入研究你可以用于訓(xùn)練的數(shù)據(jù)類型。
如果你不熟悉深度學(xué)習(xí),那么我建議你先閱讀 TensorFlow 2 中的 Keras 教程,以及 PyTorch 中的 fastai 教程。即使不深入了解 TensorFlow 和PyTorch 的低級(jí) API ,你也有很多東西需要學(xué)習(xí),而且你應(yīng)該對(duì)這兩種方法都有所了解。然后,你可能會(huì)意識(shí)到這兩個(gè)框架的確有多相似之處,而且它們賴以生存的概念和技術(shù)都是相同的。
在很多情況下,選用哪種框架無關(guān)緊要:你會(huì)發(fā)現(xiàn)每個(gè)框架可用的模型基本相同。在某些特定的情況下,可能某個(gè)框架優(yōu)于另一個(gè)——至少在當(dāng)前版本是如此。你可能還會(huì)發(fā)現(xiàn),學(xué)習(xí)其中某一個(gè)更為容易,原因可能是框架中的某些基本功能,也有可能是教程的質(zhì)量。
-
gpu
+關(guān)注
關(guān)注
28文章
4673瀏覽量
128592 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5463瀏覽量
120890 -
pytorch
+關(guān)注
關(guān)注
2文章
802瀏覽量
13115
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論