Frage

Ich berechnet die Kosten auf folgende Weise:

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

Bei den ersten Kosten bekomme ich 0,693147, was bei einer binären Klassifizierung zu erwarten ist, wenn Parameter/Gewichte auf 0 initialisiert werden.

Ich verwende One_hot -Labels.

Nach Abschluss einer Trainingspoche finde ich jedoch einen stochastischen Gradientenabstieg von mehr als 1.

Soll das zu erwarten?

War es hilfreich?

Lösung

Das folgende Stück Code tut im Wesentlichen was TFs softmax_cross_entropy_with_logits Funktionen tun (Kreuzung auf Softmaxed y_ und y):

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

Wie Sie sehen können, gibt es keinen Grund, warum die Kreuzung bei der Binärklassifizierung nicht> 1 sein kann und es nicht schwer ist, ein solches Beispiel zu finden.

** Die obige Kreuzung wird wie in berechnet https://www.kaggle.com/wiki/logarithmicloss, Softmax wie in https://en.wikipedia.org/wiki/softmax_function

UPD: Es gibt eine großartige Erklärung dafür, was es bedeutet, wenn Logloss> 1 bei SO: https://stackoverflow.com/a/35015188/1166478

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top