Wie lade ich ein Modell aus einer HDF5-Datei in Keras?


92

Wie lade ich ein Modell aus einer HDF5-Datei in Keras?

Was ich versucht habe:

model = Sequential()

model.add(Dense(64, input_dim=14, init='uniform'))
model.add(LeakyReLU(alpha=0.3))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Dropout(0.5))

model.add(Dense(64, init='uniform'))
model.add(LeakyReLU(alpha=0.3))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Dropout(0.5))

model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))


sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)

checkpointer = ModelCheckpoint(filepath="/weights.hdf5", verbose=1, save_best_only=True)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2, callbacks=[checkpointer])

Der obige Code speichert das beste Modell erfolgreich in einer Datei mit dem Namen weight.hdf5. Ich möchte dann das Modell laden. Der folgende Code zeigt, wie ich es versucht habe:

model2 = Sequential()
model2.load_weights("/Users/Desktop/SquareSpace/weights.hdf5")

Dies ist der Fehler, den ich bekomme:

IndexError                                Traceback (most recent call last)
<ipython-input-101-ec968f9e95c5> in <module>()
      1 model2 = Sequential()
----> 2 model2.load_weights("/Users/Desktop/SquareSpace/weights.hdf5")

/Applications/anaconda/lib/python2.7/site-packages/keras/models.pyc in load_weights(self, filepath)
    582             g = f['layer_{}'.format(k)]
    583             weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])]
--> 584             self.layers[k].set_weights(weights)
    585         f.close()
    586 

IndexError: list index out of range

Antworten:


83

load_weightsLegt nur die Gewichte Ihres Netzwerks fest. Sie müssen die Architektur noch definieren, bevor Sie Folgendes aufrufen load_weights:

def create_model():
   model = Sequential()
   model.add(Dense(64, input_dim=14, init='uniform'))
   model.add(LeakyReLU(alpha=0.3))
   model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
   model.add(Dropout(0.5)) 
   model.add(Dense(64, init='uniform'))
   model.add(LeakyReLU(alpha=0.3))
   model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
   model.add(Dropout(0.5))
   model.add(Dense(2, init='uniform'))
   model.add(Activation('softmax'))
   return model

def train():
   model = create_model()
   sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
   model.compile(loss='binary_crossentropy', optimizer=sgd)

   checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True)
   model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose=2, callbacks=[checkpointer])

def load_trained_model(weights_path):
   model = create_model()
   model.load_weights(weights_path)

33
Wenn Sie das vollständige Modell laden möchten, nicht nur die Gewichte: from keras.models import load_modeldannmodel = load_model('model.h5')
cgnorthcutt

@mikael, kannst du mir einen Tipp mit diesem SO-Beitrag geben? stackoverflow.com/questions/55050339/…
HenryHub

203

Wenn Sie das gesamte Modell und nicht nur die Gewichte in der HDF5-Datei gespeichert haben, ist dies so einfach wie

from keras.models import load_model
model = load_model('model.h5')

Enthält ein Modell auch die tatsächlichen Trainingsdaten bei der Berechnung des Speicherbedarfs des Modells? Wie können Sie ein Modell laden, das größer als Ihr verfügbarer Speicher ist?
user798719

Ein Modell enthält die Trainingsdaten NICHT (explizit). Sie können kein Modell laden, das größer als Ihr verfügbarer Speicher ist (na ja, es ist möglich, aber das wird ziemlich schwierig, und Sie müssen das selbst durchgehen ... aber wenn Ihr Modell zu groß ist, um Sie zu laden sollte (a) mehr Speicher bekommen oder (b) ein kleineres Modell trainieren)
Martin Thoma

@MartinThoma Ich verwende die von Ihnen vorgeschlagene Methode. Ich versuche, eine Schicht aus dem geladenen Modell herauszuholen und seine Gewichte zu sehen, indem encoder = autoencoder.layers[0] encoder.get_weights() ich : Aber ich bekomme: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernel
Shubhamsingh

1
Ich schätze das Kompliment :-) Um die akzeptierte Antwort zu verdeutlichen: Ich könnte mir vorstellen, dass das Speichern nur der Gewichte robuster ist. Wenn sich Keras ändern, können die Gewichte weiterhin importiert werden, während das gesamte Objekt nicht importiert werden kann. Auf der anderen Seite kann man eine alte Version installieren, die Gewichte entleeren und das Gleiche wie zuvor tun.
Martin Thoma

@ pr338 Bitte erwägen Sie, Ihre akzeptierte Antwort zu aktualisieren.
Kris

27

Im folgenden Beispielcode erfahren Sie, wie Sie ein grundlegendes Keras Neural Net-Modell erstellen, Modell (JSON) und Gewichte (HDF5) speichern und laden:

# create model
model = Sequential()
model.add(Dense(X.shape[1], input_dim=X.shape[1], activation='relu')) #Input Layer
model.add(Dense(X.shape[1], activation='relu')) #Hidden Layer
model.add(Dense(output_dim, activation='softmax')) #Output Layer

# Compile & Fit model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X,Y,nb_epoch=5,batch_size=100,verbose=1)    

# serialize model to JSON
model_json = model.to_json()
with open("Data/model.json", "w") as json_file:
    json_file.write(simplejson.dumps(simplejson.loads(model_json), indent=4))

# serialize weights to HDF5
model.save_weights("Data/model.h5")
print("Saved model to disk")

# load json and create model
json_file = open('Data/model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)

# load weights into new model
loaded_model.load_weights("Data/model.h5")
print("Loaded model from disk")

# evaluate loaded model on test data 
# Define X_test & Y_test data first
loaded_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
score = loaded_model.evaluate(X_test, Y_test, verbose=0)
print ("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))

1
Dies funktionierte für mich beim Laden eines Modells von json und h5. Stellen Sie sicher, dass Sie sich bei Verwendung des Beispiels von @ InheritedGeek an model.compile () erinnern. Dies ist erforderlich, bevor Sie model.evaluate aufrufen können. Tolles Beispiel, danke!
CodeGuyRoss

6

Laut offizieller Dokumentation https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

du kannst tun :

Erster Test, ob Sie h5py installiert haben, indem Sie das ausführen

import h5py

Wenn Sie beim Importieren von h5py keine Fehler haben, können Sie Folgendes speichern:

from keras.models import load_model

model.save('my_model.h5')  # creates a HDF5 file 'my_model.h5'
del model  # deletes the existing model

# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')

Wenn Sie h5py installieren müssen, http://docs.h5py.org/en/latest/build.html


3
Dies scheint in Keras 2.2.4 mit h5py 2.9.0 nicht zu funktionieren. Ich erhalte die folgende Fehlermeldung: Anaconda3 \ envs \ synthetische \ lib \ site-packages \ keras \ utils \ io_utils.py ", Zeile 302, in getitem erhöhen ValueError ('Gruppe kann nicht im schreibgeschützten Modus erstellt werden.')
csteel

1

Ich habe es so gemacht

from keras.models import Sequential
from keras_contrib.losses import import crf_loss
from keras_contrib.metrics import crf_viterbi_accuracy

# To save model
model.save('my_model_01.hdf5')

# To load the model
custom_objects={'CRF': CRF,'crf_loss': crf_loss,'crf_viterbi_accuracy':crf_viterbi_accuracy}

# To load a persisted model that uses the CRF layer 
model1 = load_model("/home/abc/my_model_01.hdf5", custom_objects = custom_objects)

Es gibt kein model.save (). Es gibt nur model.model.save (). Das Zurückladen dieses Modells und die Verwendung auf die ursprünglich erstellte Modellmethode führt zu Fehlern. Das geladene Objekt ist <keras.engine.sequential.Sequential. Das von uns erstellte Objekt ist keras.wrappers.scikit_learn.KerasRegressor. Wie kann ich das ändern?
Sand

Ich habe mein Problem auf der folgenden Website gelöst [ github.com/keras-team/keras-contrib/blob/master/keras_contrib/…
TRINADH NAGUBADI

Ich habe eine 404 auf diesem Link
Sand


@TRINADH NAGUBADI, Bitte aktualisieren Sie den Link, die Seite existiert nicht mehr.
Catalina Chircu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.