[python] imdb.load_data () 함수에 대해 ‘allow_pickle = False’일 때 개체 배열을로드 할 수 없음을 수정하는 방법은 무엇입니까?

Google Colab 에서 IMDb 데이터 세트를 사용하여 이진 분류 예제를 구현하려고합니다 . 이전에이 모델을 구현했습니다. 그러나 며칠 후 다시 시도했을 때 load_data () 함수에 대해 ‘allow_pickle = False 일 때 개체 배열을로드 할 수 없습니다’라는 값 오류가 반환되었습니다.

: 난 이미 비슷한 문제에 대한 기존 응답 언급,이 문제를 해결하는 시도 어떻게 해결하는 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



답변

다음 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


답변

이 문제는 여전히 keras git에 있습니다. 가능한 한 빨리 해결되기를 바랍니다. 그때까지 numpy 버전을 1.16.2로 다운 그레이드 해보세요. 문제를 해결하는 것 같습니다.

!pip install numpy==1.16.1
import numpy as np

이 numpy 버전의 기본값 allow_pickleTrue.


답변

GitHub 에서이 문제 에 이어 공식적인 해결책은 imdb.py 파일을 편집하는 것입니다. 이 수정은 numpy를 다운 그레이드하지 않고도 잘 작동했습니다. imdb.py 파일을 찾아서 tensorflow/python/keras/datasets/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:

변경 이유는 피클 파일에 SQL 주입에 해당하는 Python을 방지하기위한 보안입니다. 위의 변경 사항은 imdb 데이터에만 영향을 미치므로 다른 곳에서 보안을 유지합니다 (numpy를 다운 그레이드하지 않음).


답변

방금 allow_pickle = True를 np.load ()에 대한 인수로 사용했으며 저에게 효과적이었습니다.


답변

제 경우에는 다음과 같이 일했습니다.

np.load(path, allow_pickle=True)


답변

cheez ( https://stackoverflow.com/users/122933/cheez ) 의 답변 이 가장 쉽고 효과적인 답변이라고 생각합니다 . 전체 세션 기간 동안 numpy 함수를 수정하지 않도록 조금 더 자세히 설명하겠습니다.

내 제안은 다음과 같습니다. 동일한 종류의 오류를 보여주는 keras에서 reuters 데이터 세트를 다운로드하는 데 사용하고 있습니다.

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)


답변

플래그의 값을 변경해 볼 수 있습니다.

np.load(training_image_names_array,allow_pickle=True)