tensorflow之变量作用域与变量共享(name_scope,variable_scope,get_variable,Variable)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值