DL:深度學(xué)習(xí)框架Pytorch,、 Tensorflow各種角度對(duì)比
???????
相關(guān)文章 DL:深度學(xué)習(xí)框架Pytorch、 Tensorflow各種角度對(duì)比 DL:深度學(xué)習(xí)框架Pytorch,、 Tensorflow各種角度對(duì)比——案例代碼實(shí)現(xiàn)
先看兩個(gè)框架實(shí)現(xiàn)同樣功能的代碼
1,、Pytorch、Tensorflow代碼比較
DL框架之PyTorch:PyTorch的簡(jiǎn)介,、安裝,、使用方法之詳細(xì)攻略 DL框架之Tensorflow:Tensorflow的簡(jiǎn)介,、安裝、使用方法之詳細(xì)攻略 DL:深度學(xué)習(xí)框架Pytorch,、 Tensorflow各種角度對(duì)比——案例代碼實(shí)現(xiàn)
2,、Tensorflow(數(shù)據(jù)即是代碼,代碼就是數(shù)據(jù))+Pytorch(隨著進(jìn)展定義、更改和執(zhí)行節(jié)點(diǎn))
? ? ? ? ?兩種框架都在張量上運(yùn)行,把任何模型都看作一個(gè)有向非循環(huán)圖(DAG),但對(duì)于如何定義它們,PyTorch 和 TensorFlow 區(qū)別很大,。
- 在便利性和上手難度上,PyTorch 遠(yuǎn)勝于TensorFlow ,
(1),、原因是PyTorch 是基于動(dòng)態(tài)圖,而TensorFlow 是基于靜態(tài)計(jì)算圖,因此PyTorch 能隨時(shí)打印tensor的值,但是TensorFlow 需要設(shè)置回調(diào)的方法才能打印. - 如果想在TensorFlow 中想判斷一個(gè)變量的值的正確性,只能使用assert方法,這一點(diǎn)確實(shí)TensorFlow 不及PyTorch ,
- 上手難度上PyTorch 也是比TensorFlow 容易。
? ? ? ? ?TensorFlow 遵循“數(shù)據(jù)即是代碼,代碼就是數(shù)據(jù)”的理念,。在 TensorFlow 中,在跑模型之前會(huì)靜態(tài)的定義圖形。和外界的所有聯(lián)系都是通過 tf.Session 對(duì)象和 tf.Placeholder,它們都是會(huì)在模型運(yùn)行被外部數(shù)據(jù)取代的張量,。 ? ? ? ? ?在 PyTorch 中,會(huì)更動(dòng)態(tài)一些:你可以隨著進(jìn)展定義,、更改和執(zhí)行節(jié)點(diǎn),沒有特殊的會(huì)話界面或占位符。 ? ? ? ? ?整體來看,PyTorch 和 Python 結(jié)合的更緊湊些,多數(shù)時(shí)候會(huì)感覺更原生,。而在 TensorFlow 里寫東西時(shí),有時(shí)你會(huì)覺得你的模型好像躲在一堵墻后面一樣,就通過墻上的幾個(gè)洞洞跟你交流,。當(dāng)然了,這也看每個(gè)人的喜好和品味。?PyTorch 更適用于研究,、愛好者和小規(guī)模項(xiàng)目的快速原型開發(fā),。TensorFlow 更適合大規(guī)模部署,尤其是涉及跨平臺(tái)和嵌入式部署時(shí)。
3,、TensorFlow —Google—像框架+靜態(tài)圖+公司好手,不易調(diào)試+額外概念(會(huì)話,、圖、變量范圍,、占位符),序列化更強(qiáng)大+支持移動(dòng)和嵌入式部署+大規(guī)模分布式+強(qiáng)大的可視化工具
? ? ? ?PyTorch 開始會(huì)看起來很像一個(gè)框架,。回想一下,編程框架會(huì)在特定領(lǐng)域?yàn)槲覀?span style="color:#f33b45;">提供有用的抽象,用它們可以很方便的解決具體問題,。而這是框架和庫(kù)的的本質(zhì)區(qū)別之處,。
- (1)、TensorFlow基于靜態(tài)圖:在 TensorFlow 中,圖結(jié)構(gòu)是靜態(tài)的,也就是說圖在「編譯」之后再運(yùn)行,。需要先構(gòu)建一個(gè)計(jì)算圖,構(gòu)建好了之后,這樣一個(gè)計(jì)算圖是不能夠變的了,然后再傳入不同的數(shù)據(jù)進(jìn)去,進(jìn)行計(jì)算,。即固定了計(jì)算的流程,所以變得不太靈活。
? ? 1),、如果要去改變計(jì)算的邏輯,或者隨著時(shí)間變化的計(jì)算邏輯,這樣的動(dòng)態(tài)計(jì)算TensorFlow是實(shí)現(xiàn)不了的,或者是很麻煩,。 - (2)、TensorFlow不易調(diào)試:調(diào)試 TensorFlow 則沒這么容易,。它有兩個(gè)選擇,一是從會(huì)話中請(qǐng)求你想檢查的變量,而是學(xué)會(huì)使用 TensorFlow 調(diào)試器(tfdbg),。
? ? 1)、TensorFlow 則不同,你可以選擇用一個(gè)叫 tfdbg 的特殊工具,它能讓你在運(yùn)行時(shí)評(píng)估 TensorFlow 表達(dá)式,瀏覽所有張量,在會(huì)話范圍中操作,。當(dāng)然,無法用它調(diào)試 Python 代碼,因此無需單獨(dú)使用 pdb,。 -
(3),、TensorFlow上手需學(xué)習(xí)額外概念—會(huì)話、圖,、變量范圍,、占位符:可以將 TensorFlow 看作是一種嵌入 Python 的編程語言。當(dāng)你編寫 TensorFlow 代碼時(shí),它會(huì)被 Python編譯成圖(graph),然后由 TensorFlow 執(zhí)行引擎運(yùn)行,。 ? ? 1),、所以,TensorFlow 還有一些需要額外學(xué)習(xí)的概念,比如會(huì)話(session)、圖,、變量范圍,、占位符。要讓基本的模型跑起來也需要更多樣板代碼,。上手 TensorFlow 的時(shí)間肯定會(huì)比 PyTorch 長(zhǎng),。 -
(4)、TensorFlow的序列化更強(qiáng)大:TensorFlow 的 Saver 對(duì)象也很容易使用,而且也為檢查點(diǎn)提供了更多選擇,。TensorFlow 在序列化方面的主要優(yōu)勢(shì)是整個(gè)計(jì)算圖都可以保存為 protocol buffer,。這既包括參數(shù),也包括運(yùn)算。然后這個(gè)圖可以用其它支持的語言(C++,、Java)加載,。對(duì)于不支持 Python 的部署環(huán)境來說,這是非常重要的功能。而且理論上,這個(gè)功能也可以在你修改模型的源代碼,但又想運(yùn)行舊模型時(shí)為你提供幫助,。 -
(5),、TensorFlow 支持移動(dòng)和嵌入式部署:但是在 TensorFlow 上,要將模型部署到安卓或 iOS 上需要不小的工作量,但至少你不必使用 Java 或 C++ 重寫你模型的整個(gè)推理部分。 ? ?1),、對(duì)于高性能服務(wù)器上的部署,還有 TensorFlow Serving 可用,。除了性能方面的優(yōu)勢(shì),TensorFlow Serving 的另一個(gè)重要特性是無需中斷服務(wù),就能實(shí)現(xiàn)模型的熱插拔。 -
(6),、TensorFlow 的數(shù)據(jù)加載 比較復(fù)雜:我還沒找到 TensorFlow 的非常有用的數(shù)據(jù)加載工具(讀取器,、隊(duì)列、隊(duì)列運(yùn)行器等等),。部分原因是要將你想并行運(yùn)行的所有預(yù)處理代碼加入到 TensorFlow 圖中并不總是那么簡(jiǎn)單直接(比如計(jì)算頻譜圖),。另外,TensorFlow 的 API 本身也更加冗長(zhǎng),學(xué)習(xí)起來也更難。 -
(7),、TensorFlow 的設(shè)備管理默認(rèn)即可:設(shè)備管理的無縫性能非常好,通常你不需要指定任何東西,因?yàn)槟J(rèn)的設(shè)置就很好,。比如說,TensorFlow 假設(shè)如果存在可用的 GPU,你就希望在 GPU 上運(yùn)行。 ? ? 1),、TensorFlow 設(shè)備管理的唯一缺陷是它會(huì)默認(rèn)占用所有可用的 GPU 上的所有內(nèi)存,即使真正用到的只有其中一個(gè),。但也有一種簡(jiǎn)單的解決方案,就是指定 CUDA_VISIBLE_DEVICES。有時(shí)候人們會(huì)忘記這一點(diǎn),就會(huì)讓 GPU 看起來很繁忙,盡管實(shí)際上它們啥也沒干,。 -
(8),、TensorFlow的強(qiáng)大的可視化工具TensorBoard:TensorBoard 是一個(gè)用于可視化訓(xùn)練機(jī)器學(xué)習(xí)模型各個(gè)方面的工具,。它是 TensorFlow 項(xiàng)目產(chǎn)出的最有用的功能之一。僅需在訓(xùn)練腳本中加入少許代碼,你就可以查看任何模型的訓(xùn)練曲線和驗(yàn)證結(jié)果,。TensorBoard 作為一個(gè)網(wǎng)頁服務(wù)運(yùn)行,可以尤其方便地可視化存儲(chǔ)在 headless 節(jié)點(diǎn)上的結(jié)果,。 ? ?1)、展示模型圖形,、繪制標(biāo)量變量,、可視化分布和直方圖、可視化圖形 ?播放音頻 -
(9),、TensorFlow持支持分布式執(zhí)行,、支持大規(guī)模分布式訓(xùn)練:在GPU的分布式計(jì)算上更為出色,在數(shù)據(jù)量巨大時(shí)效率比pytorch要高一些。
4,、PyTorch —FaceBook—像庫(kù)+動(dòng)態(tài)圖+科研好手,易理解且易調(diào)試+結(jié)合NumPy更易上手,小規(guī)模項(xiàng)目???????+支持分布式執(zhí)行+暫時(shí)不支持分布式訓(xùn)練
? ? ? ?TensorFlow 給人的感覺更像是一個(gè)庫(kù),而非一個(gè)框架:所有的操作都為低階操作,你需要寫很多樣板代碼,即便你可能并不想寫(比如,一遍又一遍的定義方差和權(quán)重···),。
- (1)、PyTorch基于動(dòng)態(tài)圖:創(chuàng)建和運(yùn)行計(jì)算圖可能是這兩個(gè)框架差別最大的地方,。在 PyTorch 中,圖結(jié)構(gòu)是動(dòng)態(tài)的,也就是說圖是在運(yùn)行時(shí)創(chuàng)建的。即就和python的邏輯是一樣的,要對(duì)變量做任何操作都是靈活的,。
- (2),、PyTorch容易理解且易調(diào)試: 簡(jiǎn)單的圖構(gòu)建方式更容易理解,但也許更重要的是也更容易調(diào)試。調(diào)試 PyTorch 代碼就跟調(diào)試 Python 代碼一樣,。你可以使用 pdb,并且可以在任何地方設(shè)置斷點(diǎn),。
? ?1)、?PyTorch 的計(jì)算圖是在運(yùn)行時(shí)定義,可以用 pdb,ipdb,PyCharm 這些 Python 調(diào)試工具或者以前的可靠的打印語句也行,。 - (3),、PyTorch結(jié)合NumPy更易上手:PyTorch 本質(zhì)上是支持 GPU 的 NumPy 替代,配備了可用于構(gòu)建和訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的更高級(jí)的功能。所以如果你熟悉 NumPy,、Python 和常用的深度學(xué)習(xí)抽象(卷積層,、循環(huán)層、SGD 等),那 PyTorch 就很容易學(xué),。
-
(4),、PyTorch序列化的API比較簡(jiǎn)單:在這兩種框架中,保存和加載模型都很簡(jiǎn)單。PyTorch 有一個(gè)非常簡(jiǎn)單的 API,既可以保存模型的所有權(quán)重,也可以 pickle(加工)整個(gè)類,。 -
(5),、PyTorch不支持移動(dòng)和嵌入式部署:而包括 PyTorch 在內(nèi)的很多深度學(xué)習(xí)框架都沒有這個(gè)能力。 -
(6),、PyTorch的數(shù)據(jù)加載 API 設(shè)計(jì)得很好:數(shù)據(jù)集,、采樣器和數(shù)據(jù)加載器的接口都是特定的。數(shù)據(jù)加載器可以接收一個(gè)數(shù)據(jù)集和一個(gè)采樣器,并根據(jù)該采樣器的調(diào)度得出數(shù)據(jù)集上的一個(gè)迭代器(iterator),。并行化數(shù)據(jù)加載很簡(jiǎn)單,只需為數(shù)據(jù)加載器傳遞一個(gè) num_workers 參數(shù)即可,。 -
(7),、PyTorch 的設(shè)備管理必須指定:而在 PyTorch 中,你必須在啟用了 CUDA 之后明確地將所有東西移到 GPU 上。 -
(8),、PyTorch 的可視化只能調(diào)用matplotlib ,、seaborn???????等庫(kù):目前 PyTorch 并沒有可以和 Tensorboard 匹敵的工具,不過倒是存在一些集成功能。雖然也能用一些繪圖工具比如 matplotlib 和 seaborn -
(9),、PyTorch 支持支持分布式執(zhí)行,、暫時(shí)不支持分布式訓(xùn)練:
|