Wie entpacke ich eine pkl-Datei?


79

Ich habe eine pkl-Datei aus dem MNIST-Datensatz, die aus handgeschriebenen Ziffernbildern besteht.

Ich möchte mir jedes dieser Ziffernbilder ansehen, daher muss ich die pkl-Datei entpacken, außer ich kann nicht herausfinden, wie.

Gibt es eine Möglichkeit, pkl-Dateien zu entpacken / entpacken?

Antworten:


149

Allgemein

Ihre pklDatei ist in der Tat eine serialisierte pickleDatei, was bedeutet, dass sie mit dem Python- pickleModul gesichert wurde.

So entfernen Sie die Daten:

import pickle


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

Für den MNIST-Datensatz

Hinweis gzipwird nur benötigt, wenn die Datei komprimiert ist:

import gzip
import pickle


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

Wo jeder Satz weiter unterteilt werden kann (dh für den Trainingssatz):

train_x, train_y = train_set

Dies sind die Eingaben (Ziffern) und Ausgaben (Beschriftungen) Ihrer Sets.

Wenn Sie die Ziffern anzeigen möchten:

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

Die andere Alternative wäre, sich die Originaldaten anzusehen:

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

Dies wird jedoch schwieriger, da Sie ein Programm zum Lesen der Binärdaten in diesen Dateien erstellen müssen. Daher empfehle ich Ihnen, Python zu verwenden und die Daten mit zu laden pickle. Wie Sie gesehen haben, ist es sehr einfach. ;-);


Gibt es auch eine Möglichkeit, aus den Bilddateien, die ich habe, eine pkl-Datei zu erstellen?
Ytrewq

Könnte einfach alt eingelegt sein, oder? Im Gegensatz zu cPickled? Ich bin mir nicht sicher über das MNIST-Dataset, aber für pklDateien im Allgemeinen pickle.loadfunktioniert es zum Entpacken - obwohl ich denke, dass es weniger gut funktioniert als cPickle.load. Bei pklDateien auf der kleineren Seite ist der Leistungsunterschied nicht erkennbar.
dbliss

Denken Sie auch daran, dass für die openFunktion standardmäßig ein Standardwert für den Modus r(Lesen) festgelegt ist. Daher ist es wichtig, eine Datei mit dem rbModus zu öffnen . Wenn der b(binäre) Modus nicht hinzugefügt wird, kann das Aufheben der Auswahl zu a führen UnicodeDecodeError.
Tomasz Bartkowiak

7

Handlicher Einzeiler

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

Druckt __str__für das eingelegte Objekt.

Das generische Problem der Visualisierung eines Objekts ist natürlich undefiniert. Wenn dies __str__nicht ausreicht, benötigen Sie ein benutzerdefiniertes Skript.


2

Wenn Sie mit den ursprünglichen MNIST-Dateien arbeiten möchten, können Sie diese wie folgt deserialisieren.

Wenn Sie die Dateien noch nicht heruntergeladen haben, führen Sie dies zunächst im Terminal aus:

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

Speichern Sie dann Folgendes als deserialize.pyund führen Sie es aus.

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

Das Skript normalisiert die Pixelwerte nicht wie in der eingelegten Datei. Dazu müssen Sie nur noch etwas tun

train_images = train_images/255
test_images = test_images/255

1

Das Modul pickle (und gzip, wenn die Datei komprimiert ist) muss verwendet werden

HINWEIS: Diese befinden sich bereits in der Standard-Python-Bibliothek. Sie müssen nichts Neues installieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.