Подтвердить что ты не робот

Как распаковать файл pkl?

У меня есть файл pkl из набора данных MNIST, который состоит из рукописных цифровых изображений.

Я хотел бы посмотреть на каждое из этих цифровых изображений, поэтому мне нужно распаковать файл pkl, за исключением того, что я не могу узнать, как это сделать.

Есть ли способ распаковать/распаковать файл pkl?

4b9b3361

Ответ 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

Модуль picklegzip, если файл сжат) необходимо использовать

ПРИМЕЧАНИЕ. Они уже есть в стандартной библиотеке Python. Не нужно устанавливать что-то новое