2016-03-03 32 views
0

当我尝试写出我以程序方式生成的多层网络的直方图摘要时,出现重复标记错误。我认为这个问题可能与命名有关。试想一下,如下面的代码:Histogram_summary尊重name_scope

with tf.name_scope(some_unique_name): 
    ... 
    _ = tf.histogram_summary('weights', kernel_weights) 

我天真地认为“权重”将范围限定为some_unique_name但我怀疑,这是不是。摘要名称是否与name_scope无关?

回答

1

他们是。

我和你在一起认为这是一个bug,但我还没有跑过op的设计者。继续并在GitHub上为它打开一个问题!

(我碰到这也并发现它非常恼人的 - 它可以防止模型的再利用而无需刻意进行参数汇总运算调用)

+0

我很快就增加了一个独特的名字层到我的代码和重复的标记错误就走了,这样肯定为什么会发生。 – bobw

3

由于Dave points out,tag参数tf.histogram_summary(tag, ...)确实是独立的当前名称范围。部分原因是tag可能是一个字符串Tensor(即通过图的一部分计算),而名称范围是纯粹的客户端构造(即仅限于Python),因此没有好方法可以使在两种使用模式中确定范围的工作一致。

但是,如果你使用TensorFlow从源代码编译(而且应该在未来的版本中提供,0.8.0),您可以使用下面的方法来范围的标签(使用Graph.unique_name(..., mark_as_used=False)):

with tf.name_scope(some_unique_name): 
    # ... 
    tf.histogram_summary(
     tf.get_default_graph().unique_name('weights', mark_as_used=False), 
     kernel_weights) 

或者,你可以在当前版本的下列内容:

with tf.name_scope(some_unique_name) as scope: 
    # ... 
    tf.histogram_summary(scope + 'weights', kernel_weights) 
+0

有趣。谢谢 - 我怀疑name_scope实际上并不是图表的一部分。我在GitHub上记录了一个bug,但我想这毕竟不是bug。在任何地方都必须携带范围是一件令人失望的事情。我可以问什么样的名字unique_name构造? – bobw

+0

它应用与将'name =“foo”'作为参数传递给op构造函数时使用的完全相同的逻辑。 (例如,它将'foo“附加到当前的名称范围,并且可能会添加'”_1“','_2”'等等,以使其在当前范围内唯一)。如果这样会变得很有用,我们可以制作一个实用的方法,使访问更容易。 – mrry