Estoy tratando de cargar el conjunto de datos MNIST vinculado aquí en Python 3.2 usando este programa:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Lamentablemente, 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 intenté decodificar el archivo en escabeche en Python 2.7 y volver a codificarlo. Entonces, ejecuté 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 error, 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 hago para que esto funcione?
Este es un mejor enfoque para cargar el conjunto de datos MNIST.
python
python-3.x
pickle
Neil G
fuente
fuente
Respuestas:
Esto parece una especie de incompatibilidad. Está intentando cargar un objeto "binstring", que se supone que es ASCII, mientras que en este caso son datos binarios. Si esto es un error en el desempañador de Python 3, o un "mal uso" del recolector por numpy, no lo sé.
Aquí hay una solución alternativa, pero no sé cuán significativos son los datos en este momento:
Desengancharlo en Python 2 y luego volver a engancharlo solo creará el mismo problema nuevamente, por lo que debe guardarlo en otro formato.
fuente
pickle.load(file_obj, encoding='latin1')
(al menos en Python 3.3). Esto parece funcionar.np.load('./bvlc_alexnet.npy', encoding='latin1')
encoding='latin1'
falló. ¡Gracias!Si usted está recibiendo este error en python3, a continuación, podría ser un problema de incompatibilidad entre Python 2 y Python 3, para mí la solución era
load
conlatin1
la codificación:fuente
Parece ser un problema de incompatibilidad entre Python 2 y Python 3. Intenté cargar el conjunto de datos MNIST con
y funcionó para Python 3.5.2
fuente
Parece que hay algunos problemas de compatibilidad en pickle entre 2.xy 3.x debido al cambio a unicode. Su archivo parece estar en escabeche con python 2.xy decodificarlo en 3.x podría ser problemático.
Sugeriría deshabilitarlo con python 2.xy guardarlo en un formato que se reproduzca mejor en las dos versiones que está utilizando.
fuente
Me topé con este fragmento. Espero que esto ayude a aclarar el problema de compatibilidad.
fuente
Tratar:
De la documentación del
pickle.load
método:Los argumentos opcionales de palabras clave son fix_imports, codificación y errores, que se utilizan para controlar el soporte de compatibilidad para el flujo de pickle generado por Python 2.
Si fix_imports es True, pickle intentará asignar los nombres antiguos de Python 2 a los nuevos nombres utilizados en Python 3.
La codificación y los errores le indican a pickle cómo decodificar instancias de cadenas de 8 bits seleccionadas por Python 2; estos predeterminados a 'ASCII' y 'estricto', respectivamente. La codificación puede ser 'bytes' para leer estas instancias de cadena de 8 bits como objetos de bytes.
fuente
Hay Hickle que es más rápido que encurtido y más fácil. Traté de guardarlo y leerlo en pickle dump, pero mientras leía hubo muchos problemas y desperdicié una hora y aún no encontré una solución, aunque estaba trabajando en mis propios datos para crear un chatbot.
vec_x
yvec_y
son matrices numpy:Luego solo lo lees y realizas las operaciones:
fuente