Ich benutzte cPickle um eine Function in python 2.7 zu pickeln.
Seit ich versuche von python 2.7 auf python 3.6 zu wechseln muss ich etwas code umstellen.
Hierbei macht mir der Befehl zip() den ich seither genutzt habe um eine liste zu erstellen probleme.
Ich dachte ich kann diesen in python 3.6 einfach durch list(zip()) ersetzen, anscheinend ist das aber im zusammenhang mit _pickle ( cPickle version von python 3.6) nicht so einfach möglich.
Folgender programmausschnitt macht probleme, wobei LL und KL outputs meiner funktion sind, die ich pickeln möchte:
[codebox=python file=Unbenannt.txt]
LL, KL = get_model_exact_A(lengthscale_trf, lengthscale_p_trf, sn_trf, sf_trf, S, MU, SIGMA_trf, MU_A, SIGMA_A_trf, U, b, X, y, D, D_sum, layers, order, N, M)
inputs = {'X': X, 'MU_A': MU_A, 'SIGMA_A': SIGMA_A, 'MU': MU, 'SIGMA': SIGMA, 'S': S, 'U': U, 'b': b, 'hyp': hyp, 'y': y, 'sn': sn, 'sf': sf}
f = list(zip(['LL', 'KL'],[LL, KL]))
self.f = {fn: theano.function(input_values, fv, name=fn, on_unused_input='ignore') for fn,fv in f}
g = list(zip(['LL', 'KL'],[LL, KL]))
wrt = {'MU_A': MU_A, 'SIGMA_A': SIGMA_A, 'MU': MU, 'SIGMA': SIGMA, 'S': S, 'U': U, 'b': b, 'hyp': hyp, 'sn': sn, 'sf': sf}
self.g = {vn: {gn: theano.function(input_values, T.grad(gv, vv), name='d'+gn+'_d'+vn,
on_unused_input='ignore') for gn,gv in g} for vn, vv in wrt.items()}
sys.setrecursionlimit(10000)
cPickle.dump([self.f, self.g], file_handle, protocol=1)[/code]
Der Fehler lautet:
Wie gesagt habe ich vorher für f und g nur zip() in python 2.6 verwendet und es lief.File "C:\Users\flo9fe\Desktop\DEEPvSSGPCopy\DEEPvSSGP_model_SV2.py", line 14, in __init__
cPickle.dump([self.f, self.g], file_handle, protocol=1)
File "C:\ProgramData\Anaconda3\lib\copyreg.py", line 65, in _reduce_ex
raise TypeError("can't pickle %s objects" % base.__name__)
TypeError: can't pickle fortran objects
Danke für eure Hilfe.