180 votes

Incompatibilité Pickle des tableaux numpy entre Python 2 et 3

J'essaie de charger l'ensemble de données MNIST lié aquí en Python 3.2 à l'aide de 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, j'obtiens l'erreur suivante :

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 décapé en Python 2.7, et de le recoder. J'ai donc 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 s'est exécuté sans erreur, j'ai donc réexécuté 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, j'ai obtenu la même erreur qu'auparavant. Comment faire pour que cela fonctionne ?


Il s'agit d'une meilleure approche pour le chargement de l'ensemble de données MNIST.

7voto

Manish Kumbhare Points 71

Essayez :

l = list(pickle.load(f, encoding='bytes')) #if you are loading image data or 
l = list(pickle.load(f, encoding='latin1')) #if you are loading text data

A partir de la documentation de pickle.load méthode :

Les arguments optionnels 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 est True, pickle essaiera de faire correspondre les anciens noms de Python 2 aux nouveaux noms utilisés dans Python 3.

L'encodage et les erreurs indiquent à pickle comment décoder les instances de chaînes de 8 bits piochées par Python 2 ; ces valeurs sont respectivement 'ASCII' et 'strict' par défaut. L'encodage peut être 'bytes' pour lire ces instances de chaînes 8 bits comme des objets bytes.

0voto

KS HARSHA Points 69

Il existe le hickle qui est plus rapide et plus facile que le pickle. 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 sans trouver de solution alors que je travaillais sur mes propres données pour créer un chatbot.

vec_x et vec_y sont des tableaux numpy :

data=[vec_x,vec_y]
hkl.dump( data, 'new_data_file.hkl' )

Il suffit ensuite de le lire et d'effectuer les opérations :

data2 = hkl.load( 'new_data_file.hkl' )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X