Thursday, October 29, 2026
HomeArtificial IntelligenceA Light Introduction to Serialization for Python

A Light Introduction to Serialization for Python

[ad_1]



Final Up to date on March 2, 2022

Serialization refers back to the strategy of changing a knowledge object (e.g. Python objects, Tensorflow fashions) right into a format that enables us retailer or transmit the information after which recreate the article when wanted utilizing the reverse strategy of deserialization.

There are totally different codecs for serialization of knowledge, reminiscent of JSON, XML, HDF5, Python’s pickle, for various functions. JSON as an example returns a human-readable string type whereas Python’s pickle library can return a byte array.

On this submit, you’ll uncover find out how to use two frequent serialization libraries in Python to serialize information objects (particularly pickle and HDF5) reminiscent of dictionaries and Tensorflow fashions in Python for storage and transmission

After finishing this tutorial, you’ll know:

  • Serialization libraries in Python reminiscent of pickle and h5py
  • Serializing objects reminiscent of dictionaries and Tensorflow fashions in Python
  • Learn how to use serialization for memoization to scale back perform calls

Let’s get began!

A Light Introduction to Serialization for Python

Command line arguments to your Python script. Photograph by little plant. Some rights reserved

Overview

The tutorial is split into 4 elements, they’re:

  • What’s serialization and why can we serialize?
  • Utilizing Python’s pickle library
  • Utilizing HDF5 in Python
  • Comparability between totally different serialization strategies

What’s serialization and why ought to we care?

Take into consideration storing an integer, how would you retailer that in a file or transmit it? That’s simple! We are able to simply write the integer to a file and retailer or transmit that file.

However now, what if we take into consideration storing a Python object (e.g. a Python dictionary or a Pandas DataFrame), which has a posh construction and plenty of attributes (e.g., columns and index of the DataFrame, and the information kind of every column)? How would you retailer it as a file or transmit it to a different pc?

That is the place serialization is available in!

Serialization is the method of changing the article right into a format that may be saved or transmitted. After transmitting or storing the serialized information, we’re in a position to later reconstruct the article and acquire the very same construction/object, which makes it actually handy for us to proceed utilizing the saved object afterward as a substitute of reconstructing the article from scratch.

In Python, there are various totally different codecs for serialization obtainable. One frequent instance for hash maps (Python dictionaries) which works throughout many languages is the JSON file format which is human-readable and permits us to retailer the dictionary and recreate it with the identical construction. However JSON can solely retailer fundamental constructions reminiscent of checklist and dictionary, and it could solely preserve strings and numbers. We can not ask JSON to recollect the information kind (e.g., numpy float32 vs float64). It additionally can not distinguish between Python tuples and lists.

Extra highly effective serialization codecs exists. Within the following, we’ll discover two frequent serialization libraries in Python, particularly pickle and h5py.

Utilizing Python’s pickle library

The pickle module is a part of the Python customary library and implements strategies to serialize (pickling) and deserialize (unpickling) Python objects.

To get began with pickle, import it in Python

import pickle

afterwards, to serialize a Python object reminiscent of a dictionary and retailer the byte stream as a file, we will use pickle’s dump() technique.

test_dict = {"Whats up": "World!"}
with open("check.pickle", "wb") as outfile:
 	# "wb" argument opens the file in binary mode
	pickle.dump(test_dict, outfile)

and the byte stream representing test_dict is now saved within the file “check.pickle”!

To get well the unique object, we learn the serialized byte stream from the file utilizing pickle’s load() technique.

with open("check.pickle", "rb") as infile:
 	test_dict_reconstructed = pickle.load(infile)

Warning: Solely unpickle information from sources you belief as it’s attainable to for arbitrary malicious code to be executed through the unpickling course of.

Put them collectively, the next code lets you confirm pickle can get well the identical object:

import pickle

# A check object
test_dict = {"Whats up": "World!"}

# Serialization
with open("check.pickle", "wb") as outfile:
    pickle.dump(test_dict, outfile)
print("Written object", test_dict)

# Deserialization
with open("check.pickle", "rb") as infile:
    test_dict_reconstructed = pickle.load(infile)
print("Reconstructed object", test_dict_reconstructed)

if test_dict == test_dict_reconstructed:
    print("Reconstruction success")

Apart from writing the serialized object right into a pickle file, we will additionally acquire the article serialized as a bytes-array kind in Python utilizing pickle’s dumps() perform:

test_dict_ba = pickle.dumps(test_dict)      # b'x80x04x95x15…

Equally, we will use pickle’s hundreds technique to transform from a bytes-array kind again to the unique object

test_dict_reconstructed_ba = pickle.hundreds(test_dict_ba)

One helpful factor about pickle is that it could serialize nearly any Python object, together with user-defined ones, reminiscent of the next

import pickle

class NewClass:
    def __init__(self, information):
        print(information)
        self.information = information

# Create an object of NewClass
new_class = NewClass(1)

# Serialize and deserialize
pickled_data = pickle.dumps(new_class)
reconstructed = pickle.hundreds(pickled_data)

# Confirm
print("Information from reconstructed object:", reconstructed.information)

The code above will print the next

1
Information from reconstructed object: 1

Notice that the print assertion within the class’ constructor will not be executed on the time pickle.hundreds() is invoked. As a result of it reconstructed the article, not recreated it.

Pickle may even serialize Python features since features are top quality objects in Python:

import pickle

def check():
    return "Whats up world!"

# Serialize and deserialize
pickled_function = pickle.dumps(check)
reconstructed_function = pickle.hundreds(pickled_function)

# Confirm
print (reconstructed_function()) #prints “Whats up, world!”

Subsequently, we will make use of pickle to avoid wasting our work. For instance, a educated mannequin from Keras or scikit-learn may be serialized by pickle and cargo it later as a substitute of re-train the mannequin each time we use it. The next is to point out you the way we will construct a LeNet5 mannequin to acknowledge the MNIST handwritten digits utilizing Keras, then serialize the educated mannequin utilizing pickle. Afterwards, we will reconstruct the mannequin with out coaching it once more and it ought to produce precisely the identical outcome as the unique mannequin:

import pickle

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.fashions import Sequential
from tensorflow.keras.layers import Conv2D, Dense, AveragePooling2D, Dropout, Flatten
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.callbacks import EarlyStopping

# Load MNIST digits
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Reshape information to (n_samples, top, wiedth, n_channel)
X_train = np.expand_dims(X_train, axis=3).astype("float32")
X_test = np.expand_dims(X_test, axis=3).astype("float32")

# One-hot encode the output
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# LeNet5 mannequin
mannequin = Sequential([
    Conv2D(6, (5,5), input_shape=(28,28,1), padding="same", activation="tanh"),
    AveragePooling2D((2,2), strides=2),
    Conv2D(16, (5,5), activation="tanh"),
    AveragePooling2D((2,2), strides=2),
    Conv2D(120, (5,5), activation="tanh"),
    Flatten(),
    Dense(84, activation="tanh"),
    Dense(10, activation="softmax")
])

# Practice the mannequin
mannequin.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
earlystopping = EarlyStopping(monitor="val_loss", endurance=4, restore_best_weights=True)
mannequin.match(X_train, y_train, validation_data=(X_test, y_test), epochs=100, batch_size=32, callbacks=[earlystopping])

# Consider the mannequin
print(mannequin.consider(X_test, y_test, verbose=0))

# Pickle to serialize and deserialize
pickled_model = pickle.dumps(mannequin)
reconstructed = pickle.hundreds(pickled_model)

# Consider once more
print(reconstructed.consider(X_test, y_test, verbose=0))

The above code will produce the output as follows, notice that the analysis scores from the unique and reconstructed fashions are tied out completely on the final two traces:

Epoch 1/100
1875/1875 [==============================] - 15s 7ms/step - loss: 0.1517 - accuracy: 0.9541 - val_loss: 0.0958 - val_accuracy: 0.9661
Epoch 2/100
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0616 - accuracy: 0.9814 - val_loss: 0.0597 - val_accuracy: 0.9822
Epoch 3/100
1875/1875 [==============================] - 16s 8ms/step - loss: 0.0493 - accuracy: 0.9846 - val_loss: 0.0449 - val_accuracy: 0.9853
Epoch 4/100
1875/1875 [==============================] - 17s 9ms/step - loss: 0.0394 - accuracy: 0.9876 - val_loss: 0.0496 - val_accuracy: 0.9838
Epoch 5/100
1875/1875 [==============================] - 17s 9ms/step - loss: 0.0320 - accuracy: 0.9898 - val_loss: 0.0394 - val_accuracy: 0.9870
Epoch 6/100
1875/1875 [==============================] - 16s 9ms/step - loss: 0.0294 - accuracy: 0.9908 - val_loss: 0.0373 - val_accuracy: 0.9872
Epoch 7/100
1875/1875 [==============================] - 21s 11ms/step - loss: 0.0252 - accuracy: 0.9921 - val_loss: 0.0370 - val_accuracy: 0.9879
Epoch 8/100
1875/1875 [==============================] - 18s 10ms/step - loss: 0.0223 - accuracy: 0.9931 - val_loss: 0.0386 - val_accuracy: 0.9880
Epoch 9/100
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0219 - accuracy: 0.9930 - val_loss: 0.0418 - val_accuracy: 0.9871
Epoch 10/100
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0162 - accuracy: 0.9950 - val_loss: 0.0531 - val_accuracy: 0.9853
Epoch 11/100
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0169 - accuracy: 0.9941 - val_loss: 0.0340 - val_accuracy: 0.9895
Epoch 12/100
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0165 - accuracy: 0.9944 - val_loss: 0.0457 - val_accuracy: 0.9874
Epoch 13/100
1875/1875 [==============================] - 15s 8ms/step - loss: 0.0137 - accuracy: 0.9955 - val_loss: 0.0407 - val_accuracy: 0.9879
Epoch 14/100
1875/1875 [==============================] - 16s 8ms/step - loss: 0.0159 - accuracy: 0.9945 - val_loss: 0.0442 - val_accuracy: 0.9871
Epoch 15/100
1875/1875 [==============================] - 16s 8ms/step - loss: 0.0125 - accuracy: 0.9956 - val_loss: 0.0434 - val_accuracy: 0.9882
[0.0340442918241024, 0.9894999861717224]
[0.0340442918241024, 0.9894999861717224]

Whereas pickle is a robust library, it nonetheless does have its personal limitations to what may be pickled. For instance, reside connections reminiscent of database connections and opened file handles can’t be pickled. This subject arises as a result of reconstructing these objects requires pickle to re-establish the reference to the database/file which is one thing pickle can not do for you (as a result of it wants acceptable credentials and is out of scope of what pickle is meant for).

Utilizing HDF5 in Python

Hierarchical Information Format 5 (HDF5) is a binary information format. The h5py package deal is a Python library that gives an interface to the HDF5 format. From h5py docs, HDF5 “enables you to retailer large quantities of numerical information, and simply manipulate that information from Numpy.”

What HDF5 can do higher than different serialization format is that it shops information in a file system like hierarchy. You’ll be able to retailer a number of objects or dataset in HDF5 like saving a number of recordsdata within the file system. It’s also possible to learn a specific dataset from HDF5 like studying one file from the file system with out in regards to the different. In case you’re utilizing pickle for this, you will have to learn and write all the pieces every time you load or create the pickle file. Therefore HDF5 is advantageous for large quantity of knowledge that may’t match totally into reminiscence.

To get began with h5py, you first want to put in the h5py library, which you are able to do utilizing

pip set up h5py

Or if you’re utilizing a conda setting

conda set up h5py

We are able to then get began with creating our first dataset!

import h5py

with h5py.File("check.hdf5", "w") as file:
    dataset = file.create_dataset("test_dataset", (100,), kind="i4")

This creates a brand new dataset within the file check.hdf5 named “test_dataset”, with a form of (100, ) and a kind int32. h5py datasets comply with a Numpy syntax so you are able to do slicing, retrieval, get form, and so on. much like Numpy arrays

To retrieve at a particular index,

dataset[0]  #retrieves ingredient at index 0 of dataset

To get a slice from index 0 to index 10 of dataset,

dataset[:10]

In case you initialized the h5py file object outdoors of a with assertion, bear in mind to shut the file as effectively!

To learn from a beforehand created HDF5 file, you possibly can open the file in “r” for learn mode or “r+” for learn/write mode,

with h5py.File("check.hdf5", "r") as file:
    print (file.keys()) #will get names of datasets which might be within the file
    dataset = file["test_dataset"]

To arrange your HDF5 file, you need to use teams,

with h5py.File("check.hdf5", "w") as file:
    # creates new group_1 in file
    file.create_group("group_1")
    group1 = file["group_1"]
    # creates dataset inside group1
    group1.create_dataset("dataset1", form=(10,))
    # to entry the dataset
    dataset = file["group_1"]["dataset1"]

One other approach to create teams and recordsdata is by specifying the trail to the dataset you need to create and h5py will create the teams on that path as effectively (in the event that they don’t exist),

with h5py.File("check.hdf5", "w") as file:
    # creates dataset inside group1
    file.create_dataset("group1/dataset1", form=(10,))

The 2 snippets of code each create group1 if it has not be created beforehand, after which a dataset1 inside group1.

HDF5 in Tensorflow

To avoid wasting a mannequin in Tensorflow Keras utilizing HDF5 format, we will use the save() perform of the mannequin with a filename having extension .h5, like the next:

from tensorflow import keras

# Create mannequin
mannequin = keras.fashions.Sequential([
 	keras.layers.Input(shape=(10,)),
 	keras.layers.Dense(1)
])

mannequin.compile(optimizer="adam", loss="mse")

# utilizing the .h5 extension within the file title specifies that the mannequin
# ought to be saved in HDF5 format
mannequin.save("my_model.h5")

To load the saved HDF5 mannequin, we will additionally use the perform from Keras straight:

...
mannequin = keras.fashions.load_model("my_model.h5")

# to test that the mannequin has been efficiently reconstructed
print(mannequin.abstract)

One cause we don’t need to use pickle for a Keras mannequin is that we’d like a extra versatile format that doesn’t tie to a specific model of Keras. If we upgraded our Tensorflow model, the mannequin object could change and pickle could fail to present us a working mannequin. Another excuse is to maintain solely the important information for our mannequin. For instance, if we test the HDF5 file my_model.h5 created within the above, we see these are saved:

/
/model_weights
/model_weights/dense
/model_weights/dense/dense
/model_weights/dense/dense/bias:0
/model_weights/dense/dense/kernel:0
/model_weights/top_level_model_weights

Therefore Keras chosen solely the information which might be important to reconstruct the mannequin. A educated mannequin will include extra datasets, particularly, there are /optimizer_weights/ apart from /model_weights/. Keras will reconstruct the mannequin and restore the weights appropriately to present us a mannequin that perform the identical.

Evaluating between totally different serialization strategies

Within the above we noticed how pickle and h5py might help serialize our Python information.

We are able to use pickle to serialize nearly any Python object, together with user-defined ones and features. However pickle will not be language agnostic. You can not unpickle it outdoors Python. There are even 6 variations of pickle developed thus far and older Python could not be capable of eat the newer model of pickle information.

Quite the opposite, HDF5 is cross platform and works effectively with different language reminiscent of Java and C++. In Python, the h5py library carried out the Numpy interface to make it simpler to control the information. The information may be accessed in numerous language as a result of HDF5 format helps solely the Numpy information sorts reminiscent of float and strings. We can not retailer arbitrary objects reminiscent of a Python perform into HDF5.

Additional studying

This part supplies extra assets on the subject if you’re trying to go deeper.

Articles

Libraries

APIs

Abstract

On this submit, you found what serialization is and find out how to use libraries in Python to serialize Python objects reminiscent of dictionaries and Tensorflow Keras fashions. You will have additionally learnt the benefits and drawbacks of two Python libraries for serialization (pickle, h5py).

Particularly, you discovered:

  • what’s serialization and why it’s helpful
  • find out how to get began with pickle and h5py serialization libraries in Python
  • professionals and cons of various serialization strategies


The submit A Light Introduction to Serialization for Python appeared first on Machine Studying Mastery.



[ad_2]

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments