2017-05-03 77 views
2

为什么我们使用tf.variable_scope:张量流量可变范围:

我知道它的东西链接创建一个实例的基本思想。但在下面的代码和许多其他代码中,范围不会在任何地方通过使用tf.get_variable进行检索。范围服务的目的是什么?如果我不使用它会发生什么?

with tf.variable_scope("placeholder"): 
    input = tf.placeholder(tf.float32, shape=[None, 1024]) 
    y_true = tf.placeholder(tf.int32, shape=[None, 1]) 
with tf.variable_scope('FullyConnected'): 
    w = tf.get_variable('w', shape=[1024, 1024], 
initializer=tf.random_normal_initializer(stddev=1e-1)) 
    b = tf.get_variable('b', shape=[1024], 
initializer=tf.constant_initializer(0.1)) 
    z = tf.matmul(input, w) + b 
    y = tf.nn.relu(z) 

我没有看到随后在任何地方使用的范围。它的服务目的是什么。 我想知道如果我删除它会发生什么

+0

这有利于阅读:http://stackoverflow.com/q/35919020/1090562 –

回答

1

当您在tensorboard中可视化该图时,您将会有一个“aha”时刻。 :)

当你调试一些烦人的问题,并需要知道什么张量导致这个或那个错误信息,你会有另一个“啊哈”时刻。

你绝对需要做这些事情吗?不,真的。你可能还会活下来。但是,嘿,为什么不让你的未来生活更容易?

我在汇总统计中广泛使用变量作用域,因为它们很好地将事物在tensorboard中分组。我通常不会这样做,但这样做并不会让人伤心,所以如果你倾向于这样做,那真是一件好事。

1

我们使用可变范围的原因之一是总结Tensorboard中的操作是有用的。例如,考虑下面的例子:

g = tf.Graph() 

with g.as_default() as g: 

    tf_x = tf.Variable([[1., 2.], 
         [3., 4.], 
         [5., 6.]], 
         name='tf_x_0', 
         dtype=tf.float32) 

    tf_y = tf.Variable([[7., 8.], 
         [9., 10.], 
         [11., 12.]], 
         name='tf_y_0', 
         dtype=tf.float32) 

    # add custom name scope 
    with tf.name_scope('addition'): 
     output = tf_x + tf_y 

    # add custom name scope 
    with tf.name_scope('matrix_multiplication'): 
     output = tf.matmul(tf.transpose(tf_x), output) 

with tf.Session(graph=g) as sess: 
    sess.run(tf.global_variables_initializer()) 
    file_writer = tf.summary.FileWriter(logdir='logs/2', graph=g) 
    result = sess.run(output) 
    print(result) 

enter image description here