почему softmax_cross_entropy_with_logits_v2 возвращают стоимость даже при одинаковом значении - PullRequest
0 голосов
/ 02 сентября 2018

я проверил "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]"

что я понимаю об этой функции было Эта функция возвращает стоимость только в том случае, если логиты и метки отличаются.

тогда почему он возвращает 0,9048325 даже такое же значение?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Способ работы tf.nn.softmax_cross_entropy_with_logits_v2 заключается в том, что он выполняет softmax для вашего x массива, чтобы превратить массив в вероятности:

enter image description here

где i - индекс вашего массива. Тогда результат tf.nn.softmax_cross_entropy_with_logits_v2 будет точечным продуктом между -log(p) и метками:

enter image description here

Поскольку метки либо 0, либо 1, вкладывается только термин, в котором метка равна единице. Так что в вашей первой выборке вероятность softmax первого индекса равна

enter image description here

и вывод будет

enter image description here

Ваш второй образец будет отличаться, так как x[0] отличается от x[1].

0 голосов
/ 02 сентября 2018

tf.nn.softmax_cross_etnropy_with_logits_v2 согласно в документации ожидаются немасштабированные входные данные, поскольку он выполняет операцию softmax для logits внутри. Таким образом, ваш второй вход [0, 0, 0, 0, 1] внутренне мягко максимально приближен к чему-то примерно такому, как [0,15, 0,15, 0,15, 0,15, 0,4], а затем кросс-энтропии для этого логита и истинной метки [0, 0, 0, 0, 1] вычисляется как полученное вами значение

...