TensorFlow1.x 2.x 與 PyTorch – 詳細(xì)比較

目錄:

  1. 介紹
  2. Tensorflow:1.x 與 2
  3. 靜態(tài)和動(dòng)態(tài)計(jì)算圖的區(qū)別
  4. Keras 集成或中心化
  5. 什么是急切與懶惰執(zhí)行?
  6. Tensorflow 與 PyTorch
  7. 模型子類化
  8. Tensorflow1.x符喝、Tensorflow2.0 和 PyTorch 的比較
  9. 參考

一兄世、介紹

如果您曾經(jīng)遇到過(guò)深度學(xué)習(xí)或神經(jīng)網(wǎng)絡(luò)這兩個(gè)術(shù)語(yǔ),那么您很可能也聽(tīng)說(shuō)過(guò)TensorFlowPyTorch邻薯。

對(duì)于初學(xué)者來(lái)說(shuō)裙戏,深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)分支,可以學(xué)習(xí)數(shù)據(jù)中的復(fù)雜關(guān)系厕诡,用于解決很多復(fù)雜的問(wèn)題累榜,主要基于人工神經(jīng)網(wǎng)絡(luò)。

與傳統(tǒng)的機(jī)器學(xué)習(xí)不同灵嫌,您不必設(shè)計(jì)要考慮的新特征變量壹罚、交互等,并且可以擴(kuò)展以學(xué)習(xí)更復(fù)雜的關(guān)系寿羞。

TensorFlow 和 PyTorch 是當(dāng)今用于構(gòu)建和優(yōu)化神經(jīng)網(wǎng)絡(luò)的兩個(gè)最流行的框架猖凛。雖然 Tensorflow 得到了谷歌的支持,但 PyTorch 得到了 Facebook 的支持绪穆。兩者都得到積極開(kāi)發(fā)和維護(hù)辨泳。

TensorFlow 現(xiàn)在推出了更新的 TF2.0 版本。與舊版本相比有何變化霞幅?它與 PyTorch 相比如何漠吻?

現(xiàn)在,哪個(gè)更好司恳?

這就是本教程的全部?jī)?nèi)容途乃。您將解決您對(duì) 2 個(gè)最流行的神經(jīng)網(wǎng)絡(luò)框架的功能的所有疑慮,然后可以自己決定您更喜歡什么扔傅!

2. TensorFlow:1.x vs 2

Tensorflow由 Google 開(kāi)發(fā)耍共,于 2015 年 11 月首次推出烫饼。

后來(lái),2019 年 9 月推出了更新版本试读,也就是我們所說(shuō)的 TensorFlow2.0杠纵。這導(dǎo)致舊版本被歸類為 TF1.x,新版本被歸類為 TF2.0钩骇。

TensorFlow 是為構(gòu)建神經(jīng)網(wǎng)絡(luò)而開(kāi)發(fā)的早期框架之一比藻。它得到了谷歌的支持,這是它擁有龐大用戶群的主要原因之一倘屹。因?yàn)楣雀枥^續(xù)將人工智能集成到他們的每一個(gè)產(chǎn)品中银亲。

在大多數(shù)情況下,這是您開(kāi)始學(xué)習(xí)深度學(xué)習(xí)或人工智能課程時(shí)會(huì)聽(tīng)到的第一個(gè)框架纽匙。

出現(xiàn)的問(wèn)題是更新版本的 TensorFlow 有什么變化务蝠?

與 TF1.x 相比,TF2.0 中最重要的變化是對(duì)動(dòng)態(tài)計(jì)算圖的支持烛缔。

但什么是計(jì)算圖馏段?

計(jì)算圖是我們的輸入數(shù)據(jù)所經(jīng)歷的一系列運(yùn)算和數(shù)學(xué)變換,以達(dá)到最終輸出践瓷。

好的院喜,那么什么是靜態(tài)計(jì)算圖

3. 靜態(tài)和動(dòng)態(tài)計(jì)算圖的區(qū)別

  • 靜態(tài)計(jì)算圖基本上意味著您無(wú)法即時(shí)更改神經(jīng)網(wǎng)絡(luò)的參數(shù)晕翠,即在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)够坐。

  • 另一方面,在動(dòng)態(tài)計(jì)算圖中崖面,您可以在執(zhí)行過(guò)程中隨時(shí)隨地更改神經(jīng)網(wǎng)絡(luò)的參數(shù),就像常規(guī)的 Python 代碼一樣梯影。

開(kāi)發(fā)人員和工程師通常更喜歡動(dòng)態(tài)計(jì)算圖巫员。

雖然靜態(tài)計(jì)算圖在速度方面有一定的優(yōu)勢(shì),尤其是在部署方面甲棍,但對(duì)于簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)和常規(guī)開(kāi)發(fā)來(lái)說(shuō)简识,它可能是一種矯枉過(guò)正。

在試驗(yàn)?zāi)P蜁r(shí)感猛,它也不允許有很大的靈活性七扰。

這就是為什么動(dòng)態(tài)計(jì)算圖的更新是 TF2.0 的一個(gè)重大發(fā)展。

  • 增加了易用性的開(kāi)發(fā)制造更簡(jiǎn)單實(shí)驗(yàn)?zāi)P汀?/strong>
  • 不再需要在 TensorFlow 中初始化單獨(dú)的會(huì)話以將其與 Python 分開(kāi)陪白。在 TF1.x 中是強(qiáng)制性的颈走,但 TF2.0 根本不使用會(huì)話。它只使用函數(shù)咱士。
    tf.Session
靜態(tài)計(jì)算圖 動(dòng)態(tài)計(jì)算圖
首先定義操作立由,然后執(zhí)行 在定義操作時(shí)執(zhí)行執(zhí)行
更難編程和調(diào)試 編寫和調(diào)試更容易
不太靈活轧钓,因此更難對(duì)模型進(jìn)行試驗(yàn) 更靈活,使實(shí)驗(yàn)更容易
它在結(jié)果方面受到更多限制锐膜;只有最終輸出可用 限制較少毕箍;您還可以看到中間步驟的結(jié)果
更容易優(yōu)化;部署更高效 更難優(yōu)化道盏;不適合部署

4. Keras 集成或中心化

當(dāng) TensorFlow 1.x 發(fā)布時(shí)而柑,Keras 在開(kāi)發(fā)人員中很受歡迎,可以構(gòu)建任何 TF 代碼荷逞。因?yàn)?a target="_blank">Keras通過(guò)提供更簡(jiǎn)單的模型構(gòu)建 API 簡(jiǎn)化了模型構(gòu)建過(guò)程媒咳。此外,它還支持其他深度學(xué)習(xí)框架颅围,如TheanoCNTK伟葫。

這使得在 Keras 中編寫深度學(xué)習(xí)代碼成為可能,同時(shí)允許開(kāi)發(fā)人員僅用一行代碼選擇他或她想要的任何后端框架院促。

然而筏养,隨著 TF 的發(fā)布,Keras 變得更加專注于 TensorFlow常拓。更確切地說(shuō)渐溶,它已成為 TF2.0 中大多數(shù)代碼開(kāi)發(fā)的核心部分。

現(xiàn)在弄抬,keras 是一個(gè)可以從 TF2.0 中導(dǎo)入的模塊茎辐。通過(guò)這種集成,您可以使用原始 keras 方法(即順序模型和功能 API)在 TF2.0 中構(gòu)建深度學(xué)習(xí)模型掂恕。

另外拖陆,在 TF2.0 中,您還可以使用Model Subclassing懊亡,這更像是 PyTorch 進(jìn)行模型構(gòu)建的方式依啰。當(dāng)我們?cè)诮酉聛?lái)的部分討論 PyTorch 時(shí),會(huì)詳細(xì)介紹這一點(diǎn)店枣。

有關(guān)靜態(tài)圖和計(jì)算圖之間不同之處的更概括視圖速警,請(qǐng)查看下表。

綜上所述鸯两,TF1.x和TF2.0的區(qū)別也可以總結(jié)如下闷旧。

TensorFlow1.x TensorFlow2.0
僅靜態(tài)計(jì)算圖 支持靜態(tài)和動(dòng)態(tài)計(jì)算圖
接下來(lái)的循環(huán)是構(gòu)建然后運(yùn)行 有兩個(gè)工作流,即刻執(zhí)行(動(dòng)態(tài)圖)和延遲執(zhí)行(靜態(tài)圖)
盡管支持高級(jí) API 可用钧唐,但仍使用低級(jí) API 與 Keras API 緊密集成忙灼,這是一個(gè)高級(jí) API
tf.Session 用于與 Python 硬分離 不需要會(huì)話;只使用函數(shù)
需要估計(jì)的變量需要 tf.placeholder 不再需要占位符
Keras 是一個(gè)在后端實(shí)現(xiàn) TF1.x 的獨(dú)立庫(kù) 緊密集成并使 Keras 成為開(kāi)發(fā)的核心
沒(méi)有模型子類化 允許模型子類化逾柿,就像 PyTorch
使用 tfdbg 進(jìn)行調(diào)試 也用 pdb 調(diào)試 pythonic 方式

我們已經(jīng)討論了 TF2.0 支持靜態(tài)和同步計(jì)算圖缀棍。但是它是如何實(shí)現(xiàn)的呢宅此?

TF2.0 使用一種稱為急切執(zhí)行和延遲執(zhí)行的方法。

5. 什么是 Eager 與 Lazy Execution

  • Eager Execution 使用命令式編程爬范,這與動(dòng)態(tài)計(jì)算圖的概念基本相同父腕。代碼在旅途中被執(zhí)行和運(yùn)行,就像 Python 通常的工作方式一樣青瀑。
  • 延遲執(zhí)行使用與靜態(tài)計(jì)算圖相同的符號(hào)編程璧亮。函數(shù)是抽象定義的,在函數(shù)被顯式編譯和運(yùn)行之前不會(huì)進(jìn)行實(shí)際計(jì)算斥难。即枝嘶,在定義函數(shù)時(shí)不創(chuàng)建值。為了實(shí)現(xiàn)變量哑诊,首先創(chuàng)建群扶、編譯和運(yùn)行靜態(tài)計(jì)算圖。

在 Tensorflow2.0 中镀裤,您可以輕松地在更適合開(kāi)發(fā)的 Eager Execution 和更適合部署的惰性模式之間切換竞阐。

為了更好地理解,讓我們看一下下面的代碼片段暑劝。

# In tf2.0, eager execution is default
import tensorflow as tf
tf.executing_eagerly()

True

默認(rèn)情況下骆莹,可以看到 Tensorflow2.0 使用了eager execution。讓我們執(zhí)行一個(gè)數(shù)學(xué)運(yùn)算來(lái)檢查在定義變量和運(yùn)算時(shí)計(jì)算圖是如何執(zhí)行的担猛。

# Define objects
a = tf.constant(5, name = "a")
b = tf.constant(7, name = "b")
c = tf.add(a, b, name = "sum")

c

<tf.Tensor: shape=(), dtype=int32, numpy=12>

在渴望執(zhí)行幕垦,變量c的值可以聲明變量之后可以看出ab和功能傅联。tf.add

讓我們?cè)诙栊詧?zhí)行模型中看到同樣的事情先改。對(duì)于相同的操作,它需要聲明蒸走。tf.Session

為了在 Tensorflow2.0 中做到這一點(diǎn)盏道,我們通過(guò)使用庫(kù)啟用 Tensorflow1.x 的功能。與早期版本(Tensorflow 1.x)相關(guān)的所有編碼范例都捆綁在模塊中载碌。tf.v1.compat``tf.compat

# Disable eager execution
tf.compat.v1.disable_v2_behavior()

# or do: tf.compat.v1.disable_eager_execution()

tf.compat.v1.executing_eagerly()
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/compat/v2_compat.py:96: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.
Instructions for updating:
non-resource variables are not supported in the long term

False

運(yùn)行后,disable_v2_behavior您可以看到默認(rèn)情況下不再啟用 Eager Execution衅枫。

讓我們執(zhí)行另一個(gè)數(shù)學(xué)運(yùn)算來(lái)檢查我們是否仍然可以在不初始化會(huì)話的情況下運(yùn)行計(jì)算圖嫁艇。

# Define objects again
x = tf.constant(10, name = "x")
y = tf.constant(3, name = "y")
z = tf.add(x, y, name = "sum")

z

<tf.Tensor 'sum:0' shape=() dtype=int32>

z 值為 0,因?yàn)樵诙栊詧?zhí)行或靜態(tài)圖中弦撩,如果沒(méi)有首先定義所有操作然后運(yùn)行它步咪,計(jì)算就不會(huì)發(fā)生。

讓我們使用會(huì)話來(lái)做與上面相同的事情益楼。

# Init Session and run
sess = tf.compat.v1.Session()
sess.run(z)
13

現(xiàn)在您可以看到正確的值z是可見(jiàn)的猾漫。

因此点晴,TF2.0 支持如上所示的急切執(zhí)行和延遲執(zhí)行。

很明顯悯周,TensorFlow2.0 解決了我們?cè)谑褂?TensorFlow1.x 時(shí)遇到的問(wèn)題粒督。那么 PyTorch 在哪里出現(xiàn)呢?繼續(xù)閱讀禽翼。

6. TensorFlow 與 PyTorch

PyTorch由 Facebook 開(kāi)發(fā)屠橄,并于 2016 年 10 月推出。在推出時(shí)闰挡,唯一另一個(gè)主要/流行的深度學(xué)習(xí)框架是 TensorFlow1.x锐墙,它僅支持靜態(tài)計(jì)算圖。

PyTorch 開(kāi)始被廣泛采用有兩個(gè)主要原因:

  • 它使用動(dòng)態(tài)計(jì)算圖來(lái)構(gòu)建神經(jīng)網(wǎng)絡(luò)长酗。
  • 與 Python 緊密集成溪北,這使得 Python 開(kāi)發(fā)人員更容易切換到這個(gè)框架。

它與當(dāng)時(shí)可用的 TensorFlow 版本有著根本的不同夺脾。

您可以在下面看到 TensorFlow 和 PyTorch 早期版本之間差異的摘要之拨。

TensorFlow1.x 火炬
僅支持靜態(tài)計(jì)算圖 僅支持動(dòng)態(tài)計(jì)算圖
調(diào)試是使用 TensorFlow 特定的 libaray tfdbg 完成的 可以使用標(biāo)準(zhǔn) Python 庫(kù) pdb 或 PyCharm 進(jìn)行調(diào)試
TensorBoard 用于輸出的可視化 Matplotlib 和 Seaborn 等標(biāo)準(zhǔn) Python 庫(kù)可用于可視化
tf.Session 用于與 Python 分離 PyTorch 與 Python 緊密集成,因此無(wú)需分離
數(shù)據(jù)并行化困難劳翰;使用和是必需的tf.Device``tf.DeviceSpec 數(shù)據(jù)并行化更容易敦锌;用來(lái)torch.nn.DataParallel

新版 TensorFlow 改變的主要區(qū)別是我們不再需要,而且 TF2.0 還支持動(dòng)態(tài)圖佳簸。tf.Session

7. 模型子類化

TF2.0 的另一個(gè)主要變化是它允許“模型子類化”乙墙,這是在 PyTorch 中構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的常用做法。這種方法允許您構(gòu)建復(fù)雜的模型架構(gòu)生均,非常適合實(shí)驗(yàn)听想。

因此,從某種意義上說(shuō)马胧,TF2.0 采用了 PyTorch 中已經(jīng)遵循的一些關(guān)鍵開(kāi)發(fā)實(shí)踐汉买。

下面是模型子類代碼在 TF2.0 和 PyTorch 中的相似程度的示例

# Representative Code in PyTorch
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d()
        self.conv2 = nn.Conv2d()

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

在 TF2.0 中構(gòu)建的類似模型如下所示。非常相似佩脊。

# Equivalent Representative Code in TensorFlow2.0
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Model

class TFModel(Model):
  def __init__(self):
    super(TFModel, self).__init__()
    self.conv1 = layers.Conv2D()
    self.conv1 = layers.Conv2D()

  def call(self, x):
    x = layers.ReLU(self.conv1(x))
    return layers.ReLU(self.conv2(x))

八蛙粘、TensorFlow1.x、TensorFlow2.0與PyTorch對(duì)比

現(xiàn)在我們知道了 TensorFlow 不同版本之間以及 TensorFlow 和 PyTorch 之間的區(qū)別威彰,讓我們看一下這三者之間的比較出牧,以便下次您決定構(gòu)建深度學(xué)習(xí)網(wǎng)絡(luò)時(shí),您確切地知道要使用什么框架歇盼!

TensorFlow1.x PyTorch TensorFlow2.0
僅支持靜態(tài)計(jì)算圖 僅支持動(dòng)態(tài)計(jì)算圖 支持靜態(tài)和動(dòng)態(tài)計(jì)算圖
有需要用于與Python分離tf.session PyTorch 與 Python 緊密集成 不需要初始化會(huì)話舔痕,因?yàn)橹皇褂煤瘮?shù)
使用低級(jí) API,但支持高級(jí) API REST API 與 Flask 一起用于部署 Keras API,也是高級(jí)API伯复,用于部署

9慨代、參考

https://www.machinelearningplus.com/deep-learning/tensorflow1-vs-tensorflow2-vs-pytorch/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啸如,隨后出現(xiàn)的幾起案子侍匙,更是在濱河造成了極大的恐慌,老刑警劉巖组底,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈积,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡债鸡,警方通過(guò)查閱死者的電腦和手機(jī)江滨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厌均,“玉大人唬滑,你說(shuō)我怎么就攤上這事」妆祝” “怎么了晶密?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)模她。 經(jīng)常有香客問(wèn)我稻艰,道長(zhǎng),這世上最難降的妖魔是什么侈净? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任尊勿,我火速辦了婚禮,結(jié)果婚禮上畜侦,老公的妹妹穿的比我還像新娘元扔。我一直安慰自己,他們只是感情好旋膳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布澎语。 她就那樣靜靜地躺著,像睡著了一般验懊。 火紅的嫁衣襯著肌膚如雪擅羞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天义图,我揣著相機(jī)與錄音祟滴,去河邊找鬼。 笑死歌溉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痛垛,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼草慧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匙头?” 一聲冷哼從身側(cè)響起漫谷,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹂析,沒(méi)想到半個(gè)月后舔示,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡电抚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年惕稻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝙叛。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俺祠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出借帘,到底是詐尸還是另有隱情蜘渣,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布肺然,位于F島的核電站蔫缸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏际起。R本人自食惡果不足惜拾碌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望加叁。 院中可真熱鬧倦沧,春花似錦、人聲如沸它匕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豫柬。三九已至告希,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烧给,已是汗流浹背燕偶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留础嫡,地道東北人指么。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓酝惧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伯诬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晚唇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容