web-dev-qa-db-ja.com

imdb.load_data()関数で「allow_pickle = False」のときに「オブジェクト配列をロードできない」を修正するにはどうすればよいですか?

Google ColabのIMDbデータセットを使用してバイナリ分類の例を実装しようとしています。このモデルは以前に実装しました。しかし、数日後にもう一度実行しようとすると、値エラーが返されました。

私はすでにこれを解決しようとしましたが、同様の問題の既存の回答を参考にしています: sketch_rnnアルゴリズムで「allow_pickle = False」のときに「オブジェクト配列をロードできません」を修正する方法 ただし、allow_pickleを追加するだけです引数だけでは不十分です。

私のコード:

from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

エラー:

ValueError                                Traceback (most recent call last)
<ipython-input-1-2ab3902db485> in <module>()
      1 from keras.datasets import imdb
----> 2 (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

2 frames
/usr/local/lib/python3.6/dist-packages/keras/datasets/imdb.py in load_data(path, num_words, skip_top, maxlen, seed, start_char, oov_char, index_from, **kwargs)
     57                     file_hash='599dadb1135973df5b59232a0e9a887c')
     58     with np.load(path) as f:
---> 59         x_train, labels_train = f['x_train'], f['y_train']
     60         x_test, labels_test = f['x_test'], f['y_test']
     61 

/usr/local/lib/python3.6/dist-packages/numpy/lib/npyio.py in __getitem__(self, key)
    260                 return format.read_array(bytes,
    261                                          allow_pickle=self.allow_pickle,
--> 262                                          pickle_kwargs=self.pickle_kwargs)
    263             else:
    264                 return self.Zip.read(key)

/usr/local/lib/python3.6/dist-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs)
    690         # The array contained Python objects. We need to unpickle the data.
    691         if not allow_pickle:
--> 692             raise ValueError("Object arrays cannot be loaded when "
    693                              "allow_pickle=False")
    694         if pickle_kwargs is None:

ValueError: Object arrays cannot be loaded when allow_pickle=False
99
Kanad

ノートブックでimdb.load_dataにピクルスを許可するように強制するトリックは次のとおりです。この行を置き換えます。

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

これで:

import numpy as np
# save np.load
np_load_old = np.load

# modify the default parameters of np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

# call load_data with allow_pickle implicitly set to true
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

# restore np.load for future normal usage
np.load = np_load_old
107
cheez

この問題はまだkeras gitで発生しています。それができるだけ早く解決されることを願っています。それまでは、numpyバージョンを1.16.2にダウングレードしてみてください。問題は解決したようです。

!pip install numpy==1.16.1
import numpy as np

このバージョンのnumpyのデフォルト値はallow_pickleTrueです。

83
Tirth Patel

GitHubで issue を実行した後の公式の解決策は、imdb.pyファイルを編集することです。この修正は、numpyをダウングレードする必要なく、私にとってはうまくいきました。 tensorflow/python/keras/datasets/imdb.pyでimdb.pyファイルを見つけ(私へのフルパスはC:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py-他のインストールは異なる)、diffに従って85行目を変更します。

-  with np.load(path) as f:
+  with np.load(path, allow_pickle=True) as f:

変更の理由は、Pythonピクル化されたファイルでのSQLインジェクションに相当するものを防ぐためのセキュリティです。上記の変更はimdbデータにのみ影響するため、他の場所でセキュリティを保持します(ダウングレードしないことにより) numpy)。

45
MappaGnosis

Np.load()の引数としてallow_pickle = Trueを使用しただけで、うまくいきました。

28

Cheez( https://stackoverflow.com/users/122933/cheez )からの答えが最も簡単で効果的なものだと思います。セッションの期間全体で派手な関数を変更しないように、少し詳しく説明します。

私の提案は以下です。私はそれを使用して、同じ種類のエラーを示しているkerasからロイターデータセットをダウンロードしています。

old = np.load
np.load = lambda *a,**k: old(*a,**k,allow_pickle=True)

from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

np.load = old
del(old)
10

フラグの値を変更してみてください

np.load(training_image_names_array,allow_pickle=True)

私の場合、以下で動作しました:

np.load(path, allow_pickle=True)
5
travs15

上記の解決策はどれも私にとってはうまくいきませんでした:python 3.7.3でanacondaを実行しました。

  • anaconda powershellから「conda install numpy == 1.16.1」を実行します

  • ノートブックを閉じて再度開く

4
farid khafizov

はい、以前のバージョンのnumpyをインストールすると問題が解決しました。

PyCharm IDEを使用する人のために:

私のIDE(Pycharm)、File-> Settings-> Project Interpreter:私はnumpyが1.16.3であることを見つけたので、1.16.1に戻します。+をクリックしてnumpy in検索、「バージョンの指定」にチェックを入れ、1.16.1を選択し、->パッケージのインストールを選択します。

2
Wissam

imdb.pyへのパスを見つけて、フラグをnp.load(path、... flag ...)に追加するだけです

    def load_data(.......):
    .......................................
    .......................................
    - with np.load(path) as f:
    + with np.load(path,allow_pickle=True) as f:
1

使用してjupyterノートに

np_load_old = np.load

# modify the default parameters of np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

正常に動作しましたが、spyderでこのメソッドを使用すると問題が発生します(毎回カーネルを再起動する必要があります。そうしないと、次のようなエラーが発生します:

TypeError:()キーワード引数 'allow_pickle'の複数の値を取得しました

私はソリューション here を使用してこの問題を解決しました:

1
Yasser Albarbay

私が見つけたのは、TensorFlow 2.0(私は2.0.0-alpha0を使用しています)がNumpyの最新バージョン、つまりv1.17.0(および場合によってはv1.16.5 +)と互換性がないことです。 TF2がインポートされるとすぐに、次のようなFutureWarningの膨大なリストがスローされます。

FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/anaconda3/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/anaconda3/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/anaconda3/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.

これにより、kerasからimdbデータセットをロードしようとすると、allow_pickleエラーが発生しました。

うまく機能する次のソリューションを使用しようとしましたが、TF2またはtf.kerasをインポートするすべてのプロジェクトでそれを実行する必要がありました。

np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

私が見つけた最も簡単な解決策は、numpy 1.16.1をグローバルにインストールするか、仮想環境で互換性のあるバージョンのtensorflowとnumpyを使用することでした。

この回答の私の目標は、それがimdb.load_dataの問題だけでなく、TF2とNumpyのバージョンの非互換性によって引き起こされるより大きな問題であり、他の多くの隠れたバグや問題を引き起こす可能性があることを指摘することです。

1
sidk

私の仕事

        np_load_old = np.load
        np.load = lambda *a: np_load_old(*a, allow_pickle=True)
        (x_train, y_train), (x_test, y_test) = reuters.load_data(num_words=None, test_split=0.2)
        np.load = np_load_old
1
MomiChan

最も簡単な方法は、imdb.pyがエラーをスローする行でallow_pickle=True設定np.loadimdb.pyに変更することです。

0

@ cheezの回答 が機能しないことがあり、関数を繰り返し再呼び出しします。この問題を解決するには、関数を深くコピーする必要があります。関数partialを使用してこれを行うことができるため、最終的なコードは次のようになります。

import numpy as np
from functools import partial

# save np.load
np_load_old = partial(np.load)

# modify the default parameters of np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

# call load_data with allow_pickle implicitly set to true
(train_data, train_labels), (test_data, test_labels) = 
imdb.load_data(num_words=10000)

# restore np.load for future normal usage
np.load = np_load_old
0
Sajad Norouzi

Tensorflowはtf-nightlyバージョンで修正されています。

!pip install tf-nightly

現在のバージョンは「2.0.0-dev20190511」です。

0
Joocheol Kim

私は通常これらのものに投稿しませんが、これは非常に迷惑でした。混乱は、Keras imdb.pyファイルの一部がすでに更新されているという事実から生じます。

with np.load(path) as f:

allow_pickle=True付きのバージョンに。 imdb.pyファイルをチェックして、この変更がすでに実装されているかどうかを確認してください。調整されている場合、以下は正常に機能します。

from keras.datasets import imdb
(train_text, train_labels), (test_text, test_labels) = imdb.load_data(num_words=10000)
0
James