Niekompatybilność tablic numpy pomiędzy Pythonem 2 i 3

Próbuję załadować zestaw danych MNIST linked tutaj w Pythonie 3.2 używając 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 dekodować marynowany plik w Pythonie 2.7 i ponownie go zakodować. Więc uruchomiłem 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łędu, więc przekierował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ł mi ten sam błąd, co wcześniej. Jak to uruchomić?


To jest lepsze podejście do ładowania zestawu danych MNIST.

Author: Cœur, 2012-07-03

6 answers

To chyba jakaś niezgodność. Próbuje załadować obiekt "binstring", który zakłada się jako ASCII, podczas gdy w tym przypadku są to dane binarne. Jeśli jest to błąd w Pythonie 3 unpickler, lub "nadużycie" picklera przez numpy, Nie wiem.

Tutaj jest coś w rodzaju obejścia, ale nie wiem, jak znaczące są dane w tym momencie:

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)

Rozpakowanie go w Pythonie 2, a następnie ponowne rozpakowanie spowoduje tylko ponowne utworzenie tego samego problemu, więc musisz zapisz go w innym formacie.

 82
Author: Lennart Regebro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-04 18:17:01

Jeśli dostajesz ten błąd w python3, to może to być problem z niekompatybilnością Pythona 2 i Pythona 3, dla mnie rozwiązaniem było load z lattin1 kodowaniem:

pickle.load(file, encoding='latin1')
 65
Author: Tshilidzi Mudau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 17:17:30

Wydaje się, że jest to problem niezgodności pomiędzy Pythonem 2 i Pythonem 3. Próbowałem załadować zestaw danych MNIST za pomocą

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

I zadziałało dla Pythona 3.5.2

 8
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-03 03:49:37

Wygląda na to, że są pewne problemy z kompatybilnością w ogórku między 2.x i 3.x ze względu na przejście na unicode. Twój plik wydaje się być marynowany za pomocą Pythona 2.x i dekodowanie w 3.x może być kłopotliwe.

Sugerowałbym wypakowanie go Pythonem 2.x i zapisywanie do formatu, który gra przyjemniej w dwóch używanych wersjach.

 6
Author: jozzas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 06:57:55

Natknąłem się na ten fragment. Mam nadzieję, że pomoże to wyjaśnić problem zgodności.

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)
 2
Author: serge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-28 17:12:29

Jest hickle, który jest szybszy niż ogórek i łatwiejszy. Próbowałem zapisać i przeczytać go w pickle dump, ale podczas czytania było wiele problemów i zmarnowałem godzinę i nadal nie znalazłem rozwiązania, choć pracowałem nad własnymi danymi, aby utworzyć chatbota.

vec_x i {[3] } są tablicami numpy:

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

Następnie po prostu Przeczytaj i wykonaj operacje:

data2 = hkl.load( 'new_data_file.hkl' )
 0
Author: KS HARSHA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 23:40:23