2016-06-06 5 views
11

starałem się wdrożyć soft-max z następującego kodu (out_vec jest numpy wektor pływaków):RuntimeWarning: nieprawidłowa wartość napotkanych w większym

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

Jednak mam błąd przepełnienia z powodu np.exp(out_vec). Dlatego sprawdziłem (ręcznie), jaki jest górny limit np.exp() i ustalono, że np.exp(709) jest liczbą, ale np.exp(710) jest uważane za np.inf. Tak więc, aby spróbować uniknąć błędu przepełnienia, zmodyfikowałem mój kod w następujący sposób:

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 

Teraz mam inny błąd:

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

Co jest nie tak z linii I dodaje? Sprawdziłem ten konkretny błąd i znalazłem tylko porady ludzi, jak zignorować ten błąd. Po prostu ignorowanie błędu nie pomoże mi, ponieważ za każdym razem, gdy mój kod napotka ten błąd, nie daje to zwykłych rezultatów.

+0

'' out_vec' tablica zawiera wartości Inf' NaN' lub '? – kvorobiev

+0

@kvorobiev, czy wiesz, jak mogłem złapać ostrzeżenie, aby sprawdzić? – Cheshie

+0

Spróbuj 'np.isnan (np.sum (out_vec))' – kvorobiev

Odpowiedz

13

Twój problem jest spowodowany przez elementy NaN lub Inf w twojej macierzy out_vec. Można użyć następującego kodu, aby uniknąć tego problemu:

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 
... 

lub można użyć następującego kodu do opuszczenia wartości NaN w swojej tablicy:

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

Dzięki @kvorobiev, ale nie mogę tego zrobić - po prostu usunięcie elementów spowoduje utratę danych ... – Cheshie

+0

@Cheshie Proszę zobaczyć aktualizację – kvorobiev

0

IMO lepszym sposobem byłoby użyć bardziej liczbowo stabilna implementacja sumy wykładników.

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

W moim przypadku ostrzeżenie nie pojawi się podczas wywoływania tego wcześniej porównania (miałem NaN wartości porównuje uzyskiwanie)

np.warnings.filterwarnings('ignore') 
Powiązane problemy