name/variable_scope 的作用

欢迎转载,但请务必注明原文出处及作者信息。

@author: huangyongye 
@creat_date: 2017-03-08

refer to: Sharing Variables

name / variable_scope 详细理解请看: TensorFlow入门(七) 充分理解 name / variable_scope

* 起因:在运行 RNN LSTM 实例代码的时候出现 ValueError。 * 
在 TensorFlow 中,经常会看到这两个东东出现,这到底是什么鬼,是用来干嘛的。在做 LSTM 的时候遇到了下面的错误:

ValueError: Variable rnn/basic_lstm_cell/weights already exists, disallowed.

然后谷歌百度都查了一遍,结果也不知是咋回事。我是在 jupyter notebook 运行的示例程序,第一次运行的时候没错,然后就总是出现上面的错误。后来才知道是 get_variable() 和 variable_scope() 搞的鬼。

下面就来分析一下 TensorFlow 中到底用这来干啥。

import tensorflow as tf
# 设置GPU按需增长
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)

1. 首先看看比较简单的 tf.name_scope(‘scope_name’).

tf.name_scope 主要结合 tf.Variable() 来使用,方便参数命名管理。

'''
Signature: tf.name_scope(*args, **kwds)
Docstring:
Returns a context manager for use when defining a Python op.
'''
# 也就是说,它的主要目的是为了更加方便地管理参数命名。
# 与 tf.Variable() 结合使用。简化了命名
with tf.name_scope('conv1') as scope:
weights1 = tf.Variable([1.0, 2.0], name='weights')
bias1 = tf.Variable([0.3], name='bias') # 下面是在另外一个命名空间来定义变量的
with tf.name_scope('conv2') as scope:
weights2 = tf.Variable([4.0, 2.0], name='weights')
bias2 = tf.Variable([0.33], name='bias') # 所以,实际上weights1 和 weights2 这两个引用名指向了不同的空间,不会冲突
print weights1.name
print weights2.name
conv1/weights:
conv2/weights:
# 注意,这里的 with 和 python 中其他的 with 是不一样的
# 执行完 with 里边的语句之后,这个 conv1/ 和 conv2/ 空间还是在内存中的。这时候如果再次执行上面的代码
# 就会再生成其他命名空间
with tf.name_scope('conv1') as scope:
weights1 = tf.Variable([1.0, 2.0], name='weights')
bias1 = tf.Variable([0.3], name='bias') with tf.name_scope('conv2') as scope:
weights2 = tf.Variable([4.0, 2.0], name='weights')
bias2 = tf.Variable([0.33], name='bias') print weights1.name
print weights2.name conv1_1/weights:
conv2_1/weights:
import tensorflow as tf

2.下面来看看 tf.variable_scope(‘scope_name’)

tf.variable_scope() 主要结合 tf.get_variable() 来使用,实现 变量共享。

# 这里是正确的打开方式~~~可以看出,name 参数才是对象的唯一标识
import tensorflow as tf
with tf.variable_scope('v_scope') as scope1:
Weights1 = tf.get_variable('Weights', shape=[,])
bias1 = tf.get_variable('bias', shape=[]) # 下面来共享上面已经定义好的变量
# note: 在下面的 scope 中的变量必须已经定义过了,才能设置 reuse=True,否则会报错
with tf.variable_scope('v_scope', reuse=True) as scope2:
Weights2 = tf.get_variable('Weights') print Weights1.name
print Weights2.name
# 可以看到这两个引用名称指向的是同一个内存对象
v_scope/Weights:
v_scope/Weights:

也可以结合 tf.Variable() 一块使用。

import tensorflow as tf
# 注意, bias1 的定义方式
with tf.variable_scope('v_scope') as scope1:
Weights1 = tf.get_variable('Weights', shape=[,])
# bias1 = tf.Variable([0.52], name='bias') # 下面来共享上面已经定义好的变量
# note: 在下面的 scope 中的get_variable()变量必须已经定义过了,才能设置 reuse=True,否则会报错
with tf.variable_scope('v_scope', reuse=True) as scope2:
Weights2 = tf.get_variable('Weights')
bias2 = tf.Variable([0.52], name='bias') print Weights1.name
print Weights2.name
print bias2.name
v_scope/Weights:
v_scope/Weights:
v_scope_1/bias:

如果 reuse=True 的scope中的变量没有已经定义,会报错!!

import tensorflow as tf
# 注意, bias1 的定义方式
with tf.variable_scope('v_scope') as scope1:
Weights1 = tf.get_variable('Weights', shape=[,])
bias1 = tf.Variable([0.52], name='bias') print Weights1.name
print bias1.name # 下面来共享上面已经定义好的变量
# note: 在下面的 scope 中的get_variable()变量必须已经定义过了,才能设置 reuse=True,否则会报错
with tf.variable_scope('v_scope', reuse=True) as scope2:
Weights2 = tf.get_variable('Weights')
bias2 = tf.get_variable('bias', []) # ‘bias print Weights2.name
print bias2.name # 这样子的话就会报错
# Variable v_scope/bias does not exist, or was not created with tf.get_variable()
v_scope/Weights:
v_scope/bias:

本文代码:https://github.com/yongyehuang/Tensorflow-Tutorial

最新文章

  1. 深入理解 spring 容器,源码分析加载过程
  2. jQuery jQuery对象与dom对象的转换
  3. shell截取字符串的方法
  4. PHPCMS标签:get标签
  5. infinite-scroll插件无限滚动加载数据的使用
  6. tomcat7 启动报错(转)
  7. 一个很逗的东西——Jd
  8. 统计学习方法:KNN
  9. 微信小程序与Java后台的通信
  10. 强化学习(十七) 基于模型的强化学习与Dyna算法框架
  11. javascript数据类型以及类型间的转化函数
  12. Alpha冲刺报告(9/12)(麻瓜制造者)
  13. 有关 WCF 的一些错误处理
  14. radio的取值
  15. idea打断点是灰色的
  16. ztree插件的使用及列表项拖拽的实现(jQuery)+异步加载节点数据
  17. ajax回调中执行window.open被拦截的解决办法
  18. Android开发技术重要参考资料
  19. 使用JavaScript实现使用鼠标画线的效果
  20. Linux分区挂载点介绍

热门文章

  1. consul Consul vs. ZooKeeper, doozerd, etcd
  2. redis 事务 even when a command fails, all the other commands in the queue are processed
  3. js判断字符串长度
  4. 007-ant design 对象属性赋值,双向绑定
  5. Python中的__init__.py的作用
  6. node.js 开发桌面程序, 10个令人惊讶的NodeJS开源项目
  7. js 的each()方法遍历对象和数组
  8. [vue]vue-cli下载原理
  9. [py]python内存管理
  10. 5分钟带你入门vuex(vue状态管理)