为什么 softmax_cross_entropy_with_logits_v2 return 花费相同的价值

why softmax_cross_entropy_with_logits_v2 return cost even same value

我测试过"softmax_cross_entropy_with_logits_v2" 随机数

import tensorflow as tf

x = tf.placeholder(tf.float32,shape=[None,5])
y = tf.placeholder(tf.float32,shape=[None,5])
softmax = tf.nn.softmax_cross_entropy_with_logits_v2(logits=x,labels=y)

with tf.Session() as sess:
    feedx=[[0.1,0.2,0.3,0.4,0.5],[0.,0.,0.,0.,1.]]
    feedy=[[1.,0.,0.,0.,0.],[0.,0.,0.,0.,1.]]
    softmax = sess.run(softmax, feed_dict={x:feedx, y:feedy})
    print("softmax", softmax)

控制台"softmax [1.8194163 0.9048325]"

我对这个功能的理解是 当 logits 和标签不同时,此函数仅 returns 成本。

那为什么 returns 0.9048325 甚至是相同的值?

tf.nn.softmax_cross_etnropy_with_logits_v2 根据 the documentation 期望未缩放的输入,因为它在内部对 logits 执行 softmax 操作。因此,您的第二个输入 [0, 0, 0, 0, 1] 在内部被软化为大致类似于 [0.15, 0.15, 0.15, 0.15, 0.4] 的东西,然后,此 logit 和真实标签的交叉熵 [0, 0, 0, 0, 1] 被计算为你得到的值

tf.nn.softmax_cross_entropy_with_logits_v2 的工作方式是它对你的 x 数组进行 softmax 操作,将数组转化为概率:

其中 i 是数组的索引。然后 tf.nn.softmax_cross_entropy_with_logits_v2 的输出将是 -log(p) 和标签之间的点积:

由于标签为 0 或 1,因此只有标签等于 1 的项有贡献。所以在你的第一个样本中,第一个索引的softmax概率是

输出将是

您的第二个样本会有所不同,因为 x[0] 不同于 x[1]