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

时间:2017-09-11 11:04:12

标签: tensorflow deep-learning torch

当我学习张量流时,张量流的一个基本概念是计算图,并且图表被认为是静态的。 我在Pytorch发现这些图表是动态的。 Pytorch中张量流和动态计算图中静态计算图的区别是什么?

3 个答案:

答案 0 :(得分:14)

两个框架都在张量上运行,并将任何模型视为有向无环图(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/

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:1)

在张量流中,您首先必须定义图形,然后执行它。 一旦定义,您的图形就是不可变的:您无法在运行时添加/删除节点。

在pytorch中,您可以在运行时更改图形的结构:您可以在运行时添加/删除节点,动态更改其结构。