zoukankan      html  css  js  c++  java
  • Tesnsorflow命名空间与变量管理参数reuse

    一.TensorFlow中变量管理reuse参数的使用

    1.TensorFlow用于变量管理的函数主要有两个: 

     (1)tf.get_variable:用于创建或获取变量的值

     (2)tf.variable_scope():用于生成上下文管理器,创建命名空间,命名空间可以嵌套

    2.函数tf.get_variable()既可以创建变量也可以获取变量。控制创建还是获取的开关来自函数tf.variable.scope()中的参数reuse“True”还是"False",分两种情况进行说明:

        (1)设置reuse=False时,函数get_variable()表示创建变量

    with tf.variable_scope("foo",reuse=False):
        v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0))
    
    #在tf.variable_scope()函数中,设置reuse=False时,在其命名空间"foo"中执行函数get_variable()时,表示创建变量"v"

        (2)若在该命名空间中已经有了变量"v",则在创建时会报错,如下面的例子

    import tensorflow as tf
    
    with tf.variable_scope("foo"):
        v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0))
        v1=tf.get_variable("v",[1])
    
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-1-eaed46cad84f> in <module>()
          3 with tf.variable_scope("foo"):
          4     v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0))
    ----> 5     v1=tf.get_variable("v",[1])
          6 
    ValueError: Variable foo/v already exists, disallowed. 
    Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? 

       (3)设置reuse=True时,函数get_variable()表示获取变量

    import tensorflow as tf
    
    with tf.variable_scope("foo"):
        v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0))
        
    with tf.variable_scope("foo",reuse=True):
        v1=tf.get_variable("v",[1])
    
    print(v1==v) 
    
    运行结果为:
    True

       (4)在tf.variable_scope()函数中,设置reuse=True时,在其命名空间"foo"中执行函数get_variable()时,表示获取变量"v"。若在该命名空间中还没有该变量,则在获取时会报错,如下面的例子

    import tensorflow as tf 
    
    with tf.variable_scope("foo",reuse=True):
        v1=tf.get_variable("v",[1])
    
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-1-019a05c4b9a4> in <module>()
          2 
          3 with tf.variable_scope("foo",reuse=True):
    ----> 4     v1=tf.get_variable("v",[1])
          5 
    
    ValueError: Variable foo/v does not exist, or was not created with tf.get_variable(). 
    Did you mean to set reuse=tf.AUTO_REUSE in VarScope?

    二.Tensorflow中命名空间与变量命名问题

    1. tf.Variable:创建变量;自动检测命名冲突并且处理

     import tensorflow as tf
     a1 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
     a2 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
     print(a1) #创建变量,命名为a
     print(a2)#自动检测命名冲突并且处理,命名为a_1
    print(a1==a2)

    运行结果:
    <tf.Variable 'a:0' shape=(1,) dtype=float32_ref> <tf.Variable 'a_1:0' shape=(1,) dtype=float32_ref> False

    2. tf.get_variable创建与获取变量;在没有设置命名空间reuse的情况下变量命名冲突时报错

    import tensorflow as tf
    a3 = tf.get_variable("a", shape=[1], initializer=tf.constant_initializer(1.0))
    a4 = tf.get_variable("a", shape=[1], initializer=tf.constant_initializer(1.0))
    
    运行结果:
    ValueError: Variable a already exists, disallowed.
    Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?

    3.tf.name_scope没有reuse功能,tf.get_variable命名不受它影响,并且命名冲突时报错;tf.Variable命名受它影响

    import tensorflow as tf
    a = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
    with tf.name_scope('layer2'):
      a1 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
      a2 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
      a3 = tf.get_variable("b", shape=[1], initializer=tf.constant_initializer(1.0))
      # a4 = tf.get_variable("b", shape=[1], initializer=tf.constant_initializer(1.0)) 该句会报错
    print(a)
    print(a1)
    print(a2)
    print(a3)
    print(a1==a2)

    运行结果:

    <tf.Variable 'a_2:0' shape=(1,) dtype=float32_ref>
    <tf.Variable 'layer2_1/a:0' shape=(1,) dtype=float32_ref>
    <tf.Variable 'layer2_1/a_1:0' shape=(1,) dtype=float32_ref>
    <tf.Variable 'b:0' shape=(1,) dtype=float32_ref>
    False
     
    

    4.tf.variable_scope可以配tf.get_variable实现变量共享;reuse默认为None,有False/True/tf.AUTO_REUSE可选:

    • 设置reuse = None/False时tf.get_variable创建新变量,变量存在则报错
    • 设置reuse = True时tf.get_variable只获取已存在的变量,变量不存在时报错
    • 设置reuse = tf.AUTO_REUSE时tf.get_variable在变量已存在则自动复用,不存在则创建(!!!我的tensorflow好像不能用,报错说找不到这个模块)

    (1) reuse=True的例子:

    import tensorflow as tf
    
    with tf.variable_scope('layer1'):
        a3 = tf.get_variable("b", shape=[1], initializer=tf.constant_initializer(1.0))
        
    with tf.variable_scope('layer1',reuse=True):
        a1 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
        a2 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")    
        a4 = tf.get_variable("b", shape=[1], initializer=tf.constant_initializer(1.0))
    print(a1) 
    print(a2)
    print(a1==a2)
    print()
    print(a3)
    print(a4)
    print(a3==a4)
    
    运行结果:
    <tf.Variable 'layer1_1/a:0' shape=(1,) dtype=float32_ref>
    <tf.Variable 'layer1_1/a_1:0' shape=(1,) dtype=float32_ref>
    False
    
    <tf.Variable 'layer1/b:0' shape=(1,) dtype=float32_ref>
    <tf.Variable 'layer1/b:0' shape=(1,) dtype=float32_ref>
    True

    (2) reuse=None/False的例子:

    import tensorflow as tf
    
    with tf.variable_scope('layer1'):
        a3 = tf.get_variable("b", shape=[1], initializer=tf.constant_initializer(1.0))
        
    with tf.variable_scope('layer1'): #reuse默认为None
        a1 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")
        a2 = tf.Variable(tf.constant(1.0, shape=[1]),name="a")   
        a4 = tf.get_variable("b", shape=[1], initializer=tf.constant_initializer(1.0)) #a4创建新变量b(而b已经存在了,a3已经创建),报错
    print(a1) 
    print(a2)
    print(a1==a2)
    print()
    print(a3)
    print(a4)
    print(a3==a4)

    参考博客:

    https://blog.csdn.net/johnboat/article/details/84846628

    https://www.cnblogs.com/jfl-xx/p/9885662.html

  • 相关阅读:
    UIControl IOS控件编程 及UITextField的讲解
    ViewPager实现页面切换
    HDU 3788 和九度OJ 1006测试数据是不一样的
    的基本原理的面向对象的--------单个程序员必须查看
    hdu1796 How many integers can you find
    Android数据加载和Json解析——蓝本
    设计管理员表;webservice用于网络安全的高端内提供服务的
    how tomcat works 札记(两)----------一个简单的servlet集装箱
    新秀学习Hibernate——一个简单的例子
    在cocos2d-x在CCTableView使用控制
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/11234765.html
Copyright © 2011-2022 走看看