TensorFlow变量与TensorFlow张量的实现差异

TensorFlow变量与TensorFlow张量的实现差异,tensorflow,Tensorflow,首先,我知道有人提出了一个相关的问题 然而,这个问题是关于实现和内部的。 我在看报纸。这里引用了以下两点: 一, 张量本身不在内存中保存或存储值,但提供 仅用于检索张量引用的值的接口 这对我来说意味着,张量是一个简单地存储指向操作结果的指针的对象,在检索张量的结果或值时,它只是取消对该指针的引用 二, 变量可以描述为存储张量的内存缓冲区中的持久、可变句柄。因此,变量具有一定的形状和固定的类型 在这一点上,我感到困惑,因为基于上一点,我认为张量只是存储一个指针。如果它们只是指针,那么它们也可以是可

首先,我知道有人提出了一个相关的问题

然而,这个问题是关于实现和内部的。 我在看报纸。这里引用了以下两点:

一,

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

这对我来说意味着,张量是一个简单地存储指向操作结果的指针的对象,在检索张量的结果或值时,它只是取消对该指针的引用

二,

变量可以描述为存储张量的内存缓冲区中的持久、可变句柄。因此,变量具有一定的形状和固定的类型

在这一点上,我感到困惑,因为基于上一点,我认为张量只是存储一个指针。如果它们只是指针,那么它们也可以是可变的

确切地说,我的问题如下:

  • “内存缓冲区”是什么意思
  • “把手”是什么意思
  • 我最初关于张量内部的假设正确吗
  • 张量和变量之间本质上的内部实现差异是什么?为什么它们的声明不同,为什么这种差异对TensorFlow至关重要

  • 在解释张量和变量之间的区别之前,我们应该明确“张量”一词在TensorFlow上下文中的含义:

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

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

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

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

    变量也存在类似的区别。在pythonapi中,a是变量的符号表示形式,它具有用于创建读取变量当前值并为其赋值的操作的方法。在C++实现中,对象是一个共享的、可变的对象.< /P>的包装器。 在这种背景下,我们可以解决您的具体问题:

  • 内存缓冲区是什么意思?

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

  • 把手是什么意思?

    在中的解释中,“句柄”一词有几种不同的用法,这与TensorFlow使用该术语的方式略有不同。本文使用“符号句柄”表示
    tf.Tensor
    对象,使用“持久、可变句柄”表示
    tf.Variable
    对象。TensorFlow代码库使用“handle”来表示有状态对象的名称(如
    tf.FIFOQueue
    tf.TensorArray
    ),无需复制所有值(即)

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

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

  • 张量和变量之间的本质内部实现差异是什么?

    在C++中,<<代码> TysFoo::张量和 ToSoFoo::Var < /C> >非常相似;唯一不同的是
    tensorflow::Var
    还有一个
    mutex
    ,可用于在更新变量时锁定该变量

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

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

    张量和变量有不同的用途。张量(
    tf.Tensor
    objects)可以表示数学表达式的复杂组合,如神经网络中的损失函数或符号梯度。变量表示随时间更新的状态,如训练期间的权重矩阵和卷积滤波器。原则上你可以代表