2015-08-10 5 views
7

Ich speicherte das Modell wie auf loading and saving dokumentiert.Wie kann man ein trainiertes Modell in theano speichern/serialisieren?

# saving trained model 
f = file('models/simple_model.save', 'wb') 
cPickle.dump(ca, f, protocol=cPickle.HIGHEST_PROTOCOL) 
f.close() 

ca ist ein trainierter Auto-Encoder. Es ist eine Instanz der Klasse cA. Aus dem Skript, in dem ich das Modell baue und speichere, kann ich problemlos ca.get_reconstructed_input(...) und ca.get_hidden_values(...) aufrufen.

In einem anderen Skript versuche ich das trainierte Modell zu laden.

# loading the trained model 
model_file = file('models/simple_model.save', 'rb') 
ca = cPickle.load(model_file) 
model_file.close() 

Ich erhalte den folgenden Fehler.

ca = cPickle.load(model_file) 

AttributeError: 'module' object has no attribute 'cA'

Antwort

10

Alle Klassendefinitionen der gebeizten Objekte müssen dem Skript bekannt sein, das das Entpacken durchführt. Weitere Informationen hierzu finden Sie in anderen StackOverflow-Fragen (z. B. AttributeError: 'module' object has no attribute 'newperson').

Ihr Code ist korrekt, solange Sie cA richtig importieren. Angesichts des Fehlers, den Sie bekommen, ist es vielleicht nicht der Fall. Stellen Sie sicher, dass Sie from cA import cA und nicht nur import cA verwenden.

Alternativ ist Ihr Modell durch seine Parameter definiert, so dass Sie stattdessen einfach die Parameterwerte picken können). Dies könnte auf zwei Arten geschehen, je nachdem, was Sie sehen.

  1. Speichern Sie die gemeinsam genutzten Variablen von Theano. Hier nehmen wir an, dass ca.params eine reguläre Python-Liste der gemeinsam genutzten Variablen von Theano ist.

    cPickle.dump(ca.params, f, protocol=cPickle.HIGHEST_PROTOCOL) 
    
  2. Speichern Sie die in den gemeinsam genutzten Theano Variablen gespeicherten Nummernfelder.

    cPickle.dump([param.get_value() for param in ca.params], f, protocol=cPickle.HIGHEST_PROTOCOL) 
    

Wenn Sie das Modell laden möchten Sie müssen die Parameter neu zu initialisieren. Um zum Beispiel eine neue Instanz der Klasse cA erstellen dann entweder

ca.params = cPickle.load(f) 
ca.W, ca.b, ca.b_prime = ca.params 

oder

ca.params = [theano.shared(param) for param in cPickle.load(f)] 
ca.W, ca.b, ca.b_prime = ca.params 

Beachten Sie, dass sowohl die params Feld und die einzelnen Parameter Felder festlegen müssen.

+0

Der Fehler, den ich sehe, ist auf die Tatsache zurückzuführen, dass ich "Import cA" anstelle von "cA import cA" verwende. Der Code, den ich gepostet habe, ist ansonsten korrekt. Ihre Alternativen sind auch richtig. Ich denke, der sauberste Weg, um diesen Thread zu schließen, ist, dass Sie etwas in Ihrem ersten Absatz hinzufügen (was die wahre Ursache des Problems identifiziert), wie "vergewissern Sie sich, dass Sie' 'aus cA importieren und nicht nur' importieren cA' ", und ich könnte deine Antwort als akzeptiert markieren. Danke! – xagg

+0

Für mich ist das Laden eines Modells von cpickle ungefähr so ​​langsam wie das Kompilieren. –

+0

Soweit ich verstand, ist es sehr wichtig, dass diese Gurke Datei auf die gleiche Hardware gebunden wird im Wesentlichen zu wissen, zumindest können Sie kein CUDA-basiertes Modell auf einer CPU-basierte Theano laden. Ich war sehr überrascht von der Tatsache, dass es eine nicht-triviale Aufgabe ist, die erlernten Netzwerke zwischen verschiedenen Hardwares zu übertragen. – flaschenpost

0

Eine alternative Art und Weise Modell zu retten ist, seine Gewichte und Architektur zu speichern und dann die gleiche Last, die Art, wie wir CNN für Pre-Zug tun:

def save_model(model): 


    model_json = model.to_json() 
    open('cifar10_architecture.json', 'w').write(model_json) 
    model.save_weights('cifar10_weights.h5', overwrite=True) 

Quelle/ref: https://blog.rescale.com/neural-networks-using-keras-on- rescale/