首页 文章

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

提问于
浏览
18

首先,我知道有一个相关的问题被提出here .

但是,这个问题是关于实施和内部的 . 我正在读报纸“A Tour of TensorFlow” . 从那里引用以下两点:

1 .

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

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

2 .

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

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

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

  • "in-memory buffers"是什么意思?

  • "handle"是什么意思?

  • 我对张量内部的初步假设是正确的吗?

  • 张量和变量之间的基本内部实现差异是什么?为什么它们的声明不同?为什么这种差异对于TensorFlow来说至关重要?

1 回答

  • 46

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

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

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

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

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

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

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

    • What is the meaning of "in-memory buffers"?

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

    • What is the meaning of a "handle"?

    the paper的解释中,单词"handle"以两种不同的方式使用,这与TensorFlow使用该术语的方式略有不同 . 本文使用"symbolic handle"来引用 tf.Tensor 对象,使用"persistent, mutable handle"来引用 tf.Variable 对象 . TensorFlow代码库使用"handle"来引用有状态对象的名称(如 tf.FIFOQueuetf.TensorArray ),可以在不复制所有值的情况下传递(即call-by-reference) .

    • Is my initial assumption about the internal of a tensor correct?

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

    • What is the essential internal implementation difference between a tensor and a variable?

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

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

    Why are they declared differently and why is that difference essential to TensorFlow?

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

相关问题