2015-08-10 48 views
7

Ho salvato il modello come documentato su loading and saving.Come salvare/serializzare un modello addestrato in theano?

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

ca è un auto-encoder addestrato. È un'istanza della classe cA. Dallo script in cui costruisco e salvando il modello posso chiamare ca.get_reconstructed_input(...) e ca.get_hidden_values(...) senza alcun problema.

In uno script diverso, provo a caricare il modello addestrato.

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

ricevo il seguente errore.

ca = cPickle.load(model_file) 

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

risposta

10

Tutte le definizioni di classe degli oggetti in salamoia devono essere conosciute dallo script che esegue l'annullamento. C'è altro su questo in altre domande StackOverflow (ad esempio AttributeError: 'module' object has no attribute 'newperson').

Il codice è corretto se si importa correttamente cA. Dato l'errore che stai ottenendo potrebbe non essere il caso. Assicurati di utilizzare from cA import cA e non solo import cA.

In alternativa, il modello è definito dai suoi parametri in modo da poter semplicemente decodificare i valori dei parametri). Questo potrebbe essere fatto in due modi a seconda di quale punto di vista.

  1. Salva le variabili condivise di Theano. Qui assumiamo che ca.params sia un normale elenco Python delle istanze di variabili condivise di Theano.

    cPickle.dump(ca.params, f, protocol=cPickle.HIGHEST_PROTOCOL) 
    
  2. Save the array numpy memorizzati all'interno del Theano variabili condivise.

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

Quando si desidera caricare il modello è necessario reinizializzare i parametri. Ad esempio, creare una nuova istanza della classe cA allora o

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

o

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

Si noti che è necessario impostare sia il campo params ei campi parametri separati.

+0

L'errore che sto vedendo è dovuto al fatto che stavo usando 'import cA' invece di' from cA import cA'. Il codice che ho postato è altrimenti corretto. Anche le tue alternative sono corrette. Penso che il modo più pulito per chiudere questo thread è che tu aggiunga qualcosa nel tuo primo paragrafo (che identifica la vera fonte del problema) come "assicurati di usare" da cA import cA' e non solo "import cA' ", e potrei contrassegnare la tua risposta come accettata. Grazie! – xagg

+0

Per me, caricare un modello da cpickle è lento come compilarlo. –

+0

Per quanto ho capito, è molto importante sapere che questo file pickle sarà essenzialmente legato allo stesso hardware, almeno non è possibile caricare un modello basato su cuda su un Theano basato su CPU. Sono rimasto molto sorpreso dal fatto che sia un compito non banale trasferire le reti apprese tra diversi hardware. – flaschenpost

0

Un modo alternativo per salvare il modello è quello di salvare i suoi pesi e architettura e quindi caricare lo stesso, il nostro modo di fare per il pre-treno CNN:

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) 

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