RuntimeError: maximum recursion depth exceeded

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Romaxx
User
Beiträge: 62
Registriert: Donnerstag 26. Januar 2017, 18:53

Hallo,

ich bekomme den Fehler:

Code: Alles auswählen

...

  File "theano\compile\pfunc.py", line 93, in clone_v_get_shared_updates
    clone_v_get_shared_updates(i, copy_inputs_over)

  File "theano\compile\pfunc.py", line 93, in clone_v_get_shared_updates
    clone_v_get_shared_updates(i, copy_inputs_over)

RuntimeError: maximum recursion depth exceeded
ich habe sys.setrecursionlimit() schon auf sehr hohe Werte eingestellt, was nichts genutzt hat.

Ich habe in meinen Code zuvor diese for loop eingebaut:

[codebox=python file=Unbenannt.txt]
EPhiTPhi = np.zeros((50,50))
for i in range(0, 900):
D_n_temp = SIGMA_trf[i,:][None,None, :] # M x M x Q
d_n_temp = MU[i,:][None,None, :] # M x M x Q
EPhiTPhi = EPhiTPhi + T.exp(-0.5 * (S_hat_minus**2 * D_n_temp).sum(2)) * T.cos((S_hat_minus * d_n_temp).sum(2) + big_sum_minus) + T.exp(-0.5 * (S_hat_plus**2 * D_n_temp).sum(2)) * T.cos((S_hat_plus * d_n_temp).sum(2) + big_sum_plus) # M x M
[/code]

Liegt wahrscheinlich daran..
Nur was kann ich ändern, sodass es geht?

Danke und grüße
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

In deinem Codeabschnitt sehe ich nichts Auffälliges. Von wem stammt clone_v_get_shared_updates()? Ist das von dir oder von einem weiteren Modul? Anscheinend ruft diese Funktion sich immer wieder selbst auf. Das müsste man halt verhindern. Ich kenne das vor allem in Zusammenhang mit __dunder_methods__ (z.B __getitem__() und sowas) und generell in abgeleiteten Klassen, dass man da bei einer eigenen Implementierung versehentlich "sich selbst" nochmal aufruft. Da bräuchte man schon weitere Infos und ggf mehr Code von dir.
Romaxx
User
Beiträge: 62
Registriert: Donnerstag 26. Januar 2017, 18:53

Sie stammt von Theano, siehe https://github.com/Theano/Theano/blob/m ... e/pfunc.py Zeile 75.
Ich habe lediglich in einer function:


[codebox=python file=Unbenannt.txt]def get_EPhi(self, lengthscale_trf, lengthscale_p_trf, sf_trf, S, MU, SIGMA_trf, U, b, N, M):

# lengthscale_trf # Q
# lengthscale_p_trf # Q
# sf_trf # 1
# S # M x Q
# MU # N x Q
# SIGMA_trf # N x Q
# U # M x Q
# b # M
# N # 1
# M # 1

... other Code

# decay1 = T.exp(-0.5 * ((S_hat_minus**2)[ :, :,None, :] * D_n).sum(3)) # M x M x N x Q
# decay2 = T.exp(-0.5 * ((S_hat_plus**2)[ :, :,None, :] * D_n).sum(3)) # M x M x N x Q
# cos_w1 = T.cos((S_hat_minus[ :, :,None, :] * d_n).sum(3) + big_sum_minus[ :, :,None]) # M x M x N x Q
# cos_w2 = T.cos((S_hat_plus[ :, :,None, :] * d_n).sum(3) + big_sum_plus[ :, :,None]) # M x M x N x Q
# EPhiTPhi = (sf_trf/M) * (decay1 * cos_w1 + decay2 * cos_w2).sum(2) # M x M

EPhiTPhi = np.zeros((50,50))
for i in range(0, 900):
D_n_temp = SIGMA_trf[i,:][None,None, :] # M x M x Q
d_n_temp = MU[i,:][None,None, :] # M x M x Q
EPhiTPhi = EPhiTPhi + T.exp(-0.5 * (S_hat_minus**2 * D_n_temp).sum(2)) * T.cos((S_hat_minus * d_n_temp).sum(2) + big_sum_minus) + T.exp(-0.5 * (S_hat_plus**2 * D_n_temp).sum(2)) * T.cos((S_hat_plus * d_n_temp).sum(2) + big_sum_plus) # M x M

EPhiTPhi = (sf_trf/M) * EPhiTPhi

return EPhi, EPhiTPhi[/code]

# decay1 = T.exp(-0.5 * ((S_hat_minus**2)[ :, :,None, :] * D_n).sum(3)) # M x M x N x Q
# decay2 = T.exp(-0.5 * ((S_hat_plus**2)[ :, :,None, :] * D_n).sum(3)) # M x M x N x Q
# cos_w1 = T.cos((S_hat_minus[ :, :,None, :] * d_n).sum(3) + big_sum_minus[ :, :,None]) # M x M x N x Q
# cos_w2 = T.cos((S_hat_plus[ :, :,None, :] * d_n).sum(3) + big_sum_plus[ :, :,None]) # M x M x N x Q
# EPhiTPhi = (sf_trf/M) * (decay1 * cos_w1 + decay2 * cos_w2).sum(2) # M x M

durch die for loop ersetzt. Zuvor lief die Compilierung einwandfrei.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Romaxx: Du zeigst hier Code-Ausschnitte, die nicht reichen, um das Problem nachstellen zu können. Damit wird es unmöglich, den Fehler zu finden, es sei denn, jemand hätte schon exakt das selbe getan und könnte das aus den 5 Zeilen Code auch erkennen.

Theano versucht, aus dem Ausdruck, den Du da erzeugst, eine compilierte Funktion zu erstellen. Bei 900 Rekursionen kann das schonmal viel Stacktiefe bedeuten. Du solltest Dich tiefer mit der Theano-Dokumentation zu Schleifen beschäftigen.
Romaxx
User
Beiträge: 62
Registriert: Donnerstag 26. Januar 2017, 18:53

Ich kann Dir die ganzen files, insgesamt 3 Stück, per PN schicken, wenn du willst. Ich möchte dies hier nicht öffentlich machen.

Ginge das?

Grüße
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Romaxx: ich kenn mich mit Theano nicht weiter aus. Aber hast Du schon die von mir verlinkte Dokumentation gelesen und konntest Du das auf Dein Problem anwenden?
Romaxx
User
Beiträge: 62
Registriert: Donnerstag 26. Januar 2017, 18:53

Hallo,

gelesen ja, anwenden konnte ich es nicht, da die aufgeführten Beispiele nicht meiner for loop entsprechen, denke ich jedenfalls. Ich hatte auch vor etlicher zeit einmal schon auf das Problem aufmerksam gemacht, bin dann aber mit einer ersten anderen Lösung zufrieden gewesen. Siehe viewtopic.php?f=1&t=39829&p=304011#p304011

Grüße
Antworten