tf.variable与tensorflow中的tf.constant

时间:2017-07-03 08:06:45

标签: tensorflow tensorboard

我将以下代码运行到

 W = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32, name="W")
 B = tf.constant([[1, 2, 3]], dtype=tf.float32, name="B")
 act = tf.add(W, B)
 init = tf.global_variables_initializer()
 with tf.Session() as sess:
     sess.run(init)
     sess.run(act)
     writer = tf.summary.FileWriter("./graphs", sess.graph)
 writer.close()

用张量板验证它:

enter image description here

让我感到困惑的是read操作以及之前的操作,表示为(W)。常量B直接指向Add操作,而tf.variable内部包含所有这些操作节点。以下是我的问题:

  1. 什么是(W)操作?常量B是一个常规圆,表示常量。椭圆形节点表示操作节点。 (W)似乎没有任何操作,但它用相同的椭圆形节点表示?该节点的工作是什么?

  2. Add节点使用(W)操作显式读取read节点,而不是常量节点B。为什么变量节点需要read

2 个答案:

答案 0 :(得分:3)

由于缺少任何中级文档的链接,这是张量流变量的实用概念模型

以下,来自 https://www.tensorflow.org/programmers_guide/graphs#visualizing_your_graph 似乎至少暗示了你的问题的答案。

"执行 v = tf.Variable(0)会在图形中添加一个tf.Operation,它将存储在tf.Session.run调用之间存在的可写张量值。 tf.Variable对象包装此操作,可以像张量一样使用,它将读取存储值的当前值。 tf.Variable对象还有assign和assign_add等方法,用于创建tf.Operation对象,这些对象在执行时会更新存储的值。"

这来自https://www.tensorflow.org/programmers_guide/variables

"在内部,tf.Variable存储持久张量。特定的ops允许您读取和修改此张量的值。 "

这来自http://www.goldsborough.me/tensorflow/ml/ai/python/2017/06/28/20-21-45-a_sweeping_tour_of_tensorflow/

"变量是包含张量的内存缓冲区。"

请注意,图形节点之间的线必须是张量。 tf.constant(...)返回一个(类的实例)Tensor。但是,tf.Variable(...)不返回Tensor实例,而是返回类Variable的实例

x = tf.Variable(...)
print(type(x)) #  <class 'tensorflow.python.ops.variables.Variable'>
y = tf.constant(...)
print(type(y)) # <class 'tensorflow.python.framework.ops.Tensor'>

要在操作中使用tf变量(其参数必须是张量),其值必须首先进行转换&#34;进入张量,&#34;读&#34;操作返回&#34;隐藏&#34;变量代表的张量。我相信这个值是作为tf.constant(这是一个张量)返回的。

注意 tf.Variable(...)中的大写字母V,以及 tf.constant(..)中的小写字母。一个tf.Variable(...)返回一个tf.Variable类的实例,所以tf.Variable(...)实例化一个类实例, read()是一个(可视化的)此类的方法返回一个值。当一个值被赋给一个变量时,它会修改这个&#34;隐藏&#34;张量。

另一方面,至少在概念上,tf.constant(...)是一个工厂函数,它返回类Tensor的实例。

最好有一些关于此的中级文档的链接。

答案 1 :(得分:1)

您在此处声明的{p> W操作是tf.VariableW = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32, name="W")。在幕后它做了很多操作(比如W.initializer - 你的初始操作,  W.value()您的阅读操作,W.assign()将值分配给自己,可能更多)。您还会看到初始值zeros

所有这些都是tf.Variable的内部,你不应该担心它。这就是为什么所有这些都在大红色边框后面折叠(抽象)的原因。