【问题标题】:Internals of Variable in tensorflow张量流中变量的内部
【发布时间】:2017-03-14 10:48:42
【问题描述】:

我探索了变量是如何在图中表示的。我创建一个变量,初始化 它并在每次操作后制作图形快照:

import tensorflow as tf

def dump_graph(g, filename):
    with open(filename, 'w') as f:
        print(g.as_graph_def(), file=f)

g = tf.get_default_graph()
var = tf.Variable(2)
dump_graph(g, 'data/after_var_creation.graph')

init = tf.global_variables_initializer()
dump_graph(g, 'data/after_initializer_creation.graph')

with tf.Session() as sess:
    sess.run(init)
    dump_graph(g, 'data/after_initializer_run.graph')

变量创建后的图表如下所示

node {
  name: "Variable/initial_value"
  op: "Const"
  attr {
    key: "dtype"
    value {
      type: DT_INT32
    }
  }
  attr {
    key: "value"
    value {
      tensor {
        dtype: DT_INT32
        tensor_shape {
        }
        int_val: 2
      }
    }
  }
}
node {
  name: "Variable"
  op: "VariableV2"
  attr {
    key: "container"
    value {
      s: ""
    }
  }
  attr {
    key: "dtype"
    value {
      type: DT_INT32
    }
  }
  attr {
    key: "shape"
    value {
      shape {
      }
    }
  }
  attr {
    key: "shared_name"
    value {
      s: ""
    }
  }
}
node {
  name: "Variable/Assign"
  op: "Assign"
  input: "Variable"
  input: "Variable/initial_value"
  attr {
    key: "T"
    value {
      type: DT_INT32
    }
  }
  attr {
    key: "_class"
    value {
      list {
        s: "loc:@Variable"
      }
    }
  }
  attr {
    key: "use_locking"
    value {
      b: true
    }
  }
  attr {
    key: "validate_shape"
    value {
      b: true
    }
  }
}
node {
  name: "Variable/read"
  op: "Identity"
  input: "Variable"
  attr {
    key: "T"
    value {
      type: DT_INT32
    }
  }
  attr {
    key: "_class"
    value {
      list {
        s: "loc:@Variable"
      }
    }
  }
}
versions {
  producer: 21
}

有几个节点:Variable/initial_valueVariableVariable/Assign, Variable/read.

运行init操作后,又添加了一个节点:

node {
  name: "init"
  op: "NoOp"
  input: "^Variable/Assign"
}

我不知道这里发生了什么。

  1. 谁能解释一下这些节点的确切含义是什么?
  2. tensorflow Python中隐式变量初始化的目的是什么 应用程序接口?为什么我们不能在变量对象之后自动初始化一个变量 在 Session.run() 中创建或初始化未初始化的变量?
  3. Variable/read节点内的“loc:@”语法是什么意思和 ^Variable/Assigninit 节点内?
  4. 如何检索变量值?我想价值是 存储在会话中,并且 session.run() 替换某处 这个值,但不知道血淋淋的细节。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    TensorFlow 的tf.Variable 类的实现可以在源代码库here 中找到。 Python 包装类负责在数据流图中创建多个节点,并为使用它们提供方便的访问器。我将使用您示例中的名称来说明问题:

    • VariableV2 类型的节点 Variable 是拥有变量内存的有状态 TensorFlow 操作。每次运行该操作时,它都会发出缓冲区(作为 "ref tensor"),以便其他操作可以读取或写入它。

    • 节点Variable/initial_valueConst 类型)是您作为tf.Variable 构造函数的initial_value 参数提供的张量。这可以是任何类型的张量,尽管通常它是用于随机权重初始化的tf.random_*() 操作。后缀 initial_value 暗示它可能是通过传递 implicitly converted to a tensor 的非张量创建的。

    • Assign 类型的节点Variable/Assign 是将初始值写入变量内存的初始化器 操作。当您稍后在程序中执行 sess.run(tf.global_variables_initializer()) 时,它通常会运行一次。

    • Identity 类型的节点Variable/read 是一个“取消引用”Variable 操作的“引用张量”输出的操作。这主要是一个实现细节,但它在跨进程边界多次读取变量时提供了理想的行为:特别是,该值仅被复制一次,因为此操作的输出不是“参考”张量”。 (如果“ref”边缘在进程之间进行分区,TensorFlow 将多次复制变量。这有时很有用(如果您想在同一步骤中查看在不同设备上写入的效果),但它非常适合.

    TensorFlow 中的变量初始化是显式的,这可能会让人头疼(例如,如果您忘记为所有变量运行初始化程序)。但是,我们不隐式执行它的原因是有很多方法可以初始化变量:从张量、从检查点或从另一个进程(在图复制之间进行时)。 TensorFlow 无法猜测您打算使用哪一个,因此它使过程变得明确。

    "loc:@Variable" 语法用于将节点并置在同一设备上。 特别是,任何在其_class 属性中具有此值的操作都将与Variable 操作放置在同一设备上。

    检索变量的值非常简单:变量 op 输出一个tensorflow::Tensor 值,并且可以通过tensorflow::Session::Run() API 将这个值复制回来。然后 Python 绑定将此值复制到 NumPy 数组中。

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 2017-12-10
      • 2017-11-05
      • 2018-12-13
      相关资源
      最近更新 更多