Как распаковать файл pkl?
У меня есть файл pkl из набора данных MNIST, который состоит из рукописных цифровых изображений.
Я хотел бы посмотреть на каждое из этих цифровых изображений, поэтому мне нужно распаковать файл pkl, за исключением того, что я не могу узнать, как это сделать.
Есть ли способ распаковать/распаковать файл pkl?
Ответы
Ответ 1
Вообще
Ваш файл pkl
, по сути, является сериализованным файлом pickle
, что означает, что он был выгружен с помощью модуля Python pickle
.
Чтобы восстановить данные, вы можете:
import pickle
with open('serialized.pkl', 'rb') as f:
data = pickle.load(f)
Для набора данных MNIST
Примечание. gzip
требуется только в том случае, если файл сжат:
import gzip
import pickle
with gzip.open('mnist.pkl.gz', 'rb') as f:
train_set, valid_set, test_set = pickle.load(f)
Где каждый набор может быть далее разделен (то есть для обучающего набора):
train_x, train_y = train_set
Это будут входные данные (цифры) и выходные данные (метки) ваших наборов.
Если вы хотите отобразить цифры:
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]()
Другой альтернативой будет посмотреть на исходные данные:
http://yann.lecun.com/exdb/mnist/
Но это будет сложнее, так как вам нужно будет создать программу для чтения двоичных данных в этих файлах. Поэтому я рекомендую вам использовать Python и загружать данные с помощью pickle
. Как вы видели, это очень просто. ;-)
Ответ 2
Удобный однострочный
pkl() (
python -c 'import pickle,sys;d=pickle.load(open(sys.argv[1],"rb"));print(d)' "$1"
)
pkl my.pkl
Будет напечатан __str__
для маринованного объекта.
Общая проблема визуализации объекта, конечно, undefined, поэтому, если __str__
недостаточно, вам понадобится пользовательский script.
Ответ 3
Если вы хотите работать с исходными файлами MNIST, вот как вы можете десериализовать их.
Если вы еще не загрузили файлы, сначала сделайте это, запустив в терминале следующее:
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
Затем сохраните следующее как deserialize.py
и запустите его.
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')
Скрипт не нормализует значения пикселей, как в маринованном файле. Для этого все, что вам нужно сделать, это
train_images = train_images/255
test_images = test_images/255
Ответ 4
Модуль pickle (и gzip, если файл сжат) необходимо использовать
ПРИМЕЧАНИЕ. Они уже есть в стандартной библиотеке Python.
Не нужно устанавливать что-то новое