zoukankan      html  css  js  c++  java
  • tensorflow入门笔记(五) name_scope和variable_scope

    一、上下文管理器(context manager)

    上下文管理器是实现了上下文协议的对象,主要用于资源的获取与释放。上下文协议包括__enter__、__exit__,简单说就是,具备__enter__()和__exit__()方法的类就可以实现上下文管理,做到文件的自动关闭,这样的类实例化的对象就是上下文管理器。

    典型的例子就是读写文件的操作。使用open()函数打开文件,操作之后再用close()函数关闭文件。如果使用上下文管理器的的话就会简洁方便些,因为File()类内部包含有__enter__、__exit__这两种方法。同时,python提供的with也能简化资源操作后的清除操作,实现原理建立在上下文管理器之上。

    with open('test.txt','w') as file:
         file.write(data)

    二、name_scope

    定义python op使用的上下文管理器

    该上下文管理器验证给定的values是否来自相同的Graph、将该Graph设为默认Graph、将命名空间(name scope)存入图中。

    下面的代码定义了一个叫做my_op的python op:

    def my_op(a, b, c, name=None):
      with tf.name_scope(name, "MyOp", [a, b, c]) as scope:
        a = tf.convert_to_tensor(a, name="a")
        b = tf.convert_to_tensor(b, name="b")
        c = tf.convert_to_tensor(c, name="c")
        # Define some computation that uses `a`, `b`, and `c`.
        return foo_op(..., name=scope)

    tf.name_scope()主要是用来管理命名空间的,这样能使模型更加有条理。

    三、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"

    使用AUTO_REUSE共享变量:

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

    使用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", [1])
    assert v1 == v

    通过捕获空间和设置重用共享变量:

    with tf.variable_scope("foo") as scope:
        v = tf.get_variable("v", [1])
        scope.reuse_variables()
        v1 = tf.get_variable("v", [1])
    assert v1 == v

    在non-resue scope中共享变量会报错:

    with tf.variable_scope("foo"):
        v = tf.get_variable("v", [1])
        v1 = tf.get_variable("v", [1])
        #  Raises ValueError("... v already exists ...").

    注意的是:reuse标志是会被继承的。即如果一个scope被设置为reuse mode,那么它的sub-scopes也会处于reuse mode。、

    variable_scope大部分情况下和tf.get_variable()配合使用,实现变量共享。

    import os
    import tensorflow as tf
    
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
        with tf.Session() as sess:
            with tf.name_scope('name_scope'):  # 命名空间
                var1 = tf.Variable(initial_value=[1], name='var1')  # 创建变量
                with tf.variable_scope('variable_scope'):  # 变量空间
                   var2 = tf.Variable([2], name='var2')  # 创建变量
                   var3 = tf.get_variable(name='var3', shape=[])  # 创建可共享变量
           print('var1.name', var1.name)
           print('var2.name', var2.name)
           print('var3.name', var3.name)

    运行结果:

    var1.name name_scope/var1:0
        var2.name name_scope/variable_scope/var2:0
        var3.name variable_scope/var3:0

    可以发现tf.name_scope()不会对tf.get_variable创建的变量有任何影响

    tf.name_scope()主要是管理命名空间,让模型井然有序,而tf.variable_scope()的作用是配合tf.get_variable()实现变量共享


    四、tf.Variable()tf.get_variable()

    •     class Variable

         变量在Graph中起到通过调用run()维持状态的作用。可以通过实例化类Variable向Graph添加变量。

    import tensorflow as tf
    
    # 创建一个变量
    w = tf.Variable(<initial-value>, name=<optional-name>)
    
    # Use the variable in the graph like any Tensor.
    y = tf.matmul(w, ...another variable or tensor...)
    
    # The overloaded operators are available too.
    z = tf.sigmoid(w + y)
    
    # Assign a new value to the variable with `assign()` or a related method.
    w.assign(w + 1.0)
    w.assign_add(1.0)
    •     tf.get_variable()

         获取符合这些参数的现有变量或创建新参数.

         该函数给当前变量空间的name加前缀并检查是否有重用。

    def foo():
      with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
        v = tf.get_variable("v", [1])
      return v
    
    v1 = foo()  # Creates v.  创建一个新变量
    v2 = foo()  # Gets the same, existing v. 得到一个符合参数的现有变量
    assert v1 == v2

    创建变量有三种方式,但只有tf.get_variable()创建的变量会发生命名冲突。在实际使用中,三种创建变量方式的用途区别也是明显的:

    • tf.placeholder()      #占位符。trainable=False,不是训练参数
    • tf.Variable()           #一般变量的定义使用该种方式。trainablel类型可选
    • tf.get_variable()     #和tf.variable_scope()配合使用,实现变量共享的功能。trainablel类型可选

    五、参考链接


  • 相关阅读:
    flutter开发环境的搭建
    创建一个android项目
    android studio 安装与配置
    sentinel-dashboard.jar 安装
    三:nacos的配置中心
    二:nacos 的服务注册
    spring boot 在windows下的 批文件部署
    一:nacos 的安装与启动方式
    mysql 命令行安装方式
    Git 出现 Permission denied 时,重新生成ssh密钥
  • 原文地址:https://www.cnblogs.com/Lilu-1226/p/9437136.html
Copyright © 2011-2022 走看看