我正在尝试通过关注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')
答案 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))