Question

Je suis coût du calcul de la manière suivante:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y, y_) 
cost = tf.reduce_mean(cross_entropy); 

Pour le premier prix, je me fais 0,693147, ce qui est à prévoir sur une classification binaire lorsque les paramètres / poids sont initialisés à 0.

J'utilise one_hot étiquettes.

Cependant, après avoir terminé une période de formation en utilisant descente de gradient stochastique je trouve un coût supérieur à 1.

Est-ce à attendre?

Était-ce utile?

La solution

La pièce de code suivant fait essentiellement ce que les fonctions de softmax_cross_entropy_with_logits de TF fait (crossentropy sur y_ et y softmaxed):

import scipy as sp
import numpy as np

def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)

def crossentropy(true, pred):    
    epsilon = 1e-15

    pred = sp.maximum(epsilon, pred)
    pred = sp.minimum(1-epsilon, pred)

    ll = -sum(
        true * sp.log(pred) + \
            sp.subtract(1,true) * \
            sp.log(sp.subtract(1, pred))
    ) / len(true)

    return ll

==

true = [1., 0.]
pred = [5.0, 0.5]

true = softmax(true)
pred = softmax(pred)

print true
print pred

print crossentropy(true, pred)

==

[ 0.73105858  0.26894142]
[ 0.98901306  0.01098694]
1.22128414101

Comme vous pouvez le voir, il n'y a aucune raison crossentropy sur la classification binaire ne peut pas être> 1 et il est pas difficile de trouver tel exemple.

** Crossentropy ci-dessus est calculé comme dans https://www.kaggle.com/wiki/LogarithmicLoss , SOFTMAX comme dans https://en.wikipedia.org/wiki/Softmax_function

UPD: il y a une grande explication de ce que cela signifie quand logloss est> 1 à SO: https://stackoverflow.com/ a / 35015188/1166478

Licencié sous: CC-BY-SA avec attribution
scroll top