tensorflow中的静态计算图和Pytorch中的动态计算图有什么区别?

What is the difference of static Computational Graphs in tensorflow and dynamic Computational Graphs in Pytorch?

我在学习tensorflow的时候,tensorflow的一个基本概念就是计算图,据说图是静态的。 我在 Pytorch 中发现,据说这些图是动态的。 tensorflow中的静态计算图和Pytorch中的动态计算图有什么区别?

在tensorflow中你首先必须定义图,然后执行它。 一旦定义你的图是不可变的:你不能在运行时 add/remove 个节点。

相反,在 pytorch 中,您可以在运行时更改图的结构:因此您可以 add/remove 个节点在运行时动态更改其结构。

这两个框架都对张量进行操作,并将任何模型视为有向无环图 (DAG),但它们在如何定义它们方面存在巨大差异。

TensorFlow 遵循“数据即代码,代码即数据”的惯用语。在 TensorFlow 中,您可以在模型 运行 之前静态定义图形。所有与外部世界的通信都是通过 tf.Session 对象和 tf.Placeholder 执行的,它们是将在 运行 时间被外部数据替换的张量。

在 PyTorch 中,事情更加命令和动态:您可以随时定义、更改和执行节点,没有特殊的会话接口或占位符。总的来说,该框架与 Python 语言集成得更紧密,大多数时候感觉更原生。当你在 TensorFlow 中编写时,有时你会觉得你的模型在一堵砖墙后面,有几个小孔可以通过它进行通信。无论如何,这听起来或多或少还是有点品味的问题。

但是,这些方法不仅在软件工程角度有所不同:有几种动态神经网络架构可以从动态方法中受益。回想一下 RNN:对于静态图,输入序列长度将保持不变。这意味着,如果您为英语句子开发情感分析模型,您必须将句子长度固定为某个最大值,并用零填充所有较小的序列。不太方便吧你会在递归 RNN 和树 RNN 领域遇到更多问题。目前 Tensorflow 对通过 Tensorflow Fold 的动态输入的支持有限。 PyTorch 默认有它。

参考:

https://medium.com/towards-data-science/pytorch-vs-tensorflow-spotting-the-difference-25c75777377b

https://www.reddit.com/r/MachineLearning/comments/5w3q74/d_so_pytorch_vs_tensorflow_whats_the_verdict_on/

TensorFlow 和 PyTorch 都允许在任何时间点指定新的计算。但是,TensorFlow 有 "compilation" 个步骤,每次修改图形时都会导致性能下降。因此,当您指定一次计算,然后通过相同的计算序列流动新数据时,TensorFlow 的最佳性能就实现了。

它类似于解释器与编译器——编译步骤使事情变得更快,但也阻止人们过于频繁地修改程序。

为了使事情具体化,当您在 TensorFlow 中修改图形时(通过使用常规 API 附加新计算,或使用 tf.contrib.graph_editor 删除一些计算),此行在 session.py.它将序列化图形,然后底层运行时将重新运行一些可能需要额外时间的优化,可能需要 200 微秒。相比之下,运行 先前定义的图形或 numpy/PyTorch 中的操作可以低至 1 微秒。