首先明白下面三点
-
tf.name_scope()和tf.variable_scope()是两个作用域,
-
tf.variable() 和tf.get_variable()这两个函数在作用域中创建/调用变量
-
它们搭配在一起的两个常见用途:
1)变量共享
2)tensorboard画流程图时为了可视化封装变量
用途1: 共享变量
TensorFlow (TF) 中,name_scope 和 variable_scope 主要是因为 变量共享 的需求。为什么要共享变量?举个简单的例子:例如,GAN网络,判别器的任务是如果接收到的是生成器生成的图像,判别器就尝试优化自己的网络结构来使自己输出0,如果接收到的是来自真实数据的图像,那么就尝试优化自己的网络结构来使自己输出1。也就是说,生成图像和真实图像经过判别器的时候,要共享同一套变量,所以TensorFlow引入了变量共享机制。
变量共享的方法:
resue方式一: v1=v
with tf.variable_scope("foo"):
v = tf.get_variable("v",[1])
with tf.variable_scope("foo",reuse=True):
v1 = tf.get_variable("v",[1]) # 这里v1会调用上面定义的v,而不是重新定义
assert v1=v
resue方式二: v1=v
with tf.variable_scope("foo") as scope:
v = tf.get_variable("v",[1])
scope.reuse_variables()
v1 = tf.get_variable("v",[1]) # 这里v1会调用上面定义的v,而不是重新定义
assert v1=v
“共享变量” 的应用场景:RNN应用例子
在tf.variable_scope的作用域下,通过get_variable()使用已经创建的变量,实现了变量的共享。在 train RNN 和 test RNN 的时候, RNN 的 time_steps 会有不同的取值, 这将会影响到整个 RNN 的结构, 所以导致在 test 的时候, 不能单纯地使用 train 时建立的那个 RNN. 但是 train RNN 和 test RNN 又必须是有同样的 weights biases 的参数. 所以, 这时, 就是使用 reuse variable 的好时机.