一、
对于使用tf.Variable来说,tf.name_scope和 tf.variable_scope功能一样,都是给变量加前缀,相当于分类管理。这样在不同的scope中就可以给变量取相同的名字也不会冲突。
二、
对于tf.get_variable来说,tf.name_scope对其无效,只有在 tf.variable_scope中才可以建立共享变量。为什么需要共享变量呢?因为如果使用Variable 的话每次都会新建变量,但是大多数时候我们是希望一些变量重用的,所以就用到了get_variable()。它会去搜索变量名,然后没有就新建,有就直接用。
scope.reuse_variables() # 设置共享变量
三、
tf.Variable()同名变量指向两个不同变量实体,而tf.get_variable ()同名变量则指向同一个变量实体。所以tf.Variable()的变量名称是可选参数,而tf.get_variable()的变量名称是必填参数。
四、
tf.variable_scope()和tf.get_variable()必须要搭配使用。tf.Variable()可以单独使用,也可以搭配tf.name_scope()使用,使变量名自动加前缀。tf.Variable()和tf.variable_scope()搭配使用语法过关但是很奇怪,不是设计者的初衷。
代码例子:
import tensorflow as tf
with tf.name_scope('name_scope_x'):
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var3.name, sess.run(var3))
print(var4.name, sess.run(var4))
# 输出结果:
# var1:0 [-0.30036557] 可以看到前面不含有指定的'name_scope_x'
# name_scope_x/var2:0 [ 2.]
# name_scope_x/var2_1:0 [ 2.] 可以看到变量名自行变成了'var2_1',避免了和'var2'冲突
如果要共享变量,则需要使用tf.variable_scope()和 tf.get_variable()
import tensorflow as tf
with tf.variable_scope('variable_scope_y') as scope:
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
scope.reuse_variables() # 设置共享变量
var1_reuse = tf.get_variable(name='var1')
var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var1_reuse.name, sess.run(var1_reuse))
print(var2.name, sess.run(var2))
print(var2_reuse.name, sess.run(var2_reuse))
# 输出结果:
# variable_scope_y/var1:0 [-1.59682846]
# variable_scope_y/var1:0 [-1.59682846] 可以看到变量var1_reuse重复使用了var1
# variable_scope_y/var2:0 [ 2.]
# variable_scope_y/var2_1:0 [ 2.]
代码例子来源于: 作者:Cyril 地址: https://www.zhihu.com/question/54513728/answer/181819324