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
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.
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')
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With