专栏首页漫漫深度学习路tensorflow学习笔记(十五): variable scope

tensorflow学习笔记(十五): variable scope

variable scope

tensorflow 为了更好的管理变量,提供了variable scope机制 官方解释: Variable scope object to carry defaults to provide to get_variable.

Many of the arguments we need for get_variable in a variable store are most easily handled with a context. This object is used for the defaults.

Attributes:

  • name: name of the current scope, used as prefix in get_variable.
  • initializer: 传给get_variable的默认initializer.如果get_variable的时候指定了initializer,那么将覆盖这个默认的initializer.
  • regularizer: 传给get_variable的默认regulizer.
  • reuse: Boolean or None, setting the reuse in get_variable.
  • caching_device: string, callable, or None: the caching device passed to get_variable.
  • partitioner: callable or None: the partitioner passed to get_variable.
  • custom_getter: default custom getter passed to get_variable.
  • name_scope: The name passed to tf.name_scope.
  • dtype: default type passed to get_variable (defaults to DT_FLOAT).

regularizer参数的作用是给在本variable_scope下创建的weights加上正则项.这样我们就可以不同variable_scope下的参数加不同的正则项了.

可以看出,用variable scope管理get_varibale是很方便的

如何确定 get_variable 的 prefixed name

首先, variable scope是可以嵌套的:

with variable_scope.variable_scope("tet1"):
    var3 = tf.get_variable("var3",shape=[2],dtype=tf.float32)
    print var3.name
    with variable_scope.variable_scope("tet2"):
        var4 = tf.get_variable("var4",shape=[2],dtype=tf.float32)
        print var4.name
#输出为****************
#tet1/var3:0
#tet1/tet2/var4:0
#*********************

get_varibale.name 以创建变量的 scope 作为名字的prefix

def te2():
    with variable_scope.variable_scope("te2"):
        var2 = tf.get_variable("var2",shape=[2], dtype=tf.float32)
        print var2.name
        def te1():
            with variable_scope.variable_scope("te1"):
                var1 = tf.get_variable("var1", shape=[2], dtype=tf.float32)
            return var1
        return te1() #在scope te2 内调用的
res = te2()
print res.name
#输出*********************
#te2/var2:0
#te2/te1/var1:0
#************************

观察和上个程序的不同

def te2():
    with variable_scope.variable_scope("te2"):
        var2 = tf.get_variable("var2",shape=[2], dtype=tf.float32)
        print var2.name
        def te1():
            with variable_scope.variable_scope("te1"):
                var1 = tf.get_variable("var1", shape=[2], dtype=tf.float32)
            return var1
    return te1()  #在scope te2外面调用的
res = te2()
print res.name
#输出*********************
#te2/var2:0
#te1/var1:0
#************************

还有需要注意一点的是tf.variable_scope("name")tf.variable_scope(scope)的区别,看下面代码

代码1

import tensorflow as tf
with tf.variable_scope("scope"):
    tf.get_variable("w",shape=[1])#这个变量的name是 scope/w
    with tf.variable_scope("scope"):
        tf.get_variable("w", shape=[1]) #这个变量的name是 scope/scope/w
# 这两个变量的名字是不一样的,所以不会产生冲突

代码2

import tensorflow as tf
with tf.variable_scope("yin"):
    tf.get_variable("w",shape=[1])
    scope = tf.get_variable_scope()#这个变量的name是 scope/w
    with tf.variable_scope(scope):#这种方式设置的scope,是用的外部的scope
        tf.get_variable("w", shape=[1])#这个变量的name也是 scope/w
# 两个变量的名字一样,会报错

共享变量

共享变量的前提是,变量的名字是一样的,变量的名字是由变量名和其scope前缀一起构成, tf.get_variable_scope().reuse_variables() 是允许共享当前scope下的所有变量。reused variables可以看同一个节点

with tf.variable_scope("level1"):
    tf.get_variable("w",shape=[1])
    scope = tf.get_variable_scope()
    with tf.variable_scope("level2"):
        tf.get_variable("w", shape=[1])

with tf.variable_scope("level1", reuse=True): #即使嵌套的variable_scope也会被reuse
    tf.get_variable("w",shape=[1])
    scope = tf.get_variable_scope()
    with tf.variable_scope("level2"):
        tf.get_variable("w", shape=[1])

其它

tf.get_variable_scope() :获取当前scope tf.get_variable_scope().reuse_variables() 共享变量

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tensorflow学习笔记(十七):name&variable scope

    在tensorflow中,有两个scope, 一个是name_scope一个是variable_scope,这两个scope到底有什么区别呢? 先看第一个程序...

    ke1th
  • 10 Books that could Make you a Better C++ Programmer

    I just recently read a post by Programming Zen on 10 recent books that will make...

    ke1th
  • tensorflow学习笔记(三十四):Saver(保存与加载模型)

    Saver tensorflow 中的 Saver 对象是用于 参数保存和恢复的。如何使用呢? 这里介绍了一些基本的用法。 官网中给出了这么一个例子: ...

    ke1th
  • TensorFlow 使用变量共享

    TensorFlow中的变量一般就是模型的参数。当模型复杂的时候共享变量会无比复杂。

    郭耀华
  • task8 GAN text-to-image

    https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization https:...

    平凡的学生族
  • 【tensorflow】tf.name_scope与tf.variable_scope区别

    但是,tf.Variable() 每次都会新建变量。 如果希望重用(共享)一些变量,必须用到get_variable(),它会去搜索变量名,有就直接用,没有再...

    JNingWei
  • tensorflow学习笔记(十七):name&variable scope

    在tensorflow中,有两个scope, 一个是name_scope一个是variable_scope,这两个scope到底有什么区别呢? 先看第一个程序...

    ke1th
  • What's the difference of name scope and a variable scope in tensorflow?

    Let’s begin by a short introduction to variable sharing. It is a mechanism in Te...

    GavinZhou
  • MNIST数据集 — 前期准备

    前面都是基础零碎的知识,需要通过一个栗子来为大家把整个流程走一遍,从整体上对TensorFlow进行一个把握,大概分为四篇文章来说明吧(前期准备、前馈计算、模型...

    木野归郎
  • 前端接口模拟工具Mock.js上手实践

    在前后端开发过程中,常常会遇到前后端进度不一致的情况,如果前端停下来等后端接口调试完再继续开发会大大降低前端的开发效率。Mock.js 是一款成熟强大的接口模拟...

    CS逍遥剑仙

扫码关注云+社区

领取腾讯云代金券