scope 命名方法
学习资料:
- 不同 scope 对比代码
- 为 TF 2017 打造的新版可视化教学代码
- reuse variable RNN 代码
- sharing variable tensorflow 官网介绍
scope 能让你命名变量的时候轻松很多. 同时也会在 reusing variable 代码中常常见到. 所以今天我们会来讨论下 tensorflow 当中的两种定义 scope 的方式. 最后并附加一个 RNN 运用 reuse variable 的例子.
tf.name_scope()¶
在 Tensorflow 当中有两种途径生成变量 variable, 一种是 tf.get_variable()
, 另一种是 tf.Variable()
. 如果在 tf.name_scope()
的框架下使用这两种方式, 结果会如下.
可以看出使用 tf.Variable()
定义的时候, 虽然 name
都一样, 但是为了不重复变量名, Tensorflow 输出的变量名并不是一样的. 所以, 本质上 var2
, var21
, var22
并不是一样的变量. 而另一方面, 使用tf.get_variable()
定义的变量不会被tf.name_scope()
当中的名字所影响.
tf.variable_scope()¶
如果想要达到重复利用变量的效果, 我们就要使用 tf.variable_scope()
, 并搭配 tf.get_variable()
这种方式产生和提取变量. 不像 tf.Variable()
每次都会产生新的变量, tf.get_variable()
如果遇到了同样名字的变量时, 它会单纯的提取这个同样名字的变量(避免产生新变量). 而在重复使用的时候, 一定要在代码中强调 scope.reuse_variables()
, 否则系统将会报错, 以为你只是单纯的不小心重复使用到了一个变量.
RNN应用例子¶
RNN 例子的代码在这里, 整个 RNN 的结构已经在这里定义好了. 在 training RNN 和 test RNN 的时候, RNN 的 time_steps
会有不同的取值, 这将会影响到整个 RNN 的结构, 所以导致在 test 的时候, 不能单纯地使用 training 时建立的那个 RNN. 但是 training RNN 和 test RNN 又必须是有同样的 weights biases 的参数. 所以, 这时, 就是使用 reuse variable 的好时机.
首先定义training 和 test 的不同参数.
然后让 train_rnn
和 test_rnn
在同一个 tf.variable_scope('rnn')
之下. 并且定义 scope.reuse_variables()
, 使我们能把 train_rnn
的所有 weights, biases 参数全部绑定到 test_rnn
中. 这样, 不管两者的 time_steps
有多不同, 结构有多不同, train_rnn
W, b 参数更新成什么样, test_rnn
的参数也更新成什么样.