zoukankan      html  css  js  c++  java
  • TensorFlow学习笔记(1):variable与get_variable, name_scope()和variable_scope()

    Variable

    tensorflow中有两个关于variable的op,tf.Variable()与tf.get_variable()下面介绍这两个的区别
    使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错

    import tensorflow as tf
    w_1 = tf.Variable(3,name="w_1")
    w_2 = tf.Variable(1,name="w_1")
    print w_1.name
    print w_2.name
    #输出
    #w_1:0
    #w_1_1:0

    import tensorflow as tf
    
    w_1 = tf.get_variable(name="w_1",initializer=1)
    w_2 = tf.get_variable(name="w_1",initializer=2)
    #错误信息
    #ValueError: Variable w_1 already exists, disallowed. Did
    #you mean to set reuse=True in VarScope?

    基于这两个函数的特性,当我们需要共享变量的时候,需要使用tf.get_variable()。在其他情况下,这两个的用法是一样的

    • tf.get_variable() 以及 tf.Variable() 是 TensorFlow 中创建变量的两种主要方式;
    • 如果在 tf.name_scope() 环境下分别使用 tf.get_variable() 和 tf.Variable(),两者的主要区别在于
      • tf.get_variable() 创建的变量名不受 name_scope 的影响;
      • tf.get_variable() 创建的变量,name 属性值不可以相同;tf.Variable() 创建变量时,name 属性值允许重复(底层实现时,会自动引入别名机制

    import tensorflow as tf
    
    with tf.variable_scope("scope1"):
        w1 = tf.get_variable("w1", shape=[])
        w2 = tf.Variable(0.0, name="w2")
    with tf.variable_scope("scope1", reuse=True):
        w1_p = tf.get_variable("w1", shape=[])
        w2_p = tf.Variable(1.0, name="w2")
    
    assert w1 == w1_p
    assert w2 != w2_p
    get_variable() 函数的行为依赖于 reuse 的状态:

    • case1:reuse 设置为 False,创建并返回新变量:

      with tf.variable_scope('foo'):
          v = tf.get_variable('v', [1])
      assert v.name == 'foo/v:0

    • case2:reuse 设置为 True,将会按照给定的名字在以存的变量中搜寻:

      with tf.variable_scope('foo'):
          v = tf.get_variable('v', [1])
      with tf.variable_scope('foo', reuse=True):
          v1 = tf.get_variable('v')
      assert v1 == v

    看到这,就可以明白官网上说的参数复用的真面目了。由于tf.Variable() 每次都在创建新对象,所有reuse=True 和它并没有什么关系。对于get_variable(),来说,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。


    variable_scope()

    一个双层嵌套名称空间:

    with tf.variable_scope('foo'):
        with tf.variable_scope('bar'):
            v = tf.get_variable('v', [1])
    assert v.name == 'foo/bar/v:0'


    with tf.name_scope('foo'):
        with tf.variable_scope('bar'):
            v = tf.get_variable('v', [1])
    assert v.name == 'bar/v:0'


  • 相关阅读:
    精选css动画库及其使用
    使用js reduce方法求数组中出现次数最多的元素
    文字横向滚动效果,公告效果
    判断是否是微信端
    移动端input/textarea输入框光标高度兼容及其他事项
    更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支
    Git 常见问题整理
    CentOS 7.0 安装配置LAMP服务器方法(Apache+PHP+MariaDB)
    centos7安装eclipse
    centos7安装mplayer的方法
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/9290716.html
Copyright © 2011-2022 走看看