web-dev-qa-db-fra.com

comment décompresser le fichier pkl

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?

51
ytrewq

Généralement

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)

Pour le jeu de données MNIST

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()

mnist_digit

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. ;-)

89
Peque

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
0
osolmaz