Як розпакувати файл pkl?


83

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

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

Чи є спосіб розпакувати / розпакувати файл pkl?

Відповіді:


160

Загалом

pklФактично ваш файл - це серіалізований pickleфайл, що означає, що його було скинуто за допомогою pickleмодуля Python .

Щоб зняти маринування даних, ви можете:

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. Як ви бачили, це дуже просто. ;-)


Чи існує також спосіб зробити файл pkl із файлів зображень, які я маю?
ytrewq

Це може бути просто-старий маринований, так? На відміну від cPickled? Я не впевнений у наборі даних MNIST, але для pklфайлів загалом pickle.loadпрацює розпакування - хоча, мабуть, він працює менш ефективно, ніж cPickle.load. Для pklфайлів меншої сторони різниця в продуктивності не помітна.
dbliss

Також пам’ятайте, що за замовчуванням для openфункції за замовчуванням встановлено значення режиму r(читання), тому важливо відкрити файл із rbрежимом. Якщо b(двійковий) режим не додано, зняття пікіровки може призвести до UnicodeDecodeError.
Томаш Бартковяк

7

Зручний однокласник

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

Друкуватиме __str__для замаринованого об'єкта.

Загальна проблема візуалізації об’єкта, звичайно, невизначена, тому, якщо __str__цього недостатньо, вам знадобиться власний сценарій.


2

Якщо ви хочете працювати з оригінальними файлами 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

1

РозсілGZIP , якщо файл стиснутий) модуль потрібно використовувати

ПРИМІТКА. Вони вже є у стандартній бібліотеці Python. Не потрібно встановлювати нічого нового

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.