TensorFlow Variable和TensorFlow Tensor之间的实现差异

Ujj*_*wal 21 tensorflow

首先,我知道这里有一个相关的问题.

但是,这个问题是关于实施和内部的.我正在阅读论文" TensorFlow之旅 ".从那里引用以下两点:

1.

张量本身不会在内存中保存或存储值,但仅提供用于检索张量引用的值的接口.

这告诉我,Tensor是一个简单地将指针存储到操作结果的对象,并且在检索张量的结果或值时,它只是取消引用该指针.

2.

变量可以描述为存储张量的内存缓冲区的持久可变句柄.因此,变量的特征在于某种形状和固定类型.

在此我感到困惑,因为我认为,基于前一点,Tensors只存储一个指针.如果它们只是指针,它们也可能是可变的.

确切地说,这些是我的问题:

  1. "内存缓冲区"是什么意思?
  2. "手柄"是什么意思?
  3. 关于张量内部的最初假设是正确的吗?
  4. 张量和变量之间的基本内部实现差异是什么?为什么它们的声明不同?为什么这种差异对于TensorFlow来说至关重要?

mrr*_*rry 50

在解释张量和变量之间的区别之前,我们应该准确地确定"张量"这个词在TensorFlow的上下文中意味着什么:

  • Python API中,tf.Tensor对象表示TensorFlow操作的符号结果.例如,在表达式中t = tf.matmul(x, y),t是一个tf.Tensor表示乘法结果的对象xy(它们本身可能是其他操作的符号结果,具体值,如NumPy数组或变量).

    在这种情况下,"符号结果"比指向操作结果的指针更复杂.它更类似于一个函数对象,当被调用(即传递给tf.Session.run())时,它将运行必要的计算以产生该操作的结果,并将其作为具体值(例如NumPy数组)返回给您.

  • C++ API中,tensorflow::Tensor对象表示多维数组的具体值.例如,MatMul内核将两个二维tensorflow::Tensor对象作为输入,并生成一个二维tensorflow::Tensor对象作为其输出.

这种区别有点令人困惑,如果我们重新开始,我们可能会选择不同的名称(在其他语言API中,我们更喜欢名称Output作为符号结果和Tensor具体值).

变量存在类似的区别.在Python API中,a tf.Variable是变量的符号表示,它具有创建读取变量当前值的操作的方法,并为其赋值.在C++实现中,tensorflow::Var对象是共享的可变tensorflow::Tensor对象的包装器.

有了这种背景,我们可以解决您的具体问题:

  1. "内存缓冲区"是什么意思?

    内存缓冲区只是一个连续的内存区域,已经分配了TensorFlow分配器.tensorflow::Tensor对象包含指向内存缓冲区的指针,该缓冲区保存该张量的值.缓冲区可以在主机存储器中(即可从CPU访问)或设备存储器(例如仅可从GPU访问),并且TensorFlow具有在这些存储器空间之间移动数据的操作.

  2. "手柄"是什么意思?

    在说明的纸张,守信用"手柄"在几个不同的方式,这是从TensorFlow如何使用期限略有不同使用.本文使用"符号句柄"来引用一个tf.Tensor对象,使用"持久的,可变的句柄"来引用一个tf.Variable对象.TensorFlow代码库使用"句柄"来引用有状态对象(如a tf.FIFOQueuetf.TensorArray)的名称,该名称可以传递而不复制所有值(即,按引用调用).

  3. 我最初关于张量内部的假设是正确的吗?

    您的假设与(C++)tensorflow::Tensor对象的定义最匹配.(Python)tf.Tensor对象更复杂,因为它引用了一个计算值的函数,而不是值本身.

  4. 张量和变量之间的基本内部实现差异是什么?

    在C++中,a tensorflow::Tensortensorflow::Var非常相似; 唯一不同的是,tensorflow::Var还有一个mutex可以用来在更新时锁定变量.

    在Python中,本质区别在于a tf.Tensor是作为数据流图实现的,它是只读的(即通过调用tf.Session.run()).A tf.Variable既可以被读取(即通过评估其读取操作)也可以被写入(例如通过运行赋值操作).

    为什么它们的声明不同?为什么这种差异对于TensorFlow来说至关重要?

    张量和变量用于不同的目的.张量(tf.Tensor对象)可以表示数学表达式的复杂组合,例如神经网络中的损失函数,或符号梯度.变量表示随时间更新的状态,如训练期间的权重矩阵和卷积滤波器.虽然原则上你可以表示没有变量的模型的演化状态,但你最终会得到一个非常大的(并且重复的)数学表达式,因此变量提供了一种方便的方法来实现模型的状态,例如 - 分享它与其他机器进行并行训练.