【问题标题】:TensorFlow: Are my logits in the right format for cross entropy function?TensorFlow:我的 logits 格式是否适合交叉熵函数?
【发布时间】:2016-07-04 20:31:44
【问题描述】:

好的,我准备在 Tensorflow 中运行 tf.nn.softmax_cross_entropy_with_logits() 函数。

我的理解是,“logits”应该是概率张量,每个张量对应于某个像素的概率,即它是最终将成为“狗”或“卡车”或其他任何图像的一部分的概率。 . 有限数量的东西。

这些 logits 将被插入到这个交叉熵方程中:

据我了解,logits 插入等式的右侧。也就是说,它们是每个 x(图像)的 q。如果它们是从 0 到 1 的概率……那对我来说很有意义。但是当我运行我的代码并最终得到一个 logits 张量时,我没有得到概率。相反,我得到了正负两面的花车:

-0.07264724 -0.15262917  0.06612295 ..., -0.03235611  0.08587133 0.01897052 0.04655019 -0.20552202  0.08725972 ..., -0.02107313 -0.00567073 0.03241089 0.06872301 -0.20756687  0.01094618 ...,   etc

所以我的问题是……对吗?我是否必须以某种方式计算我所有的 logits 并将它们转换为从 0 到 1 的概率?

【问题讨论】:

标签: tensorflow cross-entropy


【解决方案1】:

要注意的关键是tf.nn.softmax_cross_entropy_with_logits(logits, labels)logits 的每一行执行内部softmax,以便在将它们输入交叉熵方程之前可解释为概率。 p>

因此,“logits”不必是概率(甚至是真正的日志概率,顾名思义),因为在该操作中发生了内部标准化。

另一种写法:

xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)

...应该是:

softmax = tf.nn.softmax(logits)
xent = -tf.reduce_sum(labels * tf.log(softmax), 1)

但是,这种替代方案将 (i) 数值稳定性较差(因为 softmax 可能计算更大的值)和 (ii) 效率较低(因为在反向传播中会发生一些冗余计算)。实际使用建议使用tf.nn.softmax_cross_entropy_with_logits()

【讨论】:

  • 是否意味着我可以简单地将output 提供为logits
  • @mrry tf.nn.sparse_softmax_cross_entropy_with_logits 怎么样?它提供与tf.nn.softmax_cross_entropy_with_logits 相同但没有标签的一种热编码。对吗?
  • @mrry 如果我必须预测图像并将它们分类为 3 个类别,并且每个图像只能属于一个类别,那么使用稀疏方法是否更可取?
  • @Kyrol 是的,它为您节省了将标签转换为 one-hot 向量的工作。另见this question。 (另外,我认为稀疏版本也可能比 one-hot 版本更有效,尽管我没有任何证据。)
猜你喜欢
  • 2017-02-08
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2018-03-12
  • 2016-09-18
  • 2017-07-20
  • 2021-06-25
相关资源
最近更新 更多