目錄:
- 介紹
- Tensorflow:1.x 與 2
- 靜態(tài)和動(dòng)態(tài)計(jì)算圖的區(qū)別
- Keras 集成或中心化
- 什么是急切與懶惰執(zhí)行?
- Tensorflow 與 PyTorch
- 模型子類化
- Tensorflow1.x符喝、Tensorflow2.0 和 PyTorch 的比較
- 參考
一兄世、介紹
如果您曾經(jīng)遇到過(guò)深度學(xué)習(xí)或神經(jīng)網(wǎng)絡(luò)這兩個(gè)術(shù)語(yǔ),那么您很可能也聽(tīng)說(shuō)過(guò)TensorFlow和PyTorch邻薯。
對(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í)框架颅围,如Theano和CNTK伟葫。
這使得在 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
的值可以聲明變量之后可以看出a
,b
和功能傅联。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/