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?

ytrewq
quelle

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. ;-);

Peque
quelle
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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
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
Osolmaz
quelle
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

crabman84
quelle