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.