Hoe het pkl-bestand uitpakken?

Ik heb een pkl-bestand van de MNIST-dataset, die bestaat uit handgeschreven cijferafbeeldingen.

Ik wil graag elk van die cijferafbeeldingen bekijken, dus ik moet het pkl-bestand uitpakken, maar ik weet niet hoe.

Is er een manier om het pkl-bestand uit te pakken/uit te pakken?


Antwoord 1, autoriteit 100%

Over het algemeen

Je pkl-bestand is in feite een geserialiseerd pickle-bestand, wat betekent dat het is gedumpt met behulp van Python’s pickle-module.

Als u de gegevens wilt verwijderen, kunt u:

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

Voor de MNIST-dataset

Opmerking gzipis alleen nodig als het bestand is gecomprimeerd:

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

Waar elke set verder kan worden onderverdeeld (d.w.z. voor de trainingsset):

train_x, train_y = train_set

Dat zijn de ingangen (cijfers) en uitgangen (labels) van je sets.

Als u de cijfers wilt weergeven:

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

Het andere alternatief zou zijn om naar de originele gegevens te kijken:

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

Maar dat zal moeilijker zijn, omdat je een programma moet maken om de binaire gegevens in die bestanden te lezen. Dus ik raad je aan om Python te gebruiken en de gegevens te laden met pickle. Zoals je hebt gezien, is het heel eenvoudig. πŸ˜‰


Antwoord 2, autoriteit 4%

Handige oneliner

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

Wordt __str__afgedrukt voor het ingelegde object.

Het algemene probleem van het visualiseren van een object is natuurlijk niet gedefinieerd, dus als __str__niet genoeg is, heb je een aangepast script nodig.


Antwoord 3

Als je met de originele MNIST-bestanden wilt werken, kun je ze als volgt deserialiseren.

Als je de bestanden nog niet hebt gedownload, doe dat dan eerst door het volgende in de terminal uit te voeren:

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

Sla vervolgens het volgende op als deserialize.pyen voer het uit.

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

Het script normaliseert de pixelwaarden niet zoals in het gepekelde bestand. Om dat te doen, hoef je alleen maar

train_images = train_images/255
test_images = test_images/255

Antwoord 4

De augurken(en gzipals het bestand is gecomprimeerd) module moet worden gebruikt

OPMERKING: deze staan ​​al in de standaard Python-bibliotheek.
U hoeft niets nieuws te installeren

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes