Ich versuche, das hier in Python 3.2 verlinkte MNIST-Dataset mit diesem Programm zu laden :
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Leider gibt es mir den Fehler:
Traceback (most recent call last):
File "mnist.py", line 7, in <module>
train_set, valid_set, test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
Ich habe dann versucht, die eingelegte Datei in Python 2.7 zu dekodieren und neu zu kodieren. Also habe ich dieses Programm in Python 2.7 ausgeführt:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
train_set, valid_set, test_set = pickle.load(f)
# Printing out the three objects reveals that they are
# all pairs containing numpy arrays.
with gzip.open('mnistx.pkl.gz', 'wb') as g:
pickle.dump(
(train_set, valid_set, test_set),
g,
protocol=2) # I also tried protocol 0.
Es lief ohne Fehler, also habe ich dieses Programm in Python 3.2 erneut ausgeführt:
import pickle
import gzip
import numpy
# note the filename change
with gzip.open('mnistx.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Es gab mir jedoch den gleichen Fehler wie zuvor. Wie bringe ich das zum Laufen?
python
python-3.x
pickle
Neil G.
quelle
quelle
Antworten:
Dies scheint eine Art Inkompatibilität zu sein. Es wird versucht, ein "binstring" -Objekt zu laden, von dem angenommen wird, dass es ASCII ist, während es sich in diesem Fall um Binärdaten handelt. Ob dies ein Fehler im Python 3-Unpickler oder ein "Missbrauch" des Picklers durch Numpy ist, weiß ich nicht.
Hier ist eine Art Problemumgehung, aber ich weiß nicht, wie aussagekräftig die Daten zu diesem Zeitpunkt sind:
Wenn Sie es in Python 2 entfernen und dann erneut auswählen, wird das gleiche Problem nur erneut auftreten. Sie müssen es also in einem anderen Format speichern.
quelle
pickle.load(file_obj, encoding='latin1')
(zumindest in Python 3.3). Das scheint zu funktionieren.np.load('./bvlc_alexnet.npy', encoding='latin1')
encoding='latin1'
fehlschlug. Vielen Dank!Wenn Sie diesen Fehler in python3 bekommen, dann könnte es ein Kompatibilitätsproblem zwischen Python 2 und Python 3, für mich war die Lösung
load
mitlatin1
kodiert:quelle
Es scheint ein Inkompatibilitätsproblem zwischen Python 2 und Python 3 zu sein. Ich habe versucht, das MNIST-Dataset mit zu laden
und es funktionierte für Python 3.5.2
quelle
Es sieht so aus, als ob es aufgrund der Umstellung auf Unicode einige Kompatibilitätsprobleme bei Pickle zwischen 2.x und 3.x gibt. Ihre Datei scheint mit Python 2.x eingelegt zu sein, und das Dekodieren in 3.x kann problematisch sein.
Ich würde vorschlagen, es mit Python 2.x zu entfernen und in einem Format zu speichern, das für die beiden von Ihnen verwendeten Versionen besser geeignet ist.
quelle
Ich bin gerade auf diesen Ausschnitt gestoßen. Ich hoffe, dies hilft, das Kompatibilitätsproblem zu klären.
quelle
Versuchen:
Aus der Dokumentation der
pickle.load
Methode:Optionale Schlüsselwortargumente sind fix_imports, Codierung und Fehler, mit denen die Kompatibilitätsunterstützung für den von Python 2 generierten Pickle-Stream gesteuert wird.
Wenn fix_imports True ist, versucht pickle, die alten Python 2-Namen den neuen Namen zuzuordnen, die in Python 3 verwendet werden.
Die Codierung und die Fehler zeigen pickle an, wie von Python 2 ausgewählte 8-Bit-String-Instanzen decodiert werden sollen. Diese sind standardmäßig 'ASCII' bzw. 'strict'. Die Codierung kann 'Bytes' sein, um diese 8-Bit-String-Instanzen als Bytes-Objekte zu lesen.
quelle
Es gibt Hickle, das schneller als Pickle und einfacher ist. Ich habe versucht, es in Pickle Dump zu speichern und zu lesen, aber beim Lesen gab es viele Probleme und ich habe eine Stunde verschwendet und immer noch keine Lösung gefunden, obwohl ich an meinen eigenen Daten gearbeitet habe, um einen Chatbot zu erstellen.
vec_x
undvec_y
sind numpy Arrays:Dann lesen Sie es einfach und führen die Operationen aus:
quelle