Sto cercando di eseguire il debug di un'architettura NN un po 'complicata e non canonica. Calcolare l'inoltro in avanti va bene e mi dà i risultati attesi, ma quando provo a ottimizzare l'utilizzo di Adam o di uno qualsiasi degli ottimizzatori standard, anche dopo un'iterazione con un tasso di apprendimento molto piccolo ottengo nans ovunque. Sto cercando di localizzarli e mi stavo chiedendo se c'è un modo per catturare la prima occorrenza di una nan e rilevare in quale op è sorta? Ho provato tf.add_check_numerics_ops()
ma sembra che non stia facendo nulla, o forse lo sto usando in modo errato.Debugging nans nel pass backward
11
A
risposta
18
Il debug dei NaN può essere complicato, soprattutto se si dispone di una rete di grandi dimensioni. tf.add_check_numerics_ops()
aggiunge operazioni al grafico che asseriscono che ciascun tensore a virgola mobile nel grafico non contiene alcun valore NaN, ma non esegue questi controlli per impostazione predefinita. Invece si restituisce un op che è possibile eseguire periodicamente, o ad ogni passo, come segue:
train_op = ...
check_op = tf.add_check_numerics_ops()
sess = tf.Session()
sess.run([train_op, check_op]) # Runs training and checks for NaNs
2
Forse si potrebbe aggiungere ops stampa a sospettare valori ops di stampa, qualcosa di simile
print_ops = []
for op in ops:
print_ops.append(tf.Print(op, [op],
message='%s :' % op.name, summarize=10))
print_op = tf.group(*print_ops)
sess.run([train_op, print_op])
Per aggiungere a tutte le operazioni, è possibile fare un ciclo lungo le linee di add_check_numerics_ops
.
Problemi correlati
- 1. Simple Python String (Backward) Slicing
- 2. NumPy cumSum considerando NaNs
- 3. Ignorando NaNs con str.contains
- 4. NaNs confronto uguali in Numpy
- 5. PHP Pass di riferimento nel foreach
- 6. Che cosa significa exc_breakpoint nel debugging?
- 7. Debugging Intents
- 8. Debugging isolati
- 9. javascript pass
- 10. panda groupby e rolling_apply ignorando NaNs
- 11. Pandas: Conversione numerica, creando NaNs quando necessario
- 12. Pandas - NaNs Inserimento dei dati categoriali
- 13. Debugging CurrentAppSimulator.GetAppReceiptAsync()
- 14. Cosa c'è di sbagliato nel debugging in Eclipse su Android?
- 15. Imposta debugging degli argomenti protractor nel codice studio visivo
- 16. Debugging/Testing codice LPC
- 17. LLDB C++ debugging
- 18. Debugging route in codeigniter?
- 19. Schema pass-per-riferimento
- 20. pass proxy condizionale nginx
- 21. parametro Pass EventHandler
- 22. Pass Class come parametro
- 23. elemento Pass direttiva angolare
- 24. MVC Pass ViewBag to Controller
- 25. FluentValidation parametro pass per withMessage
- 26. Debugging chiamate lapply/sapply
- 27. Java: debugging con SwingUtilities.invokeLater()
- 28. IE8 XmlHttpRequest Debugging
- 29. debugging littler/Rscripts
- 30. Debugging Node.js con Eclipse
Il problema è che una volta eseguito il treno_op, i nans si propagano attraverso la rete e quindi è inutile trovare la causa. Quello che mi piacerebbe fare è eseguire i passaggi avanti e indietro, e non appena viene generata una nan, viene lanciata un'eccezione dall'opzione offendente. –
Se esegui 'train_op' e' check_op' insieme, dovresti ricevere un errore che riporta il primo nodo che ha un NaN - puoi catturare il 'tf.InvalidArgumentError' che viene sollevato ed estrarre l'op dal suo'. op' proprietà. Con un handle per l'op, è possibile accedere alla sua proprietà 'op.inputs [0]' per vedere quale tensore aveva valori NaN. – mrry
Ok grazie questo lo farà! –