TensorFlow1.x 2.x 与 PyTorch – 详细比较

目录:

  1. 介绍
  2. Tensorflow:1.x 与 2
  3. 静态和动态计算图的区别
  4. Keras 集成或中心化
  5. 什么是急切与懒惰执行?
  6. Tensorflow 与 PyTorch
  7. 模型子类化
  8. Tensorflow1.x、Tensorflow2.0 和 PyTorch 的比较
  9. 参考

一、介绍

如果您曾经遇到过深度学习或神经网络这两个术语,那么您很可能也听说过TensorFlowPyTorch

对于初学者来说,深度学习是机器学习的一个分支,可以学习数据中的复杂关系,用于解决很多复杂的问题,主要基于人工神经网络。

与传统的机器学习不同,您不必设计要考虑的新特征变量、交互等,并且可以扩展以学习更复杂的关系。

TensorFlow 和 PyTorch 是当今用于构建和优化神经网络的两个最流行的框架。虽然 Tensorflow 得到了谷歌的支持,但 PyTorch 得到了 Facebook 的支持。两者都得到积极开发和维护。

TensorFlow 现在推出了更新的 TF2.0 版本。与旧版本相比有何变化?它与 PyTorch 相比如何?

现在,哪个更好?

这就是本教程的全部内容。您将解决您对 2 个最流行的神经网络框架的功能的所有疑虑,然后可以自己决定您更喜欢什么!

2. TensorFlow:1.x vs 2

Tensorflow由 Google 开发,于 2015 年 11 月首次推出。

后来,2019 年 9 月推出了更新版本,也就是我们所说的 TensorFlow2.0。这导致旧版本被归类为 TF1.x,新版本被归类为 TF2.0。

TensorFlow 是为构建神经网络而开发的早期框架之一。它得到了谷歌的支持,这是它拥有庞大用户群的主要原因之一。因为谷歌继续将人工智能集成到他们的每一个产品中。

在大多数情况下,这是您开始学习深度学习或人工智能课程时会听到的第一个框架。

出现的问题是更新版本的 TensorFlow 有什么变化?

与 TF1.x 相比,TF2.0 中最重要的变化是对动态计算图的支持。

但什么是计算图?

计算图是我们的输入数据所经历的一系列运算和数学变换,以达到最终输出。

好的,那么什么是静态计算图

3. 静态和动态计算图的区别

  • 静态计算图基本上意味着您无法即时更改神经网络的参数,即在训练神经网络时。

  • 另一方面,在动态计算图中,您可以在执行过程中随时随地更改神经网络的参数,就像常规的 Python 代码一样。

开发人员和工程师通常更喜欢动态计算图。

虽然静态计算图在速度方面有一定的优势,尤其是在部署方面,但对于简单的神经网络和常规开发来说,它可能是一种矫枉过正。

在试验模型时,它也不允许有很大的灵活性。

这就是为什么动态计算图的更新是 TF2.0 的一个重大发展。

  • 增加了易用性的开发制造更简单实验模型。
  • 不再需要在 TensorFlow 中初始化单独的会话以将其与 Python 分开。在 TF1.x 中是强制性的,但 TF2.0 根本不使用会话。它只使用函数。
    tf.Session
静态计算图 动态计算图
首先定义操作,然后执行 在定义操作时执行执行
更难编程和调试 编写和调试更容易
不太灵活,因此更难对模型进行试验 更灵活,使实验更容易
它在结果方面受到更多限制;只有最终输出可用 限制较少;您还可以看到中间步骤的结果
更容易优化;部署更高效 更难优化;不适合部署

4. Keras 集成或中心化

当 TensorFlow 1.x 发布时,Keras 在开发人员中很受欢迎,可以构建任何 TF 代码。因为Keras通过提供更简单的模型构建 API 简化了模型构建过程。此外,它还支持其他深度学习框架,如TheanoCNTK

这使得在 Keras 中编写深度学习代码成为可能,同时允许开发人员仅用一行代码选择他或她想要的任何后端框架。

然而,随着 TF 的发布,Keras 变得更加专注于 TensorFlow。更确切地说,它已成为 TF2.0 中大多数代码开发的核心部分。

现在,keras 是一个可以从 TF2.0 中导入的模块。通过这种集成,您可以使用原始 keras 方法(即顺序模型和功能 API)在 TF2.0 中构建深度学习模型。

另外,在 TF2.0 中,您还可以使用Model Subclassing,这更像是 PyTorch 进行模型构建的方式。当我们在接下来的部分讨论 PyTorch 时,会详细介绍这一点。

有关静态图和计算图之间不同之处的更概括视图,请查看下表。

综上所述,TF1.x和TF2.0的区别也可以总结如下。

TensorFlow1.x TensorFlow2.0
仅静态计算图 支持静态和动态计算图
接下来的循环是构建然后运行 有两个工作流,即刻执行(动态图)和延迟执行(静态图)
尽管支持高级 API 可用,但仍使用低级 API 与 Keras API 紧密集成,这是一个高级 API
tf.Session 用于与 Python 硬分离 不需要会话;只使用函数
需要估计的变量需要 tf.placeholder 不再需要占位符
Keras 是一个在后端实现 TF1.x 的独立库 紧密集成并使 Keras 成为开发的核心
没有模型子类化 允许模型子类化,就像 PyTorch
使用 tfdbg 进行调试 也用 pdb 调试 pythonic 方式

我们已经讨论了 TF2.0 支持静态和同步计算图。但是它是如何实现的呢?

TF2.0 使用一种称为急切执行和延迟执行的方法。

5. 什么是 Eager 与 Lazy Execution

  • Eager Execution 使用命令式编程,这与动态计算图的概念基本相同。代码在旅途中被执行和运行,就像 Python 通常的工作方式一样。
  • 延迟执行使用与静态计算图相同的符号编程。函数是抽象定义的,在函数被显式编译和运行之前不会进行实际计算。即,在定义函数时不创建值。为了实现变量,首先创建、编译和运行静态计算图。

在 Tensorflow2.0 中,您可以轻松地在更适合开发的 Eager Execution 和更适合部署的惰性模式之间切换。

为了更好地理解,让我们看一下下面的代码片段。

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

True

默认情况下,可以看到 Tensorflow2.0 使用了eager execution。让我们执行一个数学运算来检查在定义变量和运算时计算图是如何执行的。

# 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>

在渴望执行,变量c的值可以声明变量之后可以看出ab和功能。tf.add

让我们在惰性执行模型中看到同样的事情。对于相同的操作,它需要声明。tf.Session

为了在 Tensorflow2.0 中做到这一点,我们通过使用库启用 Tensorflow1.x 的功能。与早期版本(Tensorflow 1.x)相关的所有编码范例都捆绑在模块中。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

运行后,disable_v2_behavior您可以看到默认情况下不再启用 Eager Execution。

让我们执行另一个数学运算来检查我们是否仍然可以在不初始化会话的情况下运行计算图。

# 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,因为在惰性执行或静态图中,如果没有首先定义所有操作然后运行它,计算就不会发生。

让我们使用会话来做与上面相同的事情。

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

现在您可以看到正确的值z是可见的。

因此,TF2.0 支持如上所示的急切执行和延迟执行。

很明显,TensorFlow2.0 解决了我们在使用 TensorFlow1.x 时遇到的问题。那么 PyTorch 在哪里出现呢?继续阅读。

6. TensorFlow 与 PyTorch

PyTorch由 Facebook 开发,并于 2016 年 10 月推出。在推出时,唯一另一个主要/流行的深度学习框架是 TensorFlow1.x,它仅支持静态计算图。

PyTorch 开始被广泛采用有两个主要原因:

  • 它使用动态计算图来构建神经网络。
  • 与 Python 紧密集成,这使得 Python 开发人员更容易切换到这个框架。

它与当时可用的 TensorFlow 版本有着根本的不同。

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

TensorFlow1.x 火炬
仅支持静态计算图 仅支持动态计算图
调试是使用 TensorFlow 特定的 libaray tfdbg 完成的 可以使用标准 Python 库 pdb 或 PyCharm 进行调试
TensorBoard 用于输出的可视化 Matplotlib 和 Seaborn 等标准 Python 库可用于可视化
tf.Session 用于与 Python 分离 PyTorch 与 Python 紧密集成,因此无需分离
数据并行化困难;使用和是必需的tf.Device``tf.DeviceSpec 数据并行化更容易;用来torch.nn.DataParallel

新版 TensorFlow 改变的主要区别是我们不再需要,而且 TF2.0 还支持动态图。tf.Session

7. 模型子类化

TF2.0 的另一个主要变化是它允许“模型子类化”,这是在 PyTorch 中构建神经网络模型的常用做法。这种方法允许您构建复杂的模型架构,非常适合实验。

因此,从某种意义上说,TF2.0 采用了 PyTorch 中已经遵循的一些关键开发实践。

下面是模型子类代码在 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 中构建的类似模型如下所示。非常相似。

# 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对比

现在我们知道了 TensorFlow 不同版本之间以及 TensorFlow 和 PyTorch 之间的区别,让我们看一下这三者之间的比较,以便下次您决定构建深度学习网络时,您确切地知道要使用什么框架!

TensorFlow1.x PyTorch TensorFlow2.0
仅支持静态计算图 仅支持动态计算图 支持静态和动态计算图
有需要用于与Python分离tf.session PyTorch 与 Python 紧密集成 不需要初始化会话,因为只使用函数
使用低级 API,但支持高级 API REST API 与 Flask 一起用于部署 Keras API,也是高级API,用于部署

9、参考

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容