2016-06-06 15 views
11

में आई मैं निम्नलिखित कोड के साथ soft-max को लागू करने की कोशिश की (out_vec तैरता के numpy वेक्टर है):RuntimeWarning: अमान्य मान अधिक से अधिक

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

हालांकि, मैं np.exp(out_vec) की वजह से एक अतिप्रवाह त्रुटि मिली। इसलिए, मैंने np.exp() की ऊपरी सीमा क्या है (मैन्युअल रूप से) की जांच की है, और पाया कि np.exp(709) एक संख्या है, लेकिन np.exp(710) को np.inf माना जाता है। इस प्रकार, अतिप्रवाह त्रुटि से बचने के लिए प्रयास करने के, मैं अपने कोड इस प्रकार संशोधित:

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

क्या लाइन मैं जोड़ा साथ कुछ गड़बड़ है:

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 

अब, मैं एक अलग त्रुटि मिलती है? मैंने इस विशिष्ट त्रुटि को देखा और मुझे जो भी मिला वह त्रुटि को अनदेखा करने के बारे में लोगों की सलाह है। बस त्रुटि को अनदेखा करने से मेरी मदद नहीं होगी, क्योंकि हर बार जब मेरा कोड इस त्रुटि से मुकाबला करता है तो यह सामान्य परिणाम नहीं देता है।

+0

'out_vec' सरणी' NaN' या 'Inf' मान हैं? – kvorobiev

+0

@kvorobiev क्या आप जानते हैं कि मैं चेतावनी कैसे पकड़ सकता हूं ताकि मैं जांच सकूं? – Cheshie

+0

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

उत्तर

13

आपकी समस्या या Inf तत्वों के कारण out_vec सरणी के कारण होती है। आप इस समस्या से बचने के लिए निम्न कोड इस्तेमाल कर सकते हैं:

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

या आप अपने सरणी में NaN मूल्यों को छोड़ने के लिए निम्नलिखित कोड का उपयोग कर सकता:

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

धन्यवाद @kvorobiev देखें, लेकिन मैं ऐसा नहीं कर सकता - केवल तत्वों को हटाने से डेटा हानि होगी ... – Cheshie

+0

@ चेसी कृपया, अपडेट देखें – kvorobiev

0

IMO बेहतर तरीका एक का उपयोग किया जाएगा घातीय राशि के योग की अधिक संख्यात्मक स्थिर कार्यान्वयन।

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

मेरे मामले में चेतावनी जब तुलना करने से पहले इस बुला नहीं दिखा था (मैं NaN तुलना में हो रही मूल्यों की थी)

np.warnings.filterwarnings('ignore') 
संबंधित मुद्दे