Estoy tratando de cargar el conjunto de datos MNIST vinculado aquí en Python 3.2 el uso de este programa:

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

Por desgracia, me da el error:

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)

Luego traté de descifrar el escabeche archivo en Python 2.7, y re-codificar. Así, me encontré este programa 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.

Se ejecutó sin errores, así que volví a ejecutar este programa 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)

Sin embargo, me dio el mismo error que antes. ¿Cómo puedo conseguir que esto funcione?


Este es un método mejor para cargar el conjunto de datos MNIST.

  • hay compatibilidad de los descansos entre 2.7 y 3.x. especialmente cadena vs unicode. Y cogiendo una colección de objetos requiere que tanto los sistemas de carga de la numpy módulo, pero los módulos son diferentes. Lo siento, no tenemos una respuesta, pero esto podría no ser capaz de hacer-y probablemente no es aconsejable. Si esto son cosas grandes (gzip), tal vez hdf5 con pytables??
  • Gracias, tu comentario (post esta como una respuesta?) clued me de la respuesta correcta. Yo podría haber usado hdf5, pero parecía complicado de aprender, así que me fui con numpy.guardar/cargar y esta trabajado.
  • h5py es muy simple de usar, casi sin duda mucho más fácil que resolver nebuloso problemas de compatibilidad con el decapado de los arrays de numpy.
  • Dices que «se ejecutó este programa en Python 2.7». OK, pero lo hizo ejecutar en 3.2? 🙂 El mismo?
  • Después de ejecutar el programa de segundo que los encurtidos de los arreglos, me encontré con el primer programa (sustituyendo el nombre de archivo mnistx.pkl.gz) en Python 3.2. No trabajo, que creo que ilustra algún tipo de incompatibilidad.
  • Sería una buena idea si usted aparece el programa que en realidad el error. Este error se ve como se abre el archivo en modo texto, específicamente.
  • Bueno, listo. Por favor, hágamelo saber si usted termina de reproducir el error. Gracias.
  • gracias por el enlace a la «mejor aproximación», pero podrían aclarar cómo hacerlo? qué código se ejecuta para esto?
  • Leer los documentos vinculados o hacer una pregunta, incluyendo lo que has intentado si no está claro cómo utilizar esa función.

InformationsquelleAutor Neil G | 2012-07-03

7 Comentarios

  1. 117

    Esto parece ser algún tipo de incompatibilidad. Está tratando de cargar un «binstring de objeto», que se supone ASCII, mientras que en este caso se trata de datos binarios. Si este es un error en el Python 3 unpickler, o un «mal uso» de la pickler por numpy, no sé.

    Aquí es algo de una solución, pero no sé cómo significativas de los datos es en este punto:

    import pickle
    import gzip
    import numpy
    
    with open('mnist.pkl', 'rb') as f:
        u = pickle._Unpickler(f)
        u.encoding = 'latin1'
        p = u.load()
        print(p)

    Unpickling en Python 2 y, a continuación, repickling solo se va a crear el mismo problema de nuevo, por lo que necesita para guardarlo en otro formato.

    • Usted puede utilizar pickle.load(file_obj, encoding='latin1') (al menos en Python 3.3). Esta parece para trabajar.
    • Para aquellos que usan numpy de carga y de afrontar el problema similar: es posible pasar de codificación así: np.load('./bvlc_alexnet.npy', encoding='latin1')
    • Esto funcionó para mí cuando la adición de encoding='latin1' fallado. Gracias!
  2. 92

    Si usted está recibiendo este error en python3, entonces, podría ser un problema de incompatibilidad entre python 2 y python 3, para mí, la solución fue load con lattin1 de codificación:

    pickle.load(file, encoding='latin1')
  3. 9

    Parece ser un problema de incompatibilidad entre Python 2 y Python 3. He intentado cargar el conjunto de datos MNIST con

        train_set, valid_set, test_set = pickle.load(file, encoding='iso-8859-1')

    y que trabajó para Python 3.5.2

  4. 7

    Parece hay algunos problemas compatablility en salmuera entre 2.x y 3.x debido a la mudanza a unicode. El archivo parece estar en escabeche con python 2.x y decodificación en el 3.x puede ser problemático.

    Te sugiero que unpickling con python 2.x y guardar en un formato que juega más bien a través de las dos versiones está utilizando.

    • Eso es lo que yo estaba tratando de hacer. El formato que se recomienda?
    • Creo que el problema podría haber sido la codificación de numpy dtype, lo que podría ser una cadena. En cualquier caso, que terminó con numpy.guardar/cargar para cerrar la brecha entre python 2 y 3, y esta trabajado.
  5. 6

    Me topé con este fragmento. Espero que esto ayude a aclarar la cuestión de la compatibilidad.

    import sys
    
    with gzip.open('mnist.pkl.gz', 'rb') as f:
        if sys.version_info.major > 2:
            train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
        else:
            train_set, valid_set, test_set = pickle.load(f)
    • Considere la posibilidad de agregar más la amplificación de la información. ¿Cómo afecta esto a resolver el problema?
    • eso ayudó, por favor explicación a la respuesta
  6. 2

    Tratar:

    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

    De la documentación de pickle.load método:

    Palabra clave opcional argumentos son fix_imports, codificación y errores, que se utilizan para el control de la compatibilidad de apoyo para pickle flujo generado por Python 2.

    Si fix_imports es Cierto, pepinillo intentará mapa de la antigua Python 2 los nombres de los nuevos nombres que se utilizan en Python 3.

    La codificación y errores de decirle a pickle cómo decodificar 8-bits de la cadena de instancias de vinagre por Python 2; por defecto a ‘ASCII’ y ‘estricto’, respectivamente. La codificación puede ser ‘bytes’ para leer estos 8 bits de la cadena de instancias como el número de bytes de los objetos.

  7. 0

    Hay hickle que es más rápido que el pepinillo y más fácil.
    Traté de guardar y leer en salmuera volcado, pero al leer que había un montón de problemas y el desperdicio de una hora y todavía no encuentra una solución, aunque yo estaba trabajando en mis propios datos para crear un chatbot.

    vec_x y vec_y son arrays de numpy:

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

    Entonces usted acaba de leer y realizar las operaciones:

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

Dejar respuesta

Please enter your comment!
Please enter your name here