gpt4 book ai didi

tensorflow - tensorflow 中变量的内部

转载 作者:行者123 更新时间:2023-12-04 00:54:01 30 4
gpt4 key购买 nike

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

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_value , Variable , Variable/Assign , Variable/read .

运行 init 操作后,又添加了一个节点:
node {
name: "init"
op: "NoOp"
input: "^Variable/Assign"
}

我对这里发生的事情没有严格的把握。
  • 谁能解释这些节点的确切含义是什么?
  • tensorflow Python中隐式变量初始化的目的是什么
    应用程序接口(interface)?为什么我们不能在变量对象之后自动初始化一个变量
    在 Session.run() 中创建或初始化未初始化的变量?
  • Variable/read 中的“loc:@”语法是什么意思节点和^Variable/Assign里面 init节点?
  • 检索变量值如何工作?我想值(value)是
    存储在 session 中,并且 session.run()用某处代替
    这个值,但不知道血淋淋的细节。
  • 最佳答案

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

  • 节点 Variable类型 VariableV2是拥有变量内存的有状态 TensorFlow 操作。每次运行该操作时,它都会发出缓冲区(作为 "ref tensor" ),以便其他操作可以读取或写入它。
  • 节点 Variable/initial_value (类型为 Const )是您作为 initial_value 提供的张量tf.Variable 的参数构造函数。这可以是任何类型的张量,尽管通常是 tf.random_*() op 用于随机权重初始化。后缀initial_value暗示它可能是通过传递 implicitly converted to a tensor 的非张量创建的。 .
  • 节点 Variable/Assign类型 Assign是将初始值写入变量内存的初始化操作。它通常运行一次,当您执行 sess.run(tf.global_variables_initializer()) 时稍后在您的程序中。
  • 节点 Variable/read类型 Identity是“取消引用”Variable 的操作op的“引用张量”输出。这主要是一个实现细节,但它在跨进程边界多次读取变量时提供了理想的行为:特别是,该值仅被复制一次,因为此操作的输出不是“引用张量”。 (如果“ref”边缘在进程之间进行分区,TensorFlow 将多次复制变量。这有时很有用(如果您想在同一步骤中查看在不同设备上写入的效果),但它非常适合.

  • TensorFlow 中的变量初始化是显式的,这可能会让人头疼(例如,如果您忘记为所有变量运行初始化程序)。但是,我们不隐式执行它的原因是有很多方法可以初始化变量:从张量、从检查点或从另一个进程(在图复制之间进行时)。 TensorFlow 无法猜测您打算使用哪一个,因此它使过程变得明确。
    "loc:@Variable"语法用于将节点并置在同一设备上。
    特别是,任何具有此值的操作 _class attr 将被放置在与 Variable 相同的设备上手术。

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

    关于tensorflow - tensorflow 中变量的内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783909/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com