tensorflow之变量作用域与变量共享(name_scope,variable_scope,get_variable,Variable)
1. tf. get_variable() 与 tf.Variable()的区别
- tf. get_variable() :在创建变量时会查名字,如果给的名字在之前已经被别的变量占用,则会报错,不会创建相应变量。
- tf.Variable():在创建变量时并不进行检查,如果有重复,则自动的修改名字,加上数字来进行区别。
所以从这来看要想共享变量并不能通过使用相同的名字来调用多次 tf.get_variable 和 tf.variable 做到。
因为如果使用Variable 的话每次都会新建变量,但是大多数时候我们是希望一些变量重用的,所以就用到了get_variable()。它会去搜索变量名,然后没有就新建,有就直接用。既然用到变量名了,就涉及到了名字域的概念。通过不同的域来区别变量名,毕竟让我们给所有变量都直接取不同名字还是有点辛苦的。所以为什么会有scope 的概念。
2. variable_scope与 name_scope的区别
varible_scope:variable_scope 可以通过设置reuse 标志以及初始化方式来影响域下的变量。
name_scope:name_scope 只会影响 ops 的名字,而并不会影响 variables 的名字。
3.变量重用
- 利用 reuse_variables() 来使变量重用。
- tf.variable_scope(“foo”,reuse=True) 同时可以打开变量共享
如果 reuse 开启(reuse = true),当检查到有相同的名字时,直接返回那个有相同名字的变量而不是重新定义一个再复制值。
注意事项:
- [1]在 variable_scope 里面的 variable_scope 会继承上面的 reuse 值,即上面一层开启了 reuse ,则下面的也跟着开启。但是不能人为的设置 reuse 为 false ,只有退出 variable_scope 才能让 reuse 变为 fals;
- [2]当在某一 variable_scope 内使用别的 scope 的名字时,此时不再受这里的等级关系束缚,直接与使用的 scope 的名字一样;
- [3]. name_scope 对 get_variable新建变量的name属性无影响;对variable新建变量的name属性增加了“范围”标识。
- [4]. variable_scope对get_variable新建变量的name属性和variable新建变量的name属性都增加了“范围”标识。
- [5]. get_variable新建变量如果遇见重复的name则会因为重复而报错。
- [6]. variable新建的变量如果遇见重复的name则会自动修改前缀,以避免重复出现。
参考1:https://www.zhihu.com/question/54513728/answer/177901159
参考2:http://blog.csdn.net/qq_19918373/article/details/69499091
参考3:http://blog.csdn.net/lucky7213/article/details/78967306