我将以下代码运行到
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()
用张量板验证它:
让我感到困惑的是read
操作以及之前的操作,表示为(W)
。常量B
直接指向Add
操作,而tf.variable
内部包含所有这些操作节点。以下是我的问题:
什么是(W)
操作?常量B
是一个常规圆,表示常量。椭圆形节点表示操作节点。 (W)
似乎没有任何操作,但它用相同的椭圆形节点表示?该节点的工作是什么?
Add
节点使用(W)
操作显式读取read
节点,而不是常量节点B
。为什么变量节点需要read
?
答案 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允许您读取和修改此张量的值。 "
"变量是包含张量的内存缓冲区。"
请注意,图形节点之间的线必须是张量。 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)
W
操作是tf.Variable
:W = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32, name="W")
。在幕后它做了很多操作(比如W.initializer
- 你的初始操作,
W.value()
您的阅读操作,W.assign()
将值分配给自己,可能更多)。您还会看到初始值zeros
。
所有这些都是tf.Variable的内部,你不应该担心它。这就是为什么所有这些都在大红色边框后面折叠(抽象)的原因。