Ambiguous truth value

ohadkro

New member
Ambiguous truth value

if s_prev == None: s_prev = numpy.zeros_like(self.state.s)

נותן:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
בפייתון 3.5

בתודה מראש
 

BravoMan

Active member
הקוד שלך משתמש בספרייה NumPy

זו ספרייה מתמטית של Python.
היא דורסת אופרטורים בוליאנים עבור מערכים שלה כדי להשוות מערכים בצורות שונות.
&nbsp
השגיאה שקיבלת, כפי שהטקסט שלה מרמז, אומרת שלא ברור איך לעשות את ההשוואה שאתה מבקש לעשות.
&nbsp
אני יכול לנחש, שמה שבאמת התכוונת לעשות (או יותר נכון, מה שכותב בקוד התכוון לעשות) זה לבדוק שהמשתנה לא ריק, כלומר לא מכי None.
&nbsp
במקרה כזה, הדרך הנכונה (כנראה) היית להשתמש ב-is במקום אופרטור השוואה.
 

bismark1

New member
s_prev הוא מערך של numpy

כנראה שהדרך הנכונה היא להשתמש באחת הפונקציות כאן בהתאם לכוונת המשורר.

(וכהערת שוליים - לא ברור מה המטובציה שלך אבל אם זה פשוט לבנות RNN אז בשביל זה יש את כל המימושים הקיימים בחוץ)
 

ohadkro

New member
לא מוצא את הדרך לתרגום הפונקציה לתחביר נכון

מעבר לכך בפועל זה לא עיניין של לבנות אלא לתקן באגים במימושים קיימים של rnn
 

BravoMan

Active member
תגיד, אתה בטוח שהבאת את השורה הנכונה?

סתם מתוך סקרנות ניסיתי לשחזר את השגיאה שלך, ולא נראה שיש בעיה כלשהי להשוות ל-None ספציפית.
&nbsp
לכן, יש לי הרגשה שהשגיאה שראית באה ממקום אחר ולא מהשורה שהדבקת כאן.
&nbsp
&nbsp
 

ohadkro

New member
גם אני התחלתי לחשוד שמקור השגיאה משורה אחרת

למרות שהשגיאה מיוחסת לאותה שורה:
קוד:
C:\Users\i\Documents\lstm.py in bottom_data_is(self, x, s_prev, h_prev)
     83     def bottom_data_is(self, x, s_prev = None, h_prev = None):
     84         # if this is the first lstm node in the network
---> 85         if s_prev == None: s_prev = np.zeros_like(self.state.s)
     86         if h_prev == None: h_prev = np.zeros_like(self.state.h)
     87 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

הקוד:
https://github.com/nicodjimenez/lstm
 

ohadkro

New member
אני לא יודע איך לתרגם את :

Use a.any() or a.all()

לתחביר נכון
 

bismark1

New member
תראה, מה שקורה בזמן ריצה (כנראה)

זה שבקריאה לפונקציה בלי ארגומנטים המשתנה s_prev מאותחל ל-None ואז הבדיקה
if s_prev == None:
היא חוקית, אבל ברגע ש-s_prev הופך להיות מערך של numpy הבדיקה הזו כבר לא חוקית. אתה יכול לעשות משהו בסגנון
if np.any(s_prev == None):

אבל זה צריך להדליק לך נורה אדומה כי זה אומר שמי שכתב את הקוד לא ממש התייחס לטיפוסים של המשתנים שלו, יכול להיות שפתרון עדיף מבחינת התחזוקה והקריאות של הקוד יהיה לשכתב את ההשמה הדיפולטית בפונקציה ולאתחל את s_prev מראש למערך numpy מתאים.
 

ohadkro

New member
התיקון שהצעת פתר את הבעיה ביחס ל:

if np.any(s_prev == None): s_prev = np.zeros_like(self.state.s)
אך כעת השגיאה מופיעה ביחס ל:
---> 86 if np.any(h_prev == None): h_prev = np.zeros_like(self.state.h)

תדפיס השגיאה המלא:

קוד:
ValueError                                Traceback (most recent call last)
<ipython-input-5-c893fea1db45> in <module>()
     47 
     48 if __name__ == "__main__":
---> 49     example_0()
     50 
     51 

<ipython-input-5-c893fea1db45> in example_0()
     34         print("iter", "%2s" % str(cur_iter), end=": ")
     35         for ind in range(len(y_list)):
---> 36             lstm_net.x_list_add(input_val_arr[ind])
     37 
     38         print("y_pred = [" +

C:\Users\i\Documents\lstm.py in x_list_add(self, x)
    191             s_prev = self.lstm_node_list[idx - 1].state.s
    192             h_prev = self.lstm_node_list[idx - 1].state.h
--> 193             self.lstm_node_list[idx].bottom_data_is(x, s_prev, h_prev)
    194 

C:\Users\i\Documents\lstm.py in bottom_data_is(self, x, s_prev, h_prev)
     84         # if this is the first lstm node in the network
     85         if np.any(s_prev == None): s_prev = np.zeros_like(self.state.s)
---> 86         if np.any(h_prev == None): h_prev = np.zeros_like(self.state.h)
     87 
     88 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
 

ohadkro

New member
הדפסה מובילה ל : NameError

NameError: name 'h_prev' is not defined
ולמעשה גם:
NameError: name 's_prev' is not defined
 

BravoMan

Active member
משהו מאוד מוזר לי בקוד שלך!

הסתכלתי על הקישור ל-github ששמת.
הקוד שם שונה, והוא משתמש ב-is.
יש גם הערה שהקוד שונה להשתמש ב-is לפני 4 חודשים בדיוק בגלל השגיאה שהצגת וזה פתר את הבעיה.
&nbsp
הקוד רץ אצלי תקין כפי שהוא מופיע ב-git.
&nbsp
ההבדל היחיד שהוא שאצלי יש Python 3.4 ולא 3.5 אבל אני לא רואה סיבה מיוחדת שזה ישנה. לא מדובר כאן בהבדל בין 2 ל-3.
 

ohadkro

New member
צדקת . הדבר הראשון שרציתי לעשות וויתרתי עליו

היה למחוק ולהתקין מחדש את numpy . הבעיה נפתרה לאחר התקנה מחדש.
 
למעלה