ValueError: too many values to unpack (expected 5)

ohadkro

New member
ValueError: too many values to unpack (expected 5)

מנסה להריץ סקריפט בפייתון 3.5 ומקבל את הודעת השגיאה הבאה

קוד:
ValueError                                Traceback (most recent call last)
<ipython-input-1-69687b0ea129> in <module>()
    328 for i in range(1, iterations):
    329     #compute predicted next word
--> 330     RNN.forwardProp()
    331     #update all our weights using our error
    332     error = RNN.backProp()

<ipython-input-1-69687b0ea129> in forwardProp(self)
     54         for i in range(1, self.rl+1):
     55             self.LSTM.x = np.hstack((self.ha[i-1], self.x))
---> 56             cs, hs, f, c, o = self.LSTM.forwardProp()
     57             #store computed cell state
     58             self.ca[i] = cs

ValueError: too many values to unpack (expected 5)

בתודה מראש
 

BravoMan

Active member
ואתה מצפה שננחש?

נראה שאתה מנסה לפרוס tuple, אבל כמות הערכים שאתה מצפה להם (cs hs f c o) לא תואמת לכמות הערכים שיש ב-tuple ש- self.LSTM.forwardProp() מחזירה.
&nbsp
עד כאן מה שהשגיאה אומרת.
&nbsp
כדי להבין למה זה קרה לך, אנחנו צריכים לדעת מה זה LSTM.
ומה עושה מתודה forwardProp שלו.
&nbsp
היות ואנחנו לא יודעים, לא נוכל לעזור...
 

ohadkro

New member
הקוד במלואו :

קוד:
import numpy as np

class RecurrentNeuralNetwork:
    #input (word), expected output (next word), num of words (num of recurrences), array expected outputs, learning rate
    def __init__ (self, xs, ys, rl, eo, lr):
        #initial input (first word)
        self.x = np.zeros(xs)
        #input size 
        self.xs = xs
        #expected output (next word)
        self.y = np.zeros(ys)
        #output size
        self.ys = ys
        #weight matrix for interpreting results from LSTM cell (num words x num words matrix)
        self.w = np.random.random((ys, ys))
        #matrix used in RMSprop
        self.G = np.zeros_like(self.w)
        #length of the recurrent network - number of recurrences i.e num of words
        self.rl = rl
        #learning rate 
        self.lr = lr
        #array for storing inputs
        self.ia = np.zeros((rl+1,xs))
        #array for storing cell states
        self.ca = np.zeros((rl+1,ys))
        #array for storing outputs
        self.oa = np.zeros((rl+1,ys))
        #array for storing hidden states
        self.ha = np.zeros((rl+1,ys))
        #forget gate 
        self.af = np.zeros((rl+1,ys))
        #input gate
        self.ai = np.zeros((rl+1,ys))
        #cell state
        self.ac = np.zeros((rl+1,ys))
        #output gate
        self.ao = np.zeros((rl+1,ys))
        #array of expected output values
        self.eo = np.vstack((np.zeros(eo.shape[0]), eo.T))
        #declare LSTM cell (input, output, amount of recurrence, learning rate)
        self.LSTM = LSTM(xs, ys, rl, lr)
    
    #activation function. simple nonlinearity, convert nums into probabilities between 0 and 1
    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))
    
    #the derivative of the sigmoid function. used to compute gradients for backpropagation
    def dsigmoid(self, x):
        return self.sigmoid(x) * (1 - self.sigmoid(x))    
    
    #lets apply a series of matrix operations to our input (curr word) to compute a predicted output (next word)
    def forwardProp(self):
        for i in range(1, self.rl+1):
            self.LSTM.x = np.hstack((self.ha[i-1], self.x))
            cs, hs, f, c, o = self.LSTM.forwardProp()
            #store computed cell state
            self.ca[i] = cs
            self.ha[i] = hs
            self.af[i] = f
            self.ai[i] = inp
            self.ac[i] = c
            self.ao[i] = o
            self.oa[i] = self.sigmoid(np.dot(self.w, hs))
            self.x = self.eo[i-1]
        return self.oa
   
    
    def backProp(self):
        #update our weight matrices (Both in our Recurrent network, as well as the weight matrices inside LSTM cell)
        #init an empty error value 
        totalError = 0
        #initialize matrices for gradient updates
        #First, these are RNN level gradients
        #cell state
        dfcs = np.zeros(self.ys)
        #hidden state,
        dfhs = np.zeros(self.ys)
        #weight matrix
        tu = np.zeros((self.ys,self.ys))
        #Next, these are LSTM level gradients
        #forget gate
        tfu = np.zeros((self.ys, self.xs+self.ys))
        #input gate
        tiu = np.zeros((self.ys, self.xs+self.ys))
        #cell unit
        tcu = np.zeros((self.ys, self.xs+self.ys))
        #output gate
        tou = np.zeros((self.ys, self.xs+self.ys))
        #loop backwards through recurrences
        for i in range(self.rl, -1, -1):
            #error = calculatedOutput - expectedOutput
            error = self.oa[i] - self.eo[i]
            #calculate update for weight matrix
            #(error * derivative of the output) * hidden state
            tu += np.dot(np.atleast_2d(error * self.dsigmoid(self.oa[i])), np.atleast_2d(self.ha[i]).T)
            #Time to propagate error back to exit of LSTM cell
            #1. error * RNN weight matrix
            error = np.dot(error, self.w)
           &
 

ohadkro

New member
לא נקלט כנראה בשל אורכו

אז בקיצור :
קוד:
class LSTM:
    # LSTM cell (input, output, amount of recurrence, learning rate)
    def __init__ (self, xs, ys, rl, lr):
        #input is word length x word length
        self.x = np.zeros(xs+ys)
        #input size is word length + word length
        self.xs = xs + ys
        #output 
        self.y = np.zeros(ys)
        #output size
        self.ys = ys
        #cell state intialized as size of prediction
        self.cs = np.zeros(ys)
        #how often to perform recurrence
        self.rl = rl
        #balance the rate of training (learning rate)
        self.lr = lr
        #init weight matrices for our gates
        #forget gate
        self.f = np.random.random((ys, xs+ys))
        #input gate
        self.i = np.random.random((ys, xs+ys))
        #cell state
        self.c = np.random.random((ys, xs+ys))
        #output gate
        self.o = np.random.random((ys, xs+ys))
        #forget gate gradient
        self.Gf = np.zeros_like(self.f)
        #input gate gradient
        self.Gi = np.zeros_like(self.i)
        #cell state gradient
        self.Gc = np.zeros_like(self.c)
        #output gate gradient
        self.Go = np.zeros_like(self.o)




--------------------------------------------------------------------------

    def forwardProp(self):
        for i in range(1, self.rl+1):
            self.LSTM.x = np.hstack((self.ha[i-1], self.x))
            cs, hs, f, c, o = self.LSTM.forwardProp()
            #store computed cell state
            self.ca[i] = cs
            self.ha[i] = hs
            self.af[i] = f
            self.ai[i] = inp
            self.ac[i] = c
            self.ao[i] = o
            self.oa[i] = self.sigmoid(np.dot(self.w, hs))
            self.x = self.eo[i-1]
        return self.oa
 

BravoMan

Active member
טוב, זה די מסביר את העניין:

הקוד שלך לא הגיוני בעליל!

בבנאי (init) אתה מקבל את rl כפרמטר, שישמש כמונה לולאה.
אבל ב-forwardProp אתה יוצא מנקודת הנחה שכמות המעברים בלולאה היא תמיד קבוע, ותמיד 5 בדיוק.

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

אני באמת לא יודע מה אתה מנסה לעשות פה, אבל הקוד נראה בעייתי ביותר ולא הגיוני.

זה קוד שאתה כתבת?
תרגיל?

או שאתה מנסה להיעזר בקוד של מישהו אחר לחישוב כלשהו?

אולי אם תפרט יותר ניתן יהיה לעזור...

אני יכול לתת לך דרך לעקוף את השגיאה:
קוד:
def forwardProp(self):
        for i in range(1, self.rl+1):
            self.LSTM.x = np.hstack((self.ha[i-1], self.x))
            cs, hs, f, c, o = self.LSTM.forwardProp()[:5]

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

BravoMan

Active member
כן ו...?

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

BravoMan

Active member
וכמה אתה משלם למומחה?

שאני אבין: אתה מנסה לעשות משהו עם "רשתות עצביות", נושא מורכב למדי.

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

שיהיה לך לבריאות!

בכל מקרה, הבאת לי קוד לא נכון בפעם הקודמת.
רפרוף מהיר בדוגמה מהקישור האחרון שלך מראה שהפונקציה forwardProp במחלקה LSTM מחזירה 6 אלמנטים.
באותה דוגמה, הקריאה לפונקציה גם מצפה לקבל 6 אלמנטים:
cs, hs, f, inp, c, o = self.LSTM.forwardProp()
לא יודע למה אצלך בחרת למחוק אחד מהם והנחת שזה פשוט יעבוד...

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

אני לא חושב שתמצא אחד בפורום הזה, אבל שיהיה בהצלחה...
 

ohadkro

New member
לא מחקתי דבר

הודעת השגיאה כוללת :
cs, hs, f, c, o = self.LSTM.forwardProp()

נסה ותיווכח.
מעבר לכך מטרת הקוד לא רלוונטית לעצם השאלה.
תודה על העזרה בכל מקרה.
 

BravoMan

Active member
תסתכל על שורת הקוד בהודעתי הקודמת!

היא לקוחה מה-tutorial שאתה עצמך קישרת אליו!
שם מופיע משתנה inp בין f ל-c.
&nbsp
אצלך הוא חסר וזה מה שגורם לשגיאה.
&nbsp
ואתה לא שאלת שאלה!
אתה הצגת חתיכת קוד והודעת שגיאה.
&nbsp
אם רוצים לדעת איך לתקן נכון את השגיאה, צריך להבין מה הקוד עושה, כדי לדעת מה יהיה קוד נכון ומה יהיה קוד לא נכון.
&nbsp
אז מטרת הקוד מאוד רלוונטית לשאלה.
אחרת, קח את התיקון שהצעתי לך לפני 2 הודעות. הוא יתקן את השגיאה.
ואם מטרת הקוד לא רלוונטית, אז בטח לא אכפת לך מהתוצאה שתקבל בסוף. העיקר לא תהיה לך שגיאה...
 

ohadkro

New member
שוב :

cs, hs, f, inp, c, o = self.LSTM.forwardProp()
מופיע גם אצלי בקוד,ראה:
http://www.filedropper.com/code111

עם זאת:
cs, hs, f, c, o = self.LSTM.forwardProp()
מופיע בהודעת שגיאה (ראה ההודעה הראשונה בשירשור).
 

BravoMan

Active member
לא, זה לא מה שמופיע אצלך בקוד!

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

ohadkro

New member
ok , הבעיה נפתרה, לפחות עד הבאג הבא

שורה 56 צריכה להיות זהה לשורה 138
 

deepspace

New member
הקוד הזה מקפיץ בדיוק את אותה השגיאה אם forwardProp

מחזירה פחות מ- 5 אלמנטים.

עריכה: עכשיו ראיתי שהבעיה שלו היא אם forwardProp מחזירה יותר מ- 5..
 
למעלה