如何理解TensorFlow中的术语"张量"?

Zij*_*ost 34 python machine-learning deep-learning tensorflow tensor

我是TensorFlow的新手.在阅读现有文档时,我发现该术语tensor确实令人困惑.因此,我需要澄清以下问题:

  1. tensor&Variable,tensor
    tf.constant'张量'对比有tf.placeholder什么关系?
  2. 它们是各种类型的张量?

Yar*_*tov 61

TensorFlow没有第一类Tensor对象,这意味着Tensor底层图中没有运行时执行的概念.相反,图形由彼此连接的op节点组成,表示操作.操作其输出,这些都可以在端点上分配内存:0,:1等等,你可以认为这些端点作为的Tensor.如果您tensor对应,则nodename:0可以将其值取为sess.run(tensor)sess.run('nodename:0').执行粒度发生在操作级别,因此该run方法将执行op,它将计算所有端点,而不仅仅是:0端点.可能有一个没有输出的Op节点(例如tf.group),在这种情况下没有与之关联的张量.没有基础Op节点的张量是不可能的.

您可以通过执行此类操作来检查基础图中发生的情况

tf.reset_default_graph()
value = tf.constant(1)
print(tf.get_default_graph().as_graph_def())
Run Code Online (Sandbox Code Playgroud)

因此,tf.constant您可以获得单个操作节点,并且可以使用sess.run("Const:0")或获取它sess.run(value)

同样,value=tf.placeholder(tf.int32)创建一个带有名称的常规节点Placeholder,您可以将其作为feed_dict={"Placeholder:0":2}或提供feed_dict={value:2}.您无法在同一个session.run调用中提供和获取占位符,但您可以通过tf.identity在顶部附加节点并获取该节点来查看结果.

对于变量

tf.reset_default_graph()
value = tf.Variable(tf.ones_initializer()(()))
value2 = value+3
print(tf.get_default_graph().as_graph_def())
Run Code Online (Sandbox Code Playgroud)

你会看到,它创建两个节点VariableVariable/read,该:0点要在这两个节点获取一个有效的值.但是Variable:0具有特殊ref类型意味着它可以用作变异操作的输入.Python调用的结果tf.Variable是一个Python Variable对象,并且有一些Python魔法可以替代Variable/read:0Variable:0取决于是否需要进行变异.由于大多数操作只有1个端点,因此:0被删除.另一个例子是Queue- close()方法将创建一个Close连接到Queueop 的新op节点.总结一下 - 根据使用情况对python对象进行操作,VariableQueue映射到不同的底层TensorFlow操作节点.

对于像OPS tf.split或者tf.nn.top_k其创建具有多个端点节点,Python的session.run通话自动换行输出tuplecollections.namedtupleTensor可单独获取的对象.


Oli*_*rot 13

词汇表:

Tensor是一种类型化的多维数组.例如,浮点数的4-D阵列表示具有尺寸[批次,高度,宽度,通道]的小批量图像.

基本上,每个数据都是TensorFlow中的Tensor(因此得名):

  • 占位符是可以为其提供值的Tensors(带feed_dict参数sess.run())
  • 变量是Tensors,您可以更新(with var.assign()).从技术上来说,tf.Variable是不是一个子类tf.Tensor,虽然
  • tf.constant 只是最基本的Tensor,它包含创建时给出的固定值

但是,在图中,每个节点都是一个操作,可以将Tensors作为输入或输出.

  • 我不同意.如果你看看tensorflow白皮书的第2部分:"在TensorFlow图中,每个节点有零个或多个输入和零个或多个输出,并代表一个操作的实例化".变量,常量和占位符是节点,也就是操作的实例化,就像tf.mul或tf.add一样.我认为他们产生张量作为输出,但它们本身不是张量. (4认同)
  • 谢谢,但我仍然认为最好将占位符或常量称为生成张量的"操作",而不是说"占位符是张量".如果您阅读文档:"TensorFlow提供占位符操作,必须提供执行数据.有关详细信息,请参阅"提供数据"一节. (2认同)

kma*_*o23 7

正如其他人已经提到的那样,是的,它们都是张量.

我理解这些的方式是首先可视化和理解1D,2D,3D,4D,5D和6D张量,如下图所示.(来源:knoldus)

张量定义

现在,在TensorFlow的上下文中,您可以想象下面的计算图,

计算,图表

在这里,Ops取两个张量ab作为输入 ; 将张量与自身相乘,然后这些乘法的结果相加以产生结果张量t3.并且这些乘法加法 Op发生在计算图中的节点处.

而这些张量a,并b能不断张量,变张量,或占位符.没关系,只要它们具有相同的数据类型和兼容的形状(或broadcast能够它)来实现操作.