Saya mencoba memuat dataset MNIST yang ditautkan di sini di Python 3.2 menggunakan program ini:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Sayangnya, itu memberi saya kesalahan:
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)
Saya kemudian mencoba men-decode file acar dengan Python 2.7, dan menyandikannya kembali. Jadi, saya menjalankan program ini dengan 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.
Itu berjalan tanpa kesalahan, jadi saya memutar ulang program ini dengan 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)
Namun, itu memberi saya kesalahan yang sama seperti sebelumnya. Bagaimana saya membuatnya bekerja?
Ini adalah pendekatan yang lebih baik untuk memuat dataset MNIST.
python
python-3.x
pickle
Neil G
sumber
sumber
Jawaban:
Ini sepertinya semacam ketidakcocokan. Ia mencoba memuat objek "binstring", yang dianggap ASCII, sedangkan dalam hal ini adalah data biner. Jika ini adalah bug di Python 3 unpickler, atau "penyalahgunaan" pickler oleh numpy, saya tidak tahu.
Ini adalah solusi untuk masalah ini, tetapi saya tidak tahu seberapa berartinya data saat ini:
Melepas pemasangannya di Python 2 lalu repickling hanya akan membuat masalah yang sama lagi, jadi Anda perlu menyimpannya dalam format lain.
sumber
pickle.load(file_obj, encoding='latin1')
(setidaknya dalam Python 3.3). Ini sepertinya berhasil.np.load('./bvlc_alexnet.npy', encoding='latin1')
encoding='latin1'
gagal. Terima kasih!Jika Anda mendapatkan kesalahan ini di python3, maka, itu bisa menjadi masalah ketidakcocokan antara python 2 dan python 3, bagi saya solusinya adalah
load
denganlatin1
pengkodean:sumber
Tampaknya menjadi masalah ketidakcocokan antara Python 2 dan Python 3. Saya mencoba memuat dataset MNIST
dan itu berhasil untuk Python 3.5.2
sumber
Sepertinya ada beberapa masalah kompatibilitas di acar antara 2.x dan 3.x karena pindah ke unicode. File Anda tampaknya acar dengan python 2.x dan mendekodekannya dalam 3.x bisa menyusahkan.
Saya sarankan untuk mengurungkannya dengan python 2.x dan menyimpan ke format yang memainkan lebih baik di dua versi yang Anda gunakan.
sumber
Saya baru saja menemukan potongan ini. Semoga ini bisa membantu memperjelas masalah kompatibilitas.
sumber
Mencoba:
Dari dokumentasi
pickle.load
metode:Argumen kata kunci opsional adalah fix_import, pengodean dan kesalahan, yang digunakan untuk mengontrol dukungan kompatibilitas untuk acar aliran yang dihasilkan oleh Python 2.
Jika fix_import Benar, acar akan mencoba memetakan nama Python 2 lama ke nama baru yang digunakan dalam Python 3.
Pengkodean dan kesalahan memberi tahu acar bagaimana cara mendekode instance string 8-bit yang dibuat oleh Python 2; default ini untuk 'ASCII' dan 'ketat', masing-masing. Pengkodean dapat berupa 'byte' untuk membaca instance string 8-bit ini sebagai objek byte.
sumber
Ada hickle yang lebih cepat dari pada acar dan lebih mudah. Saya mencoba menyimpan dan membacanya di acar dump tetapi ketika membaca ada banyak masalah dan membuang satu jam dan masih tidak menemukan solusi meskipun saya sedang mengerjakan data saya sendiri untuk membuat chatbot.
vec_x
danvec_y
array numpy:Kemudian Anda baru saja membacanya dan melakukan operasi:
sumber