2016-02-05 13 views
30

La funzione che sto cercando è quella di essere in grado di dire quale sia il gradiente di una determinata variabile rispetto alla mia funzione di errore dati alcuni dati.Come ottengo il gradiente della perdita in una variabile TensorFlow?

Un modo per fare ciò sarebbe vedere quanto la variabile è cambiata dopo una chiamata alla formazione, ma ovviamente può variare in modo massiccio in base all'algoritmo di apprendimento (ad esempio sarebbe quasi impossibile dire qualcosa come RProp) e non è molto pulito.

Grazie in anticipo.

+0

fa la soluzione al vostro lavoro domanda anche se voglio vedere/ispezionare i gradienti man mano che la formazione procede? – Pinocchio

risposta

42

La funzione tf.gradients() consente di calcolare il gradiente simbolico di un tensore rispetto a uno o più tensioni — comprese le variabili. Si consideri il seguente esempio semplice:

data = tf.placeholder(tf.float32) 
var = tf.Variable(...)    # Must be a tf.float32 or tf.float64 variable. 
loss = some_function_of(var, data) # some_function_of() returns a `Tensor`. 

var_grad = tf.gradients(loss, [var])[0] 

È quindi possibile utilizzare questo gradiente simbolico per calcolare il gradiente numerico per alcuni dati particolari:

sess = tf.Session() 

var_grad_val = sess.run(var_grad, feed_dict={data: ...}) 
+3

Cosa fare se si desidera utilizzare la sfumatura insieme a un algoritmo di allenamento incorporato come "GradientDescentOptimizer" o "AdagradOptimizer"? Voglio evitare di dover calcolare il gradiente della rete due volte. – gideonite

+5

La classe 'tf.train.GradientDescentOptimizer' (e le relative classi di' Optimizer') chiamano 'tf.gradients()' internamente. Se vuoi accedere ai gradienti calcolati per l'ottimizzatore, puoi chiamare 'optimizer.compute_gradients()' e 'optimizer.apply_gradients()' manualmente, invece di chiamare 'optimizer.minimize()'. – mrry

+2

@mrry: Giusto per chiarire, però, il gradiente 'simbolico' qui è solo un tensore non valutato e non il reale gradiente simbolico, ad esempio symgrad (x^2) = 2 * x. C'è un modo per ottenere questo senza guardare il tensore? – bge0

Problemi correlati