Próbuję załadować zestaw danych MNIST połączony tutaj w Pythonie 3.2 za pomocą tego programu:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Niestety daje mi błąd:
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)
Następnie próbowałem zdekodować piklowany plik w Pythonie 2.7 i ponownie go zakodować. Uruchomiłem więc ten program w Pythonie 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.
Działał bez błędów, więc ponownie uruchomiłem ten program w Pythonie 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)
Jednak dało mi to ten sam błąd co poprzednio. Jak sprawić, by to zadziałało?
python
python-3.x
pickle
Neil G.
źródło
źródło
Odpowiedzi:
Wydaje się, że jest to jakaś niezgodność. Próbuje załadować obiekt „binstring”, który zakłada, że jest to ASCII, podczas gdy w tym przypadku są to dane binarne. Jeśli jest to błąd w Unpicklerze Pythona 3, czy też „niewłaściwe użycie” tego narzędzia przez numpy, to nie wiem.
Oto coś w rodzaju obejścia, ale nie wiem, jak znaczące są dane w tym momencie:
Rozpakowanie go w Pythonie 2, a następnie ponowne wybranie spowoduje tylko ten sam problem, więc musisz zapisać go w innym formacie.
źródło
pickle.load(file_obj, encoding='latin1')
(przynajmniej w Pythonie 3.3). To wydaje się działać.np.load('./bvlc_alexnet.npy', encoding='latin1')
encoding='latin1'
nie powiodło się. Dzięki!Jeśli otrzymujesz ten błąd w python3, to może to być problem niezgodności między Python 2 i Python 3, dla mnie rozwiązaniem było
load
zlatin1
kodowaniem:źródło
Wydaje się, że jest to problem z niekompatybilnością między Pythonem 2 i Pythonem 3. Próbowałem załadować zestaw danych MNIST za pomocą
i działało dla Pythona 3.5.2
źródło
Wygląda na to, że istnieją pewne problemy z kompatybilnością w pikle między 2.x a 3.x z powodu przejścia na Unicode. Twój plik wygląda na wytrawiony w Pythonie 2.xi dekodowanie go w 3.x może być kłopotliwe.
Sugerowałbym rozpakowanie go za pomocą Pythona 2.xi zapisanie w formacie, który gra ładniej w dwóch wersjach, których używasz.
źródło
Właśnie natknąłem się na ten fragment. Mam nadzieję, że pomoże to wyjaśnić problem ze zgodnością.
źródło
Próbować:
Z dokumentacji
pickle.load
metody:Opcjonalne argumenty słów kluczowych to fix_imports, kodowanie i błędy, które są używane do kontrolowania obsługi zgodności dla strumienia pikle generowanego przez Python 2.
Jeśli fix_imports ma wartość True, pickle spróbuje zmapować stare nazwy Pythona 2 na nowe nazwy używane w Pythonie 3.
Kodowanie i błędy mówią pickle, jak dekodować 8-bitowe instancje ciągów marynowane przez Python 2; te domyślne to odpowiednio „ASCII” i „ścisłe”. Kodowanie może mieć wartość „bajtów”, aby odczytać te 8-bitowe instancje ciągów jako obiekty bajtów.
źródło
Jest hickle, która jest szybsza niż marynata i łatwiejsza. Próbowałem go zapisać i przeczytać w zrzucie pikli, ale podczas czytania było dużo problemów i zmarnowałem godzinę i nadal nie znalazłem rozwiązania, chociaż pracowałem na własnych danych, aby stworzyć chatbota.
vec_x
ivec_y
są tablicami numpy:Następnie po prostu go przeczytaj i wykonaj operacje:
źródło