Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 
like image 467
pr338 Avatar asked Jan 29 '16 00:01

pr338


People also ask

How do I open an hdf5 file?

Open a HDF5/H5 file in HDFView To begin, open the HDFView application. Within the HDFView application, select File --> Open and navigate to the folder where you saved the NEONDSTowerTemperatureData. hdf5 file on your computer. Open this file in HDFView.


2 Answers

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') 
like image 131
Martin Thoma Avatar answered Sep 20 '22 14:09

Martin Thoma


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) 
like image 22
Mikael Rousson Avatar answered Sep 20 '22 14:09

Mikael Rousson