我当前使用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))
    )


这样,您无需重塑labelsclass_weights

关于machine-learning - Tensorflow-使用tf.losses.hinge_loss导致形状不兼容错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47172754/

10-12 19:29