5 Best Ways to Save Your Keras Model Using HDF5 Format in Python

πŸ’‘ Problem Formulation: After training a machine learning model using the Keras library, it’s essential to save the model’s architecture, weights, and training configuration to enable later use or continuation of training without starting from scratch. The desired output is a saved file in HDF5 format, containing all necessary model information, which is portable and efficient for storage and later retrieval in Python.

Method 1: Save the Entire Model

The Keras library provides the functionality to save the entire model into a single HDF5 file, which includes the architecture, weights, and optimizer state. Using the save() function, one can ensure that the entire model’s state is preserved. This is highly beneficial for the continuation of training or deployment purposes without any additional requirement for the model’s original code.

Here’s an example:

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# Create a simple model
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# Save the entire model to a HDF5 file
model.save('my_model.h5')

Output: The model is saved as ‘my_model.h5’ in HDF5 format.

In this code, we define a simple neural network model with Keras, compile it, and finally save it using the model.save() method. The ‘my_model.h5’ file now contains everything pertaining to the model.

Method 2: Save Only the Model’s Weights

At times, one might want to only save the weights of a model. Keras allows for this flexibility through the save_weights() method. This is useful when you need to apply these weights to a different architecture or for reducing the file size if the architecture is already stored elsewhere.

Here’s an example:

model.save_weights('my_model_weights.h5')

Output: The model’s weights are saved to ‘my_model_weights.h5’ file.

The preceding line of code saves the trained weights of our previously defined model into a HDF5 file. This does not include the model architecture or optimizer states.

Method 3: Save Architecture Separately

Another approach is to save only the model’s architecture as a JSON string. This allows for recreation of the model without the weights or optimizer state. This is particularly useful for sharing or versioning the model architecture.

Here’s an example:

json_string = model.to_json()

with open('model_architecture.json', 'w') as json_file:
    json_file.write(json_string)

Output: JSON file with the model architecture is created.

In the above code snippet, we use Keras to convert the model architecture into a JSON format and write it to a file, allowing us to save the structure separately from the weights.

Method 4: Load Model and Weights Separately

If the model architecture and weights have been saved separately, one needs to know how to reconstruct the full model. By loading the architecture from a JSON file and then loading the weights from a HDF5 file, the complete model can be reconstructed.

Here’s an example:

from keras.models import model_from_json

# Load the architecture
with open('model_architecture.json', 'r') as json_file:
    loaded_model_json = json_file.read()
    loaded_model = model_from_json(loaded_model_json)

# Load weights into the new model
loaded_model.load_weights('my_model_weights.h5')

Output: A complete Keras model reconstructed from the architecture and weights files.

This code demonstrates loading the model architecture from a JSON file and then applying the previously saved weights to this architecture, thus reassembling the original model.

Bonus One-Liner Method 5: Save and Load Weights with One Line

For a fast save and load of just the model’s weights, Keras allows it with one line of code. This method is optimal for quick saves or when the architecture or state of optimization is not needed.

Here’s an example:

# Save weights with one-liner
model.save_weights('one_liner_weights.h5')

# Load weights with one-liner
model.load_weights('one_liner_weights.h5')

Output: Model’s weights saved and loaded using a minimal code.

The example employs the simplest form of the Keras save_weights() and load_weights() methods for quick weight persistence and retrieval.

Summary/Discussion

  • Method 1: Save the Entire Model. Strengths: Preserves complete model information in one file. Weaknesses: Larger file size and might contain unnecessary information if only weights are needed.
  • Method 2: Save Only the Model’s Weights. Strengths: Smaller file size and faster saving/loading. Weaknesses: Does not include model architecture or optimizer state.
  • Method 3: Save Architecture Separately. Strengths: Enables sharing and versioning the architecture. Weaknesses: Requires separate handling of weights and additional steps to reconstruct the full model.
  • Method 4: Load Model and Weights Separately. Strengths: Flexibility in managing and applying different weights to an architecture. Weaknesses: Involves manual steps and file management.
  • Method 5: Save and Load Weights with One Line. Strengths: Quick and easy. Weaknesses: Only applicable when architecture is already available and does not need to be saved.