Estou tentando carregar o conjunto de dados MNIST vinculado aqui no 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)
Infelizmente, isso me dá o erro:
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)
Tentei decodificar o arquivo em conserva no Python 2.7 e recodificá-lo. Então, eu executei este programa no 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.
Ele foi executado sem erros, então eu executei novamente este programa no 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)
No entanto, ele me deu o mesmo erro de antes. Como faço para que isso funcione?
Essa é uma abordagem melhor para carregar o conjunto de dados MNIST.
python
python-3.x
pickle
Neil G
fonte
fonte
Respostas:
Isso parece algum tipo de incompatibilidade. Ele está tentando carregar um objeto "binstring", que é assumido como ASCII, enquanto neste caso são dados binários. Se isso é um bug no desenrolador de Python 3 ou um "uso indevido" do seletor por numpy, não sei.
Aqui está uma solução alternativa, mas não sei até que ponto os dados são significativos neste momento:
Retirar a seleção no Python 2 e, em seguida, selecionar novamente, criará o mesmo problema novamente, portanto, você deve salvá-lo em outro formato.
fonte
pickle.load(file_obj, encoding='latin1')
(pelo menos no Python 3.3). Isso parece funcionar.np.load('./bvlc_alexnet.npy', encoding='latin1')
encoding='latin1'
falha. Obrigado!Se você está recebendo esse erro no python3, pode ser um problema de incompatibilidade entre o python 2 e o python 3; para mim, a solução foi
load
com alatin1
codificação:fonte
Parece ser um problema de incompatibilidade entre o Python 2 e o Python 3. Tentei carregar o conjunto de dados MNIST com
e funcionou para o Python 3.5.2
fonte
Parece que existem alguns problemas de compatibilidade no pickle entre 2.xe 3.x devido à mudança para o unicode. Seu arquivo parece ter sido modificado com o python 2.xe decodificá-lo no 3.x pode ser problemático.
Eu sugiro desmarcá-lo com python 2.xe salvar em um formato que seja mais bem reproduzido nas duas versões que você está usando.
fonte
Eu apenas tropecei neste trecho. Espero que isso ajude a esclarecer o problema de compatibilidade.
fonte
Experimentar:
A partir da documentação do
pickle.load
método:Os argumentos opcionais da palavra-chave são fix_imports, codificação e erros, que são usados para controlar o suporte de compatibilidade para o pickle stream gerado pelo Python 2.
Se fix_imports for True, pickle tentará mapear os nomes antigos do Python 2 para os novos nomes usados no Python 3.
A codificação e os erros dizem ao pickle como decodificar instâncias de string de 8 bits selecionadas pelo Python 2; esses padrões são 'ASCII' e 'strict', respectivamente. A codificação pode ser 'bytes' para ler essas instâncias de cadeia de 8 bits como objetos de bytes.
fonte
Há hickle que é mais rápido que pickle e mais fácil. Tentei salvar e ler no pickle dump, mas durante a leitura houve muitos problemas e perdi uma hora e ainda não encontrei uma solução, embora eu estivesse trabalhando nos meus próprios dados para criar um chatbot.
vec_x
evec_y
são matrizes numpy:Então você acabou de ler e executar as operações:
fonte