use*_*974 19 deep-learning torch tensorflow
当我学习张量流时,张量流的一个基本概念是计算图,并且这些图被认为是静态的.我在Pytorch发现这些图表是动态的.Pytorch中张量流和动态计算图中静态计算图的区别是什么?
Tus*_*pta 17
两个框架都在张量上运行,并将任何模型视为有向无环图(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
TensorFlow和PyTorch都允许在任何时间点指定新计算.但是,TensorFlow有一个"编译"步骤,每次修改图形时都会导致性能下降.因此,当您指定计算一次,然后通过相同的计算序列流动新数据时,将实现TensorFlow最佳性能.
它类似于解释器与编译器 - 编译步骤使事情变得更快,但也阻止人们过于频繁地修改程序.
为了具体化,当您在TensorFlow中修改图形时(通过使用常规API附加新计算,或使用tf.contrib.graph_editor删除某些计算),此行在session.py中触发.它将序列化图形,然后底层运行时将重新运行一些可能需要额外时间的优化,可能是200usec.相反,在先前定义的图形中运行op,或者在numpy/PyTorch中运行op可以低至1 usec.
在 tensorflow 中,您首先必须定义图形,然后执行它。定义后,您的图形是不可变的:您无法在运行时添加/删除节点。
相反,在 pytorch 中,您可以在运行时更改图的结构:因此您可以在运行时添加/删除节点,动态更改其结构。
| 归档时间: |
|
| 查看次数: |
5644 次 |
| 最近记录: |