Allgemein
Ihre pkl
Datei ist in der Tat eine serialisierte pickle
Datei, was bedeutet, dass sie mit dem Python- pickle
Modul 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 gzip
wird 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()
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. ;-);
pkl
Dateien im Allgemeinenpickle.load
funktioniert es zum Entpacken - obwohl ich denke, dass es weniger gut funktioniert alscPickle.load
. Beipkl
Dateien auf der kleineren Seite ist der Leistungsunterschied nicht erkennbar.open
Funktion standardmäßig ein Standardwert für den Modusr
(Lesen) festgelegt ist. Daher ist es wichtig, eine Datei mit demrb
Modus zu öffnen . Wenn derb
(binäre) Modus nicht hinzugefügt wird, kann das Aufheben der Auswahl zu a führenUnicodeDecodeError
.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.quelle
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:
Speichern Sie dann Folgendes als
deserialize.py
und 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
quelle
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
quelle