2016-06-06 15 views
11

karşılaşılan: AncakRuntimeWarning: geçersiz değer (<code>out_vec</code> yüzen bir <code>numpy</code> vektörüdür) Aşağıdaki kod ile <a href="https://en.wikipedia.org/wiki/Softmax_function" rel="noreferrer">soft-max</a> uygulamaya çalışmıştır büyük

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

, çünkü np.exp(out_vec) bir taşma hata var. Bu nedenle, np.exp()'un üst sınırının ne olduğunu (el ile) işaretledim ve np.exp(709)'un bir sayı olduğunu ancak np.exp(710)'un np.inf olarak kabul edildiğini gördüm.

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

ekledim çizgi nesi var:

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 

Şimdi, farklı bir hata alıyorum şu şekildedir: Böylece, taşma hatasını önlemek için denemek için, benim kod modifiye? Bu özel yanılgıya baktım ve bulduğum her şey, insanların hatayı nasıl yok edeceğine dair tavsiyesi. Sadece hatayı göz ardı etmek bana yardımcı olmaz, çünkü kodum her defasında bu hatayla karşılaşırsa, normal sonuçları vermez.

+0

'out_vec' dizi' NaN' veya 'Inf' değerleri içeren (I NaN karşılaştırıldığında elde edilen değerler vardı)? – kvorobiev

+0

@kvorobiev uyarımı nasıl yakalayabileceğimi biliyor musun? – Cheshie

+0

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

cevap

13

Sorununuz, out_vec dizininizdeki NaN veya Inf öğelerinden kaynaklanır. Bu sorunu önlemek için aşağıdaki kodu kullanabilirsiniz:

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

ya da dizideki NaN değerlerini terk etmek aşağıdaki kodu kullanabilirsiniz: IMO daha iyi bir yol bir kullanmak olacaktır

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

Teşekkürler @kvorobiev, ama bunu yapamam - sadece öğeleri kaldırarak veri kaybına neden olacak ... – Cheshie

+0

@Cheshie Lütfen güncelleme – kvorobiev

0

üstellerin toplamının sayısal olarak daha kararlı bir şekilde uygulanması. Karşılaştırma önce bu çağrılırken Benim durumumda

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

uyarı gelmedi

np.warnings.filterwarnings('ignore')