J'ai un fichier pkl du jeu de données MNIST, qui consiste en des images de chiffres manuscrites.
J'aimerais examiner chacune de ces images numériques. Je dois donc décompresser le fichier pkl, sauf que je ne peux pas savoir comment.
Existe-t-il un moyen de décompresser/décompresser le fichier pkl?
Votre fichier pkl
est en fait un fichier pickle
sérialisé, ce qui signifie qu'il a été vidé en utilisant le module pickle
de Python.
Pour décompresser les données, vous pouvez:
import pickle
with open('serialized.pkl', 'rb') as f:
data = pickle.load(f)
Remarque gzip
n'est nécessaire que si le fichier est compressé:
import gzip
import pickle
with gzip.open('mnist.pkl.gz', 'rb') as f:
train_set, valid_set, test_set = pickle.load(f)
Où chaque ensemble peut être encore divisé (c’est-à-dire pour l’entraînement):
train_x, train_y = train_set
Celles-ci seraient les entrées (chiffres) et les sorties (étiquettes) de vos ensembles.
Si vous souhaitez afficher les chiffres:
import matplotlib.cm as cm
import matplotlib.pyplot as plt
plt.imshow(train_x[0].reshape((28, 28)), cmap=cm.Greys_r)
plt.show()
L'autre alternative serait d'examiner les données d'origine:
http://yann.lecun.com/exdb/mnist/
Mais ce sera plus difficile, car vous devrez créer un programme pour lire les données binaires contenues dans ces fichiers. Je vous recommande donc d'utiliser Python et de charger les données avec pickle
. Comme vous l'avez vu, c'est très facile. ;-)
One-Liner pratique
pkl() (
python -c 'import pickle,sys;d=pickle.load(open(sys.argv[1],"rb"));print(d)' "$1"
)
pkl my.pkl
Imprime __str__
pour l'objet décapé.
Le problème générique de la visualisation d’un objet n’est bien sûr pas défini. Par conséquent, si __str__
ne suffit pas, vous aurez besoin d’un script personnalisé.
Si vous souhaitez utiliser les fichiers MNIST d'origine, voici comment les désérialiser.
Si vous n'avez pas encore téléchargé les fichiers, faites-le d'abord en exécutant ce qui suit dans le terminal:
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
Enregistrez ensuite le fichier suivant sous le nom deserialize.py
et exécutez-le.
import numpy as np
import gzip
IMG_DIM = 28
def decode_image_file(fname):
result = []
n_bytes_per_img = IMG_DIM*IMG_DIM
with gzip.open(fname, 'rb') as f:
bytes_ = f.read()
data = bytes_[16:]
if len(data) % n_bytes_per_img != 0:
raise Exception('Something wrong with the file')
result = np.frombuffer(data, dtype=np.uint8).reshape(
len(bytes_)//n_bytes_per_img, n_bytes_per_img)
return result
def decode_label_file(fname):
result = []
with gzip.open(fname, 'rb') as f:
bytes_ = f.read()
data = bytes_[8:]
result = np.frombuffer(data, dtype=np.uint8)
return result
train_images = decode_image_file('train-images-idx3-ubyte.gz')
train_labels = decode_label_file('train-labels-idx1-ubyte.gz')
test_images = decode_image_file('t10k-images-idx3-ubyte.gz')
test_labels = decode_label_file('t10k-labels-idx1-ubyte.gz')
Le script ne normalise pas les valeurs en pixels comme dans le fichier pickled. Pour ce faire, tout ce que vous avez à faire est
train_images = train_images/255
test_images = test_images/255