【问题标题】:Why softmax cross entropy loss never gives a value of zero in tensorflow?为什么softmax交叉熵损失在张量流中永远不会给出零值?
【发布时间】:2018-10-20 14:23:56
【问题描述】:

我在 tensorflow 中做一个神经网络,我使用 softmax_cross_entropy 来计算损失,我正在做测试并注意它永远不会给出零值,即使我比较相同的值,这是我的代码

labels=[1,0,1,1]


with tf.Session() as sess:
    onehot_labels=tf.one_hot(indices=labels,depth=2)
    logits=[[0.,1.],[1.,0.],[0.,1.],[0.,1.]]
    print(sess.run(onehot_labels))
    loss=tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels,logits=logits)
    print(sess.run(loss))

我得到了这个

[[0. 1.]
 [1. 0.]
 [0. 1.]
 [0. 1.]]
0.31326166

为什么不是零??

【问题讨论】:

  • 你的 logits 不适合给出零损失。
  • 但是为什么呢? logits 和一个热门标签是一回事吗?我不明白
  • 不,logits 与一个热标签不同,你将 softmax 应用于 logits,然后你得到与一个热标签相同的东西。
  • 函数将softmax应用于logits?对?然后与一个热标签进行比较,之所以不为零,是因为将softmax函数例如应用于1时,结果例如为0.7
  • 代码是正确的吧?应用到我的神经网络并只更改我的神经网络输出的 logits?

标签: python tensorflow neural-network conv-neural-network tensorflow-estimator


【解决方案1】:

Matias 的帖子是正确的。以下代码给出的结果与您的代码相同

labels=[1,0,1,1]

with tf.Session() as sess:
    onehot_labels=tf.one_hot(indices=labels,depth=2)
    logits=[[0.,1.],[1.,0.],[0.,1.],[0.,1.]]
    print(sess.run(onehot_labels))

    probabilities = tf.nn.softmax(logits=logits)
    # cross entropy
    loss = -tf.reduce_sum(onehot_labels * tf.log(probabilities)) / len(labels)

    print(sess.run(loss))

【讨论】:

  • 我不明白,谢谢,我的代码是正确的吗?应用到我的神经网络并只更改我的神经网络输出的 logits?
  • 您的代码是正确的。用您的网络输出替换 logits,并使用优化器来训练您的网络。
猜你喜欢
  • 2018-06-10
  • 2017-10-22
  • 2018-08-07
  • 1970-01-01
  • 2018-06-06
  • 2017-03-05
  • 2018-02-05
  • 2017-12-22
  • 2017-12-26
相关资源
最近更新 更多