了解张量流和变量共享中的variable_scope和name_scope

时间:2016-03-26 15:58:43

标签: tensorflow

我想在两个子图之间共享变量。更准确地说,我想进行fowolling操作:给出4个张量abcd和权重变量w ,计算W*aW*bW*cW*d,但在不同的子图中。我的代码如下:

def forward(inputs):
  w = tf.get_variable("weights", ...)
  return tf.matmult(w, inputs)

with tf.name_scope("group_1"):
  a = tf.placeholder(...)
  b = tf.placeholder(...)
  c = tf.placeholder(...)

  aa = forward(a)
  bb = forward(b)
  cc = forward(c)

with tf.name_scope("group_2):
  d = tf.placeholder(...)

  tf.get_variable_scope().reuse_variable()
  dd = forward(d)

此示例似乎已运行,但我不确定变量W是否会在group_1内部重复使用当我添加tf.get_variable_scope.reuse_variable()时,我收到错误消息说有&# 39;没有变量可供分享。 当我在tensorboard中可视化图形时,我在weigths_*子图中有几个group_1

1 个答案:

答案 0 :(得分:1)

以下代码可以满足您的需求:

import tensorflow as tf

def forward(inputs):
    init = tf.random_normal_initializer()
    w = tf.get_variable("weights", shape=(3,2), initializer=init)
    return tf.matmul(w, inputs)

with tf.name_scope("group_1"):
    a = tf.placeholder(tf.float32, shape=(2, 3), name="a")
    b = tf.placeholder(tf.float32, shape=(2, 3), name="b")
    c = tf.placeholder(tf.float32, shape=(2, 3), name="c")
    with tf.variable_scope("foo", reuse=False):
        aa = forward(a)
    with tf.variable_scope("foo", reuse=True):
        bb = forward(b)
        cc = forward(c)

with tf.name_scope("group_2"):
    d = tf.placeholder(tf.float32, shape=(2, 3), name="d")
    with tf.variable_scope("foo", reuse=True):
        dd = forward(d)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    print(bb.eval(feed_dict={b: np.array([[1,2,3],[4,5,6]])}))
    for var in tf.all_variables():
        print(var.name)
        print(var.eval())

要理解的一些重要事项:

  • name_scope()会影响所有操作,但使用get_variable() 创建的变量除外。
  • 要在范围中放置变量,您需要使用variable_scope()。例如,占位符abc实际上名为"group_1/a""group_1/b""group_1/c""group_1/d",但weights变量名为"foo/weights"。 因此,名称范围get_variable("weights")和变量范围"group_1"中的"foo"实际上会查找"foo/weights"

如果您不确定存在哪些变量以及它们的命名方式,则all_variables()函数非常有用。