176

このプログラムを使用して、Python3.2でここにリンクされているMNISTデータセットを読み込もうとしています。

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

残念ながら、それは私にエラーを与えます:

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)

次に、ピクルス化されたファイルをPython 2.7でデコードし、再エンコードしようとしました。それで、私はこのプログラムをPython2.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.

エラーなしで実行されたので、Python3.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)

ただし、以前と同じエラーが発生しました。これを機能させるにはどうすればよいですか?


これは、MNISTデータセットをロードするためのより良いアプローチです。

4

7 に答える 7

153

これはある種の非互換性のようです。ASCIIであると想定される「binstring」オブジェクトをロードしようとしていますが、この場合はバイナリデータです。これがPython3unpicklerのバグなのか、numpyによるピッカーの「誤用」なのかはわかりません。

これは回避策のようなものですが、現時点でデータがどれほど意味があるのか​​わかりません。

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)

Python 2で選択を解除してから再度選択すると、同じ問題が再び発生するだけなので、別の形式で保存する必要があります。

于 2012-07-03T15:48:53.900 に答える
150

python3でこのエラーが発生した場合は、python2とpython3の間の非互換性の問題である可能性があります。私にとっての解決策はloadlatin1エンコーディングを使用することでした。

pickle.load(file, encoding='latin1')
于 2016-12-28T17:17:30.340 に答える
16

Python2とPython3の間の非互換性の問題のようです。MNISTデータセットをでロードしてみました

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

Python3.5.2で動作しました

于 2017-02-03T03:49:37.137 に答える
7

Unicodeへの移行により、2.xと3.xの間のpickleに互換性の問題があるようです。あなたのファイルはpython2.xでピクルスになっているようで、3.xでデコードするのは面倒かもしれません。

python 2.xで選択を解除し、使用している2つのバージョン間でより適切に再生される形式に保存することをお勧めします。

于 2012-07-03T06:57:55.663 に答える
7

このスニペットに出くわしました。これが互換性の問題を明確にするのに役立つことを願っています。

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)
于 2017-10-28T17:12:29.747 に答える
7

試す:

l = list(pickle.load(f, encoding='bytes')) #if you are loading image data or 
l = list(pickle.load(f, encoding='latin1')) #if you are loading text data

メソッドのドキュメントからpickle.load

オプションのキーワード引数は、fix_imports、encoding、およびerrorsであり、Python2によって生成されたpickleストリームの互換性サポートを制御するために使用されます。

If fix_imports is True, pickle will try to map the old Python 2 names to the new names used in Python 3.

The encoding and errors tell pickle how to decode 8-bit string instances pickled by Python 2; these default to 'ASCII' and 'strict', respectively. The encoding can be 'bytes' to read these 8-bit string instances as bytes objects.

于 2018-11-28T21:28:20.717 に答える
0

ピクルスより速くて簡単なヒックルがあります。ピクルスダンプに保存して読み取ろうとしましたが、読み取り中に多くの問題が発生し、1時間も無駄になり、チャットボットを作成するために自分のデータで作業していましたが、それでも解決策が見つかりませんでした。

vec_xそしてvec_y、numpy配列です:

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

次に、それを読んで操作を実行します。

data2 = hkl.load( 'new_data_file.hkl' )
于 2018-07-13T20:18:23.127 に答える