2015-11-13 21 views
6

Sto provando TensorFlow e sto correndo uno strano errore. Ho modificato il deep MNIST di esempio per usare un altro set di immagini, e l'algoritmo converge di nuovo bene, fino a circa l'iterazione 8000 (precisione del 91% a quel punto) quando si blocca con il seguente errore.L'input dei reclami ReluGrad di TensorFlow non è limitato

tensorflow.python.framework.errors.InvalidArgumentError: ReluGrad input is not finite 

In un primo momento ho pensato che forse alcuni coefficienti stavano raggiungendo il limite per un galleggiante, ma l'aggiunta di regolarizzazione L2 su tutti i pesi & pregiudizi non ha risolto il problema. E 'sempre la prima applicazione Relu che viene fuori dalla stacktrace:

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 

sto lavorando su CPU solo per ora. Qualche idea su cosa potrebbe causare questo e su come aggirarlo?

Modifica: l'ho tracciato fino a questo problema Tensorflow NaN bug?, la soluzione lì funziona.

+0

Ho anche notato che se la riga 'train_step = tf.train.AdamOptimizer (1e-4) .minimize (cross_entropy)' Modifico il valore su 1e-3, l'arresto anomalo si verifica in modo significativo prima. Tuttavia, cambiandola in 1e-5 impedisce all'algoritmo di convergere. – user1111929

+0

Per Adam, potresti voler aumentare l'argomento 'epsilon'. L'impostazione corrente è 'epsilon = 1e-8'. Guarda la documentazione. Dice "Ad esempio, quando si allena una rete di Inception su ImageNet una buona scelta corrente è 1.0 o 0.1". Vedi anche [questo] (https://github.com/tensorflow/tensorflow/issues/323#issuecomment-159116515) discussione. – Albert

risposta

3

Da quando ho avuto un altro argomento su questo tema [Tensorflow NaN bug?] non ho tenuto questo uno aggiornato, ma la soluzione è stato lì per un po 'e da allora è stato ripreso da manifesti qui. Il problema è in realtà 0 * log (0) risultante in un NaN.

Un'opzione consiste nell'utilizzare la linea che Muaaz suggerisce qui o quella che ho scritto nell'argomento collegato. Ma alla fine TensorFlow ha questa routine incorporata: tf.nn.softmax_cross_entropy_with_logits e questo è più efficiente e dovrebbe quindi essere preferito quando possibile. Questo dovrebbe essere usato dove possibile invece delle cose che io e Muaaz abbiamo suggerito in precedenza, come sottolineato da un commentatore su detto link.

1

Ho riscontrato questo errore: input is not finite precedente (non con tf.nn.relu). Nel mio caso il problema era che gli elementi nella mia variabile tensoriale hanno raggiunto un numero molto grande (che li ha contrassegnati come infiniti e quindi il messaggio input is not finite).

Vorrei suggerire di aggiungere una serie di output di debug a tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) ad ogni n-esima iterazione da tracciare quando esattamente ha raggiunto l'infinito.

Questo sembra coerente con il proprio commento:

I modify the value to 1e-3, the crash occurs significantly earlier. However, changing it to 1e-5 prevents the algorithm from converging

+0

Couly hai elaborato perché questo è coerente con il mio commento? Ho aggiunto un ritaglio: relu (clip (...)) e ora ottengo i valori NaN nella mia uscita anziché in infinito, quindi ritengo che questa non sia la radice del problema. Potrebbe essere che una volta che una soluzione diventa buona, l'algoritmo di ottimizzazione non può fare più nulla e si blocca (o fa 0/0) invece di fermarsi? Non sei sicuro di come continuare se questo è il caso. – user1111929

+0

Per quanto riguarda l'aggiunta di informazioni di debug, l'ho fatto e alcuni valori continuano a crescere in modo efficace. Logico: la convoluzione li fa aumentare di un fattore importante. La crescita è così grande che la regolarizzazione non aiuta abbastanza (o almeno rende inefficiente l'algoritmo prima di risolvere effettivamente questo problema). Apparentemente il ritaglio non aiuta. Nemmeno sostituiva relu di softplus (quindi l'algoritmo non converge più in un buon classificatore). Altre idee su cosa potrei provare? – user1111929

+0

@ user1111929 se hanno raggiunto un infinito, allora questa domanda è risolta. Fai un'altra domanda su come trattare con 'relu' per impedirgli di raggiungere l'infinito. –

9

errore è dovuto al 0log (0)

Ciò può essere evitato:

cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9)) 
+1

Questo sembra funzionare per me. – bge0

+0

Esatto. Come lo hai capito? – syzygy

1

non posso commentare perché di reputazione, ma Muaaz ha la risposta. L'errore può essere replicato addestrando un sistema con 0 errore - risultante in log (0). La sua soluzione funziona per impedirlo. In alternativa, prendi l'errore e vai avanti.

...your other code... 
try : 
    for i in range(10000): 
    train_accuracy = accuracy.eval(feed_dict={ 
      x:batch_xs, y_: batch_ys, keep_prob: 1.0}) 

except : print("training interupted. Hopefully deliberately")