programing

imdb.load_data() 함수에 대한 'allow_pickle=False일 때 객체 배열을 로드할 수 없음'을 수정하는 방법은 무엇입니까?

css3 2023. 7. 24. 22:42

imdb.load_data() 함수에 대한 'allow_pickle=False일 때 객체 배열을 로드할 수 없음'을 수정하는 방법은 무엇입니까?

Google Colab에서 IMDb 데이터 세트를 사용하여 이진 분류 예제를 구현하려고 합니다.저는 이 모델을 이전에 구현한 적이 있습니다.그런데 며칠 후에 다시 하려고 하자, 그것이 되돌아왔습니다.value error: 'Object arrays cannot be loaded when allow_pickle=False'function.load_data()의.

저는 이미 비슷한 문제에 대한 기존 답변을 참조하여 이 문제를 해결하려고 시도했습니다.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

이 문제는 아직 해결되지 않았습니다.저는 그것이 가능한 한 빨리 해결되기를 바랍니다.그때까지 Numpy 버전을 1.16.2로 다운그레이드해 보십시오.그것이 문제를 해결하는 것처럼 보입니다.

!pip install numpy==1.16.1
import numpy as np

은 "numpy 의기본다같음습니다과이은값"입니다.allow_pickle~하듯이True.

np.load()에 대한 인수로 allow_pickle = True를 사용했는데 효과가 있었습니다.

np.load(path, allow_pickle=True)

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:

변경 이유는 Python이 피클 파일에서 SQL 주입과 동등한 수준의 보안 때문입니다.위의 변경 사항은 imdb 데이터에만 영향을 미치므로 numpy를 다운그레이드하지 않고 다른 곳에서 보안을 유지합니다.

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

np.load(path, allow_pickle=True)

플래그 값을 변경할 수 있습니다.

np.load(training_image_names_array,allow_pickle=True)

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

제 제안은 아래와 같습니다.나는 그것을 같은 종류의 오류를 보여주는 케라에서 로이터 데이터 세트를 다운로드하는 데 사용하고 있습니다.

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)

위에 나열된 솔루션 중 어떤 것도 저에게 효과가 없었습니다. 저는 python 3.7.3으로 아나콘다를 실행합니다.제게 효과가 있었던 것은

  • 아나콘다 파워셸에서 "conda install numpy==1.16.1"을 실행합니다.

  • 노트북을 닫았다가 다시 엽니다.

를 사용하여 주피터 노트북에

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)

정상적으로 작동했지만 스파이더에서 이 방법을 사용할 때 문제가 발생합니다(매번 커널을 다시 시작해야 합니다). 그렇지 않으면 다음과 같은 오류가 발생합니다.

TypeError : () 키워드 인수 'allow_pickle'에 대한 여러 값을 받았습니다.

다음 솔루션을 사용하여 이 문제를 해결했습니다.

imdb.py 의 경로를 찾은 다음 np.load에 플래그를 추가합니다(경로, ...vmdk...).

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

사용

 from tensorflow.keras.datasets import imdb

이것 대신에

 from keras.datasets import imdb

np..np .save로 할 수 .나는 이것이 문제가 아니라는 것을 확인하기 위해 구글을 위해 말하는 것입니다. 한사용을 합니다.allow_pickle=True목록이 실제로 저장 및 로드할 의미인 경우 문제를 해결했습니다.

그것은 나를 위한 일입니다.

        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

제가 발견한 것은 TensorFlow 2.0(2.0.0-alpha0 사용)이 최신 버전의 Numpy(예: v1.17.0 및 v1.16.5+)와 호환되지 않는다는 것입니다.TF2를 가져오자마자 다음과 같은 거대한 미래 경고 목록이 표시됩니다.

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을 글로벌하게 설치하거나 가상 환경에서 호환 가능한 버전의 텐서 흐름과 numpy를 사용하는 것이었습니다.

이 답변에 대한 제 목표는 단순히 imdb.load_data의 문제가 아니라 TF2와 Numpy 버전의 비호환성으로 인한 더 큰 문제이며 다른 많은 숨겨진 버그나 문제를 야기할 수 있다는 것을 지적하는 것입니다.

@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

난 여기에 착륙했고, 당신의 방법을 시도했지만 알아낼 수 없었습니다.

저는 사실 미리 정해진 코드를 작업하고 있었습니다.

pickle.load(path)

사용되었기 때문에 저는 그것을 교체했습니다.

np.load(path, allow_pickle=True)

이 오류는 Torchvision==0.7.0이 설치된 1.6.0과 같은 이전 버전의 토치를 사용하는 경우에 발생합니다. 다음 명령을 통해 토치 버전을 확인할 수 있습니다.

import tensorflow
print(tensorflow.__version__)

이 오류는 최신 버전의 토치에서 이미 해결되었습니다.

np.load에서 다음과 같은 변경을 통해 이 오류를 제거할 수 있습니다.

np.load(somepath, allow_pickle=True)

allow_pickle=진실은 그것을 해결할 것입니다.

[Fast Solution] np.load를 호출할 때 "allow_pickle"을 수정하여 작업했습니다.

레이블 = np.load("라벨",allow_pickle=True )

여러 가지 답변이 있지만, 문제를 제대로 이해하려면 다음과 같은 간단한 예를 사용하는 것이 좋습니다.

a=np.array([[1, 2, 3], [4, 5, 6]])
# Object array
b={'data':'somet',
   'data_2':'defin'}
#Save arrays into file
np.savez('/content/123.npz', a=a, b=b)
#Load file into data variable
data = np.load('/content/123.npz')
print(data['b'])

이 간단한 예제는 이미 오류를 재현합니다.문제는 당신이 사전을 npz로 직렬화했다는 것입니다.

이제 다음과 같이 np.load로 줄 바꾸기만 하면 됩니다.

data = np.load('/content/123.npz',allow_pickle=True)

효과가 있습니다!예제 소스: allow_pickle=False인 경우 수정 개체 배열을 로드할 수 없습니다.

npz 형식과 같은 압축 스토리지 파일을 로드하는 경우 아래 코드가 좋습니다.

np.load(path, allow_pickle=True)

경로를 지정하는 동안 경로를 작은 따옴표로 둘러싸야 합니다.allow_pickle = True어떤 인용문에도 없어야 합니다.

네, 이전 버전의 numpy를 설치하면 문제가 해결되었습니다.

PyCharm IDE를 사용하는 사용자의 경우

내 IDE(Pycharm)에서 파일->설정->프로젝트 인터프리터:저는 제 번호가 1.16.3이라는 것을 알았기 때문에 다시 1.16.1로 돌아갑니다.+를 클릭하고 검색에 numpy를 입력한 다음 "specify version" : 1.16.1을 선택하고 --> install package를 선택합니다.

저는 이런 글을 잘 안 올리는데 너무 짜증이 났어요.이 혼란은 케라스의 일부가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)

가장 쉬운 방법은 변화하는 것입니다.imdb.py세팅allow_pickle=True로.np.load의 선에서imdb.py오류가 발생합니다.

저도 같은 문제에 직면해 있었습니다. 여기 오류에서 나온 라인이 있습니다.

File "/usr/lib/python3/dist-packages/numpy/lib/npyio.py", line 260, in __getitem__

그래서 "npyio.py " 파일을 업데이트하여 문제를 해결합니다.인피오.py 라인 196 allow_pickle에 값을 할당하여 이 라인을 업데이트합니다.

self.allow_pickle = True

대신에

from keras.datasets import imdb

사용하다

from tensorflow.keras.datasets import imdb

top_words = 10000
((x_train, y_train), (x_test, y_test)) = imdb.load_data(num_words=top_words, seed=21)

Tensorflow는 tf-nightly 버전에 고정되어 있습니다.

!pip install tf-nightly

현재 버전은 '2.0.0-dev20190511'입니다.

이 코드 라인을 변경하는 것이 저에게 효과가 있었고 오류를 해결했습니다.

data_patches = np.load(data_path, encoding='latin1', allow_pickle=True).항목()

Numpy 모듈을 제대로 가져왔는지 확인합니다.사용되지 않는 버전을 대체할 것입니다.

언급URL : https://stackoverflow.com/questions/55890813/how-to-fix-object-arrays-cannot-be-loaded-when-allow-pickle-false-for-imdb-loa