我尝试使用variable_scope管理Tensors。事情就是每次代码片段运行时,它都会创建一个带索引的新Tensor
例如:
import tensorflow as tf
parameters = {}
with tf.variable_scope("layer1"):
parameters["b1"] = tf.add(1,1)
with tf.variable_scope("layer1"):
parameters["b2"] = tf.add(1,1)
print(parameters["b1"])
print(parameters["b2"])
您多次运行代码,它将创建
Tensor("layer1_1/Add:0", shape=(), dtype=int32)
Tensor("layer1_2/Add:0", shape=(), dtype=int32)
Tensor("layer1_3/Add:0", shape=(), dtype=int32)
Tensor("layer1_4/Add:0", shape=(), dtype=int32)
...
如何防止这种情况发生?
解决方案:
因此,不关闭 - 重新开放范围将解决部分问题:
with tf.variable_scope("layer1"):
parameters["b1"] = tf.add(1,1)
parameters["b2"] = tf.add(1,1)
如果您想在两者之间做其他事情,并且必须关闭范围,那么您可以捕获它:
with tf.variable_scope("layer1") as s: # remembering scope in s
[ create some tensors... ]
[ scope closed ]
with tf.variable_scope( s.original_name_scope ): # reopen same name scope again
[ declare new variables within same name scope ]
这将在两个variable_scopes之间共享name_scope
答案 0 :(得分:0)
因此,根据您的评论,您的问题是您希望命名方案为layer1/Add_1
,然后是layer1/Add_2
等。
如果这是您的目标,那么代码的问题在于您分别使用with
构造。 " with
"的想法是它自动打开和关闭您使用它的对象。因此,with tf.variable_scope( 'layer1' )
会创建一个名为layer1
的变量范围,然后在您退出with
时将其关闭。然后你重新打开另一个同名的,当它试图创建它时,它会遇到同一个名字"问题并将开始索引后缀。
因此,不关闭 - 重新开放范围将解决部分问题:
with tf.variable_scope("layer1"):
parameters["b1"] = tf.add(1,1)
parameters["b2"] = tf.add(1,1)
如果您想在两者之间做其他事情,并且必须关闭范围,那么您可以捕获它:
with tf.variable_scope("layer1") as s: # remembering scope in s
[ create some tensors... ]
[ scope closed ]
with tf.variable_scope( s.original_name_scope ): # reopen same name scope again
[ declare new variables within same name scope ]
这将在两个name_scope
之间共享variable_scope
。
Tensor(" layer1 / Add:0",shape =(),dtype = int32)
Tensor(" layer1 / Add_1:0",shape =(),dtype = int32)