J'essaie de charger l'ensemble de données MNIST lié ici dans Python 3.2 en utilisant ce programme:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Malheureusement, cela me donne l'erreur:
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)
J'ai ensuite essayé de décoder le fichier mariné en Python 2.7 et de le ré-encoder. Donc, j'ai exécuté ce programme en Python 2.7:
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.
Il a fonctionné sans erreur, j'ai donc relancé ce programme en Python 3.2:
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)
Cependant, cela m'a donné la même erreur qu'avant. Comment faire fonctionner cela?
C'est une meilleure approche pour charger l'ensemble de données MNIST.
python
python-3.x
pickle
Neil G
la source
la source
Réponses:
Cela semble être une sorte d'incompatibilité. Il essaie de charger un objet "binstring", qui est supposé être ASCII, alors que dans ce cas il s'agit de données binaires. S'il s'agit d'un bug dans le dépickler Python 3, ou d'une "mauvaise utilisation" du pickler par numpy, je ne sais pas.
Voici une solution de contournement, mais je ne sais pas à quel point les données sont significatives à ce stade:
Le décoller dans Python 2, puis le repiquer ne fera que créer à nouveau le même problème, vous devez donc l'enregistrer dans un autre format.
la source
pickle.load(file_obj, encoding='latin1')
(au moins en Python 3.3). Cela semble fonctionner.np.load('./bvlc_alexnet.npy', encoding='latin1')
encoding='latin1'
échoué. Merci!Si vous obtenez cette erreur dans python3, alors, il pourrait être un problème d'incompatibilité entre python 2 et Python 3, pour moi , la solution a consisté à
load
avec lelatin1
codage:la source
Cela semble être un problème d'incompatibilité entre Python 2 et Python 3. J'ai essayé de charger le jeu de données MNIST avec
et cela a fonctionné pour Python 3.5.2
la source
Il semble qu'il y ait des problèmes de compatibilité dans pickle entre 2.x et 3.x en raison du passage à l'unicode. Votre fichier semble être décapé avec python 2.x et le décoder en 3.x pourrait être gênant.
Je suggérerais de le décoller avec python 2.x et de l'enregistrer dans un format qui joue plus bien dans les deux versions que vous utilisez.
la source
Je viens de tomber sur cet extrait. J'espère que cela aidera à clarifier le problème de compatibilité.
la source
Essayer:
De la documentation de la
pickle.load
méthode:Les arguments de mot-clé facultatifs sont fix_imports, encoding et errors, qui sont utilisés pour contrôler la compatibilité avec le flux pickle généré par Python 2.
Si fix_imports vaut True, pickle essaiera de mapper les anciens noms Python 2 avec les nouveaux noms utilisés dans Python 3.
L'encodage et les erreurs indiquent à Pickle comment décoder les instances de chaîne 8 bits picklées par Python 2; ceux-ci par défaut sont respectivement «ASCII» et «strict». Le codage peut être des «octets» pour lire ces instances de chaîne de 8 bits en tant qu'objets octets.
la source
Il y a de l'hickle qui est plus rapide que le cornichon et plus facile. J'ai essayé de le sauvegarder et de le lire dans pickle dump, mais en lisant, il y avait beaucoup de problèmes et j'ai perdu une heure et je n'ai toujours pas trouvé de solution bien que je travaillais sur mes propres données pour créer un chatbot.
vec_x
etvec_y
sont des tableaux numpy:Ensuite, vous venez de le lire et d'effectuer les opérations:
la source