目录:
- 介绍
- Tensorflow:1.x 与 2
- 静态和动态计算图的区别
- Keras 集成或中心化
- 什么是急切与懒惰执行?
- Tensorflow 与 PyTorch
- 模型子类化
- Tensorflow1.x、Tensorflow2.0 和 PyTorch 的比较
- 参考
一、介绍
如果您曾经遇到过深度学习或神经网络这两个术语,那么您很可能也听说过TensorFlow和PyTorch。
对于初学者来说,深度学习是机器学习的一个分支,可以学习数据中的复杂关系,用于解决很多复杂的问题,主要基于人工神经网络。
与传统的机器学习不同,您不必设计要考虑的新特征变量、交互等,并且可以扩展以学习更复杂的关系。
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 简化了模型构建过程。此外,它还支持其他深度学习框架,如Theano和CNTK。
这使得在 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
的值可以声明变量之后可以看出a
,b
和功能。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/