我当前使用sparse_softmax_cross_entropy
的代码可以正常工作。
loss_normal = (
tf.reduce_mean(tf.losses
.sparse_softmax_cross_entropy(labels=labels,
logits=logits,
weights=class_weights))
)
但是,当我尝试使用
hinge_loss
时:loss_normal = (
tf.reduce_mean(tf.losses
.hinge_loss(labels=labels,
logits=logits,
weights=class_weights))
)
它报告了一个错误,说:
ValueError: Shapes (1024, 2) and (1024,) are incompatible
该错误似乎是由
losses_impl.py
文件中的此函数引起的: with ops.name_scope(scope, "hinge_loss", (logits, labels)) as scope:
...
logits.get_shape().assert_is_compatible_with(labels.get_shape())
...
我修改了我的代码,如下所示,仅提取了logits张量的1列:
loss_normal = (
tf.reduce_mean(tf.losses
.hinge_loss(labels=labels,
logits=logits[:,1:],
weights=class_weights
))
)
但是它仍然报告类似的错误:
ValueError: Shapes (1024, 1) and (1024,) are incompatible.
有人可以帮忙指出为什么我的代码在
sparse_softmax_cross_entropy
丢失但不能在hinge_loss
正常的情况下正常工作吗? 最佳答案
张量labels
的形状为[1024]
,张量logits
的形状为[1024, 2]
。这对于tf.nn.sparse_softmax_cross_entropy_with_logits
正常工作:
标签:[d_0,d_1,...,d_ {r-1}]形状的张量(其中r是
标签和结果)和dtype int32或int64。标签中的每个条目必须
是[0,num_classes)中的索引。其他值将引发异常
当此op在CPU上运行时,返回NaN表示相应的损失,并且
GPU上的渐变行。
logits:形状的无标对数概率
[d_0,d_1,...,d_ {r-1},num_classes]和dtype float32或float64。
但是tf.hinge_loss
要求不同:
标签:地面真相输出张量。其形状应与
Logits的形状。张量的值应为0.0或
1.0。
logits:logits,一个浮动张量。
您可以通过两种方式解决此问题:
将标签重塑为[1024, 1]
并仅使用一行logits
,就像您所做的-logits[:,1:]
:
labels = tf.reshape(labels, [-1, 1])
hinge_loss = (
tf.reduce_mean(tf.losses.hinge_loss(labels=labels,
logits=logits[:,1:],
weights=class_weights))
)
我认为您还需要以相同的方式重塑
class_weights
。通过
logits
使用所有学习到的tf.reduce_sum
特征,这将形成平坦的(1024,)
张量:logits = tf.reduce_sum(logits, axis=1)
hinge_loss = (
tf.reduce_mean(tf.losses.hinge_loss(labels=labels,
logits=logits,
weights=class_weights))
)
这样,您无需重塑
labels
或class_weights
。关于machine-learning - Tensorflow-使用tf.losses.hinge_loss导致形状不兼容错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47172754/