美文网首页我爱编程
tensorflow里面name_scope, variable

tensorflow里面name_scope, variable

作者: 优秀的莱恩 | 来源:发表于2018-04-04 21:44 被阅读64次

    tensorflow里面name_scope, variable_scope等如何理解?
    一。主要是因为 变量共享 的需求。而这就不得不谈到tf. get_variable()了。因为如果使用Variable 的话每次都会新建变量,但是大多数时候我们是希望一些变量重用的,所以就用到了get_variable()。它会去搜索变量名,然后没有就新建,有就直接用。
    既然用到变量名了,就涉及到了名字域的概念。通过不同的域来区别变量名,毕竟让我们给所有变量都直接取不同名字还是有点辛苦的。所以为什么会有scope 的概念。name_scope 作用于操作,variable_scope 可以通过设置reuse 标志以及初始化方式来影响域下的变量。
    当然对我们而言还有个更直观的感受就是:在tensorboard 里可视化的时候用名字域进行封装后会更清晰
    二。
    最简单的理解是,使用这些可以归类变量和操作,在tf中可视化的时候看起来更紧凑。其中variable_scope用于变量,name_scope用于op
    三。tf.variable会自动检测命名冲突并自行处理
    tf.variable用于创建一个新变量,在同一个name_scope下,可以创建相同名字的变量,底层实现会自动引入别名机制,两次调用产生的其实是两个变量
    tf.get_variable遇到重名的变量创建且变量名没有设置为共享变量是则会报错。
    tf.get_variable用于创建一个变量,并且不受name_scope的约束,当这个变量存在时,则自动获取。不存在时,则自动创建一个变量
    四。
    在 tf.name_scope下时,tf.get_variable()创建的变量名不受 name_scope 的影响,而且在未指定共享变量时,如果重名会报错,tf.Variable()会自动检测有没有变量重名,如果有则会自行处理.

    
    
    import tensorflow as tf
    
    with tf.name_scope('name_scope_x'):
        var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
        var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
        var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(var1.name, sess.run(var1))
        print(var3.name, sess.run(var3))
        print(var4.name, sess.run(var4))
    # 输出结果:
    # var1:0 [-0.30036557]   可以看到前面不含有指定的'name_scope_x'
    # name_scope_x/var2:0 [ 2.]
    # name_scope_x/var2_1:0 [ 2.]  可以看到变量名自行变成了'var2_1',避免了和'var2'冲突
    

    如果使用tf.get_variable()创建变量,且没有设置共享变量,重名时会报错

    
    import tensorflow as tf
    
    with tf.name_scope('name_scope_1'):
        var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
        var2 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(var1.name, sess.run(var1))
        print(var2.name, sess.run(var2))
    
    # ValueError: Variable var1 already exists, disallowed. Did you mean 
    # to set reuse=True in VarScope? Originally defined at:
    # var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    

    所以要共享变量,需要使用tf.variable_scope()

    
    链接:https://www.zhihu.com/question/54513728/answer/181819324
    
    import tensorflow as tf
    
    with tf.variable_scope('variable_scope_y') as scope:
        var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
        scope.reuse_variables()  # 设置共享变量
        var1_reuse = tf.get_variable(name='var1')
        var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
        var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(var1.name, sess.run(var1))
        print(var1_reuse.name, sess.run(var1_reuse))
        print(var2.name, sess.run(var2))
        print(var2_reuse.name, sess.run(var2_reuse))
    # 输出结果:
    # variable_scope_y/var1:0 [-1.59682846]
    # variable_scope_y/var1:0 [-1.59682846]   可以看到变量var1_reuse重复使用了var1
    # variable_scope_y/var2:0 [ 2.]
    # variable_scope_y/var2_1:0 [ 2.]
    

    相关文章

      网友评论

        本文标题:tensorflow里面name_scope, variable

        本文链接:https://www.haomeiwen.com/subject/yaplhftx.html