example python pickle deep-learning mnist

python - example - unzip linux install



como descomprimir el archivo pkl (3)

Tengo un archivo pkl del conjunto de datos MNIST, que consiste en imágenes escritas a mano con dígitos.

Me gustaría echar un vistazo a cada una de esas imágenes de dígitos, así que necesito desempaquetar el archivo pkl, excepto que no puedo descubrir cómo.

¿Hay una manera de descomprimir / descomprimir el archivo pkl?


Generalmente

Su archivo pkl es, de hecho, un archivo pickle serializado, lo que significa que se ha volcado utilizando el módulo pickle de Python.

Para desbloquear los datos puede:

import pickle with open(''serialized.pkl'', ''rb'') as f: data = pickle.load(f)

Para el conjunto de datos MNIST

Tenga en cuenta que gzip solo es necesario si el archivo está comprimido:

import gzip import pickle with gzip.open(''mnist.pkl.gz'', ''rb'') as f: train_set, valid_set, test_set = pickle.load(f)

Donde cada conjunto puede dividirse aún más (es decir, para el conjunto de entrenamiento):

train_x, train_y = train_set

Esas serían las entradas (dígitos) y las salidas (etiquetas) de sus conjuntos.

Si desea visualizar los dígitos:

import matplotlib.cm as cm import matplotlib.pyplot as plt plt.imshow(train_x[0].reshape((28, 28)), cmap=cm.Greys_r) plt.show()

La otra alternativa sería mirar los datos originales:

http://yann.lecun.com/exdb/mnist/

Pero eso será más difícil, ya que tendrá que crear un programa para leer los datos binarios en esos archivos. Así que te recomiendo que uses Python y cargues los datos con pickle . Como has visto, es muy fácil. ;-)


En caso de que quiera trabajar con los archivos MNIST originales, aquí se explica cómo puede deserializarlos.

Si aún no ha descargado los archivos, haga eso primero ejecutando lo siguiente en el 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

Luego guarde lo siguiente como deserialize.py y ejecútelo.

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

El script no normaliza los valores de píxel como en el archivo encurtido. Para hacer eso, todo lo que tienes que hacer es

train_images = train_images/255 test_images = test_images/255


Handy one-liner

pkl() ( python -c ''import pickle,sys;d=pickle.load(open(sys.argv[1],"rb"));print(d)'' "$1" ) pkl my.pkl

Se imprimirá __str__ para el objeto encurtido.

El problema genérico de visualizar un objeto, por supuesto, no está definido, por lo que si __str__ no es suficiente, necesitará un script personalizado.