2016-06-06 14 views
11

ho cercato di attuare soft-max con il seguente codice (out_vec è una numpy vettore di galleggianti):RuntimeWarning: valido valore rilevato in maggiore

numerator = np.exp(out_vec) 
denominator = np.sum(np.exp(out_vec)) 
out_vec = numerator/denominator 

Tuttavia, ho ottenuto un errore di overflow causa di np.exp(out_vec). Pertanto, ho controllato (manualmente) qual è il limite superiore di np.exp() e ho riscontrato che np.exp(709) è un numero, ma np.exp(710) è considerato come np.inf. Così, per cercare di evitare l'errore di overflow, ho modificato il mio codice come segue:

out_vec[out_vec > 709] = 709 #prevent np.exp overflow 
numerator = np.exp(out_vec) 
denominator = np.sum(np.exp(out_vec)) 
out_vec = numerator/denominator 

Ora, ottengo un errore diverso:

RuntimeWarning: invalid value encountered in greater out_vec[out_vec > 709] = 709 

Cosa c'è di sbagliato con la linea ho aggiunto? Ho cercato questo specifico errore e tutto quello che ho trovato è il consiglio della gente su come ignorare l'errore. Semplicemente ignorare l'errore non mi aiuterà, perché ogni volta che il mio codice incontra questo errore non dà i soliti risultati.

+0

'gamma out_vec' contiene' 'NaN' o valori Inf'? – kvorobiev

+0

@kvorobiev sai come ho potuto ricevere l'avviso in modo da poter controllare? – Cheshie

+0

Prova 'np.isnan (np.sum (out_vec))' – kvorobiev

risposta

13

Il tuo problema è causato dagli elementi NaN o Inf nell'array out_vec. È possibile utilizzare il seguente codice per evitare questo problema:

if np.isnan(np.sum(out_vec)): 
    out_vec = out_vec[~numpy.isnan(out_vec)] # just remove nan elements from vector 
out_vec[out_vec > 709] = 709 
... 

o è possibile utilizzare il seguente codice per lasciare i valori NaN nella propria matrice:

out_vec[ np.array([e > 709 if ~np.isnan(e) else False for e in out_vec], dtype=bool) ] = 709 
+2

Grazie a @kvorobiev, ma non posso farlo - la semplice rimozione degli elementi causerà la perdita di dati ... – Cheshie

+0

@Cheshie Per favore, vedi l'aggiornamento – kvorobiev

0

IMO il modo migliore sarebbe quella di utilizzare un implementazione più numericamente stabile della somma di esponenziali.

from scipy.misc import logsumexp 
out_vec = np.exp(out_vec - logsumexp(out_vec)) 
0

Nel mio caso l'allarme non si fece vedere quando si chiama questo prima del confronto (avevo NaN valori ottenendo rispetto)

np.warnings.filterwarnings('ignore') 
Problemi correlati