2016-03-18 11 views
5

OK, quindi mi sto preparando per eseguire la funzione tf.nn.softmax_cross_entropy_with_logits() in Tensorflow.TensorFlow: i miei registri sono nel formato corretto per la funzione cross entropy?

È a mia conoscenza che i 'logits' dovrebbero essere un Tensore di probabilità, ognuno corrispondente alla probabilità di un certo pixel che faccia parte di un'immagine che alla fine sarà un "cane" o un "camion" o qualsiasi altra cosa. .. un numero finito di cose.

Questi logit otterrà collegato a questa equazione dell'entropia croce: Cross entropy formula from Wikipedia

A quanto mi risulta, i logit siano inseriti nel lato destro dell'equazione. Cioè, sono la q di ogni x (immagine). Se fossero probabilità da 0 a 1 ... avrebbe senso per me. Ma quando eseguo il mio codice e finisco con un tensore di logiti, non ho probabilità. Invece ricevo float sia positivi che negativi:

-0.07264724 -0.15262917 0.06612295 ..., -0.03235611 0.08587133 0.01897052 0.04655019 -0.20552202 0.08725972 ..., -0.02107313 -0.00567073 0.03241089 0.06872301 -0.20756687 0.01094618 ..., etc 

Quindi la mia domanda è ... è giusto? Devo in qualche modo calcolare tutti i miei logiti e trasformarli in probabilità da 0 a 1?

+0

Una [domanda correlata] (https://stackoverflow.com/q/47034888/712995), che delinea le differenze tra le diverse funzioni di cross-entropy. – Maxim

risposta

13

La cosa importante da notare è che tf.nn.softmax_cross_entropy_with_logits(logits, labels) esegue un softmax interno ad ogni fila di logits modo che sono interpretabili come probabilità prima di essere alimentati all'equazione dell'entropia croce.

Pertanto, "logits" non devono essere probabilità (o anche vere probabilità di registro, come suggerito dal nome), a causa della normalizzazione interna che avviene all'interno di tale op.

Un modo alternativo per scrivere:

xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels) 

... sarebbe:

softmax = tf.nn.softmax(xent) 
xent = -tf.reduce_sum(labels * tf.log(softmax), 1) 

Tuttavia, questa alternativa sarebbe (i) meno numericamente stabile (dal momento che il SoftMax può calcolare molto più grande valori) e (ii) meno efficienti (dal momento che alcuni calcoli ridondanti si verificano nel backprop). Per gli usi reali, ti consigliamo di utilizzare tf.nn.softmax_cross_entropy_with_logits().

+1

Significa che posso semplicemente fornire 'output' come' logits'? – Sangram

+1

@mrry che dire di 'tf.nn.sparse_softmax_cross_entropy_with_logits'? Fornisce lo stesso di 'tf.nn.softmax_cross_entropy_with_logits' ma senza etichette una codifica a caldo. È giusto ? – Kyrol

+0

@Kyrol: Sì, è vero. – mrry