如何在Tensorflow中使用name_scope重用/重新打开已关闭的variable_scope?

时间:2018-04-02 23:15:38

标签: python tensorflow

我尝试使用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

1 个答案:

答案 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)