tensorflow标量摘要标记名称异常

时间:2016-01-31 20:29:53

标签: tensorflow

我正在尝试通过关注HowTo mnist教程来学习如何使用tensorflow摘要编写器。该教程添加了损失函数的标量摘要。我通过建立一个正则化术语写了一个不寻常的损失函数,我得到了这个例外:

<script src="https://cdnjs.cloudflare.com/ajax/libs/masonry/4.0.0/masonry.pkgd.min.js"></script>

<div class="grid">
<!-- width of .grid-sizer used for columnWidth -->
<div class="grid-sizer"></div>
<div class="grid-item">
    <img src="http://placehold.it/200x200"alt="recent project">
</div>
<div class="grid-item--width2">
    <img src="http://placehold.it/400x400">
</div>

损失功能和添加摘要看起来像

W tensorflow/core/common_runtime/executor.cc:1027] 0x1e9ab70 Compute status: Invalid argument: tags and values not the same shape: [] != [1]
     [[Node: ScalarSummary = ScalarSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](ScalarSummary/tags, loss)]]

如果我像这样建立了regularrizationTerm

loss = tf.add(modelError, regularizationTerm, name='loss')
tf.scalar_summary(loss.op.name, loss)

是regA和regB是tf.Variables之前定义的,我得到异常,而我是建立它像

regularizationTerm = tf.Variable(tf.zeros([1], dtype=np.float32), name='regterm')
regularizationTerm +=  tf.mul(2.0, regA)
regularizationTerm +=  tf.mul(3.0, regB)

然后它的工作原理。所以我想我没有正确设置名称,当我做+ =我创建一个未命名的新张量?但为什么我不能将其添加到损失中,然后命名损失?这是我唯一要总结的内容?

是否有类似+ =的地方我可以命名输出,或保留我正在修改的张量的名称?

如果问题与其他问题有关,这是我确定问题的简单示例:

regularizationTerm = tf.add(tf.mul(2.0, regA), tf.mul(3.0, regB), name='regterm')

2 个答案:

答案 0 :(得分:25)

TL; DR:问题是tf.scalar_summary()的参数形状,而不是名称。

我认为问题是形状相关的问题,源于这一行:

regularizationTerm = tf.Variable(tf.zeros([1], dtype=np.float32), name='regterm')

这定义了一个变量,其形状是长度为1的向量。后续的+=运算符(tf.add()的语法糖)和tf.add()计算loss将产生矢量形状的结果,因为tf.add() broadcasts标量参数成为矢量。最后,tf.scalar_summary()期望其两个参数具有相同的形状 - 与广播add不同,tf.scalar_summary()不允许其输入的形状。 tags输入是标量字符串(loss op的名称),而values输入是长度为1的向量(loss张量的值)。因此,您会收到您报告的错误。

幸运的是,解决方案很简单!将regularizationTerm变量定义为标量,如下所示:

# Note that `[]` is the scalar shape.
regularizationTerm = tf.Variable(tf.zeros([], dtype=np.float32), name='regterm')

...或将字符串的向量(长度为1)传递给tf.scalar_summary()

# Wrap `loss.op.name` in a list to make it a vector.
tf.scalar_summary([loss.op.name], loss)

答案 1 :(得分:4)

由于这是一个与尺寸为1的张量形状相关的问题,您可以尝试使用tf.squeeze,它特别从张量的形状中删除尺寸为1的尺寸。

在您的情况下,您可以替换

tf.scalar_summary(loss.op.name, loss)

tf.scalar_summary(loss.op.name, tf.squeeze(loss))