How to load a model from an HDF5 file in Keras?
Asked Answered
U

6

126

How to load a model from an HDF5 file in Keras?

What I tried:

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])

The above code successfully saves the best model to a file named weights.hdf5. What I want to do is then load that model. The below code shows how I tried to do so:

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

This is the error I get:

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
Unmistakable answered 29/1, 2016 at 0:3 Comment(0)
B
103

load_weights only sets the weights of your network. You still need to define its architecture before calling 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)
Blastomere answered 4/2, 2016 at 9:13 Comment(2)
If you want to load the FULL model, not just the weights: from keras.models import load_model then model = load_model('model.h5')Bachman
@mikael, can you give me a tip with this SO post? #55050839Helyn
T
253

If you stored the complete model, not only the weights, in the HDF5 file, then it is as simple as

from keras.models import load_model
model = load_model('model.h5')
Transfinite answered 6/4, 2017 at 19:17 Comment(5)
does a model include the actual training data as well when calculating the model's memory footprint? How could you load a model that's bigger than your available memory?Stonge
A model does NOT (explicitly) include the training data. You can't load a model which is bigger than your available memory (well, ok, it is possible but this will be quite difficult and you will need to go through that yourself... but if your model is too big to load you should (a) get more memory or (b) train a smaller model)Transfinite
@MartinThoma I am using the method suggested by you. I'm trying to get one layer out of the loaded model and trying to see it's weights by: encoder = autoencoder.layers[0] encoder.get_weights() But I'm getting: FailedPreconditionError: Attempting to use uninitialized value lstm_1/kernelVolturno
I appreciate the compliment :-) To make a point for the accepted answer: I could imagine that storing only the weights is more robust. If keras changes, the weights could still be imported while the complete thing cannot be imported. On the other hand, one can install an old version, dump the weights and do the same as before.Transfinite
@Unmistakable Please consider updating your accepted answer.Deandra
B
103

load_weights only sets the weights of your network. You still need to define its architecture before calling 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)
Blastomere answered 4/2, 2016 at 9:13 Comment(2)
If you want to load the FULL model, not just the weights: from keras.models import load_model then model = load_model('model.h5')Bachman
@mikael, can you give me a tip with this SO post? #55050839Helyn
C
29

See the following sample code on how to Build a basic Keras Neural Net Model, save Model (JSON) & Weights (HDF5) and load them:

# 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))
Cornwell answered 15/1, 2017 at 10:23 Comment(1)
This worked for me on loading a model from json and h5. Make sure if you use @InheritedGeek's example you remember the model.compile(). It is required before you can call model.evaluate. Great example, Thanks!Tannatannage
A
8

According to official documentation https://keras.io/getting-started/faq/#how-can-i-install-hdf5-or-h5py-to-save-my-models-in-keras

you can do :

first test if you have h5py installed by running the

import h5py

if you dont have errors while importing h5py you are good to save:

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')

If you need to install h5py http://docs.h5py.org/en/latest/build.html

Alla answered 16/12, 2018 at 0:23 Comment(1)
This does not seem to work in Keras 2.2.4 with h5py 2.9.0. I get the following error: Anaconda3\envs\synthetic\lib\site-packages\keras\utils\io_utils.py", line 302, in getitem raise ValueError('Cannot create group in read only mode.')Kalvin
E
1

I was struggling with this error for a bit, and then realized I was accidently using

with open(f'path_to_filename/{filename.h5}', "rb") as file:
    loaded_model = tf.keras.models.load_model(file)

Whereas this syntax isnt intended to be used with this load model function,

The normal way of just writing this, worked for me

loaded_model = tf.keras.models.load_model('path_to_filename/filename.h5')
Edrick answered 14/3, 2022 at 23:9 Comment(0)
N
0

I done in this way

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)
Neptunian answered 4/3, 2019 at 7:9 Comment(5)
there is no model.save(). There is only model.model.save(). And loading this model back and using it in the original created model way leads to errors. The loaded object is <keras.engine.sequential.Sequential While the one we create is keras.wrappers.scikit_learn.KerasRegressor. How can I change it?Conduplicate
I solved my problem the below site [github.com/keras-team/keras-contrib/blob/master/keras_contrib/…Neptunian
I got a 404 on that linkConduplicate
github.com/keras-team/keras-contrib/blob/master/keras_contrib/…Neptunian
@TRINADH NAGUBADI, Update the link please, the page does not longer exist.Lareine

© 2022 - 2024 — McMap. All rights reserved.