【问题标题】:Tensorflow - Using tf.losses.hinge_loss causing Shapes Incompatible errorTensorflow - 使用 tf.losses.hinge_loss 导致 Shapes Incompatible 错误
【发布时间】:2018-04-20 17:30:53
【问题描述】:

我当前使用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 loss 上运行良好,但在hinge_loss 上运行良好?

【问题讨论】:

    标签: machine-learning tensorflow cross-entropy


    【解决方案1】:

    张量labels 的形状为[1024],张量logits 的形状为[1024, 2]。这适用于tf.nn.sparse_softmax_cross_entropy_with_logits

    • labels:形状为 [d_0, d_1, ..., d_{r-1}] 的张量(其中 r 是 标签和结果)和 dtype int32 或 int64。标签中的每个条目必须 是 [0, num_classes) 中的索引。其他值将引发异常 当此操作在 CPU 上运行时,返回 NaN 以表示相应的损失和 GPU上的渐变行。
    • logits:未缩放的形状对数概率 [d_0, d_1, ..., d_{r-1}, num_classes] 和 dtype float32 或 float64。

    但是tf.hinge_loss的要求不同:

    • 标签:ground truth 输出张量。它的形状应该与 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

    • 使用通过tf.reduce_sum 学习到的所有logits 特征,这将形成一个平坦的(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

    【讨论】:

    • 谢谢马克西姆。我不确定我是否通过对轴 1 的逻辑求和来理解第二种方法。我明天将尝试这两种方法并提供更新。谢谢。
    猜你喜欢
    • 2022-11-18
    • 2021-07-07
    • 2021-09-12
    • 2021-08-18
    • 2017-04-24
    • 2020-11-24
    • 1970-01-01
    • 2018-05-23
    • 2019-04-11
    相关资源
    最近更新 更多