【问题标题】:tf.variable vs tf.constant in tensorflow张量流中的 tf.variable 与 tf.constant
【发布时间】:2017-07-03 08:06:45
【问题描述】:

我运行以下代码

 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()

并用 tensorboard 验证:

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

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

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

【问题讨论】:

    标签: tensorflow tensorboard


    【解决方案1】:

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

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

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

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

    “在内部,一个 tf.Variable 存储一个持久张量。特定的操作允许你读取和修改这个张量的值。”

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

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

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

    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 变量(其参数必须是张量),它的值必须首先被“转换”为张量,并且“读取”操作返回变量所代表的“隐藏”张量。我相信该值作为 tf.constant (这是一个张量)返回。

    注意 tf.Variable(...) 中的大写 V 和 tf.constant(..) 中的小 c。一个 tf.Variable(...) 返回一个 tf.Variable 类的实例,所以 tf.Variable(...) 实例化了一个类实例,而 read() 是一个 (a 的可视化) 方法在这个类上返回一个值。当一个值被分配给一个变量时,它会修改这个“隐藏的”张量。

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

    如果有一些关于此的中级文档的链接会很好。

    【讨论】:

      【解决方案2】:

      W 操作是 tf.Variable 你在这里声明:W = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32, name="W")。在幕后它做了很多操作(比如W.initializer - 你的初始化操作, W.value() 您的读取操作,W.assign() 将值分配给自身,并且可能更多)。您还可以看到您的初始值zeros

      所有这些都是 tf.Variable 内部的,您不必担心。这就是为什么所有这些都在大红色边框后面从你身上折叠(抽象出来)。

      【讨论】:

      • 是的,我知道tf.Variable 被抽象掉了;但我真正喜欢 tensorflow 的地方在于它像这样的低级结构。我仍然对read 节点感到困惑。为什么需要读取variable节点而不是像常量B节点那样输出它的值?
      • 也许我在这里真的很挑剔。来自计算机工程背景,结构对我来说似乎并不直观。我假设数据流结构是组合的——就像B 节点bahaves 的常量一样。但变量 (W) 节点没有。相反,它看起来像一个需要明确读写的存储单元。我想我必须多玩一些才能习惯它。
      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2022-08-20
      • 1970-01-01
      相关资源
      最近更新 更多