我想在两个子图之间共享变量。更准确地说,我想进行fowolling操作:给出4个张量a
,b
,c
,d
和权重变量w
,计算W*a
,W*b
,W*c
,W*d
,但在不同的子图中。我的代码如下:
def forward(inputs):
w = tf.get_variable("weights", ...)
return tf.matmult(w, inputs)
with tf.name_scope("group_1"):
a = tf.placeholder(...)
b = tf.placeholder(...)
c = tf.placeholder(...)
aa = forward(a)
bb = forward(b)
cc = forward(c)
with tf.name_scope("group_2):
d = tf.placeholder(...)
tf.get_variable_scope().reuse_variable()
dd = forward(d)
此示例似乎已运行,但我不确定变量W
是否会在group_1
内部重复使用当我添加tf.get_variable_scope.reuse_variable()
时,我收到错误消息说有&# 39;没有变量可供分享。
当我在tensorboard中可视化图形时,我在weigths_*
子图中有几个group_1
。
答案 0 :(得分:1)
以下代码可以满足您的需求:
import tensorflow as tf
def forward(inputs):
init = tf.random_normal_initializer()
w = tf.get_variable("weights", shape=(3,2), initializer=init)
return tf.matmul(w, inputs)
with tf.name_scope("group_1"):
a = tf.placeholder(tf.float32, shape=(2, 3), name="a")
b = tf.placeholder(tf.float32, shape=(2, 3), name="b")
c = tf.placeholder(tf.float32, shape=(2, 3), name="c")
with tf.variable_scope("foo", reuse=False):
aa = forward(a)
with tf.variable_scope("foo", reuse=True):
bb = forward(b)
cc = forward(c)
with tf.name_scope("group_2"):
d = tf.placeholder(tf.float32, shape=(2, 3), name="d")
with tf.variable_scope("foo", reuse=True):
dd = forward(d)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print(bb.eval(feed_dict={b: np.array([[1,2,3],[4,5,6]])}))
for var in tf.all_variables():
print(var.name)
print(var.eval())
要理解的一些重要事项:
name_scope()
会影响所有操作,但使用get_variable()
创建的变量除外。variable_scope()
。例如,占位符a
,b
和c
实际上名为"group_1/a"
,"group_1/b"
,"group_1/c"
和"group_1/d"
,但weights
变量名为"foo/weights"
。
因此,名称范围get_variable("weights")
和变量范围"group_1"
中的"foo"
实际上会查找"foo/weights"
。如果您不确定存在哪些变量以及它们的命名方式,则all_variables()
函数非常有用。