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


113

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

1
이 오류는 무엇을 의미합니까?
Charlie Parker

3
@CharlieParker 분명히 numpy.load () 함수에 매개 변수가 추가되었습니다. 이전에는 그것이 np.load(path)지금이야, np.load(path, boolean)기본적으로 부울 (allow_pickle)은 거짓
Kanad

감사! 그러나 그것은 numpy가 이제 저장할 때 내 허락없이 나를 위해 물건을 피클한다는 의미입니까?! 기묘한! 나는 np.savez문서를 보았지만 산세에 대한 언급이 없었기 때문에 내가 저장하고 있던 것이 Pytorch 물건이었고 numpy ... 이상하다는 것을 처음부터 어떻게 알았는지 모르겠습니다! 당신은 : 우리와 함께 공유에가는 무슨 알고 있다면
찰리 파커 (Charlie Parker)

같은 문제에 직면 한 후 내 믿음 은 .npz에 저장하는 내용에 전적으로 달려 있다는 것 입니다. 내장 유형을 저장하는 경우 산 세척이 없습니다. 그러나 객체를 작성하면 python / numpy가이를 피클합니다 (즉, 직렬화). 이것은 보안 위험을 열 것이라고 생각하므로 이후 버전의 numpy는 기본값이되는 것을 중지했습니다.
Robert Lugg

답변:


123

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

처음에 "import numpy as np"를 추가하는 것이 좋습니다. NumPy와는 ... 전혀 수입 다른 이름으로 수입 여부 될 수 있습니다
크리스토프

그것은 나에게 많은 도움이
staticor

7
오류 받기TypeError: <lambda>() got multiple values for keyword argument 'allow_pickle'
Hayat

1
키워드 인수에 대해 여러 값이되었습니다의 문제에서 해결 stackoverflow.com/a/58586450/5214998
사 야드 노로 우지에게

91

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

!pip install numpy==1.16.1
import numpy as np

이 numpy 버전의 기본값 allow_pickleTrue.


4
numpy 버전을 다운 그레이드하는 대신 MappaGnosis의 솔루션을 사용합니다. 버전 댄스를 사용하는 것은 최후의 수단입니다!
eric

2
1.16.4뿐만 아니라 문제를 가지고
kensai

감사합니다 @kensai. 이것이 numpy 1.17에서 해결되었는지 아는 사람이 있습니까?
nsheff

numpy 1.18에서는 여전히이 문제가 있습니다. 나는 numpy 1.16.1로 전환해야했고 지금 해결되었습니다. 감사합니다.
BC Smith

55

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를 다운 그레이드하지 않음).


1
내가 말했듯이 Colab을 사용하고 있는데 imdb.py 파일을 어떻게 변경할 수 있습니까?
Kanad

IMDB는 처음 참조 할 때 로컬로 다운로드되므로 Colab 문제가 아닙니다. 따라서 컴퓨터 어딘가에 로컬 복사본이있을 것입니다 (위의 제안 된 경로를 시도하거나 Colab에 대한 디렉토리를 설정 한 경우 먼저 시도). IDE 또는 텍스트 편집기에서 imdb.py 파일을 열어 변경하십시오 (Jupyter에서 작업 할 때 다운로드 한 imdb.py 파일을 편집하기 위해 Notepad ++를 사용했습니다-Colab과 매우 유사한 환경!).
MappaGnosis

나를 위해 작동하는 솔루션은> np.load (data_path, encoding = 'latin1', allow_pickle = True)
Jorge Santos Neill

이것은 내가 사용하는 해결책으로, 허용되는 대답에서와 같이 버전 (특히 numpy)을 엉망으로 만드는 것은 피하려고하는 것입니다. 이것은 또한 문제를 명시 적으로 수정하기 때문에 더 비단뱀 적입니다. (또한 github에있는 최신 버전의 Keras에도이 수정 사항이 포함되어 있습니다.)
eric

35

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


피클을 허용하면 배열이 변경되는 것을 관찰하고 있습니다. 저장 전과로드 후 .npy 배열은 np.array_equal을 사용하여 동등성을 주장하려고 할 때 예외를 발생시킵니다
yasht

18

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

np.load(path, allow_pickle=True)

12

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)

여기서 무슨 일이 일어나고 있는지 자세히 설명해 주시겠습니까?
Kanad

1
Keras 데이터 세트를로드 할 수 없습니다. 나는 인터넷을 검색하고 imdb.py 파일을 편집해야한다는 해결책을 찾았고, 다른 사람들은 numpy 설치 (여기와 같은)의 변경 사항을 지적했거나 Tensorflow를 개발 버전으로 변경했습니다. 나는 치즈 솔루션을 발견했습니다. 가장 쉽고 효과적인 IMHO.
Gustavo Mirapalheta

1
@Kanad-람다는 익명의 함수입니다. Gustavo는 np.load에 대한 기능 보강을 생성하고 보강 된 버전을 사용한 다음 기본값으로 다시 설정합니다.
EngrStudent


4

위에 나열된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 나는 파이썬 3.7.3으로 아나콘다를 실행합니다. 나를 위해 일한 것은

  • Anaconda powershell에서 "conda install numpy == 1.16.1"실행

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


감사합니다. 제가 검색 한 내용입니다. 그건 그렇고, 1.16.2 allow_pickle=True가 기본값 인 최신 버전 인 것처럼 보입니다 .
Matěj Račinský

3

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)

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

TypeError : () 키워드 인수 'allow_pickle'에 여러 값이 있습니다.

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


3

나는 여기에 착륙하여 당신의 길을 시도했지만 알아낼 수 없었습니다.

저는 실제로 미리 만들어진 코드를 작업하고있었습니다.

pickle.load(path)

그래서 나는 그것을 대체했다

np.load(path, allow_pickle=True)

2

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

PyCharm IDE를 사용하는 경우 :

내 IDE (Pycharm), File-> Settings-> Project Interpreter : numpy가 1.16.3 인 것을 알았으므로 1.16.1로 되돌립니다. +를 클릭하고 검색에 numpy를 입력하고 "specify version": 1.16.1을 선택한 다음 패키지 설치를 선택합니다.


2

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

나를위한 일

        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

4
솔루션이 작동하는 이유를 설명하는 몇 가지 컨텍스트. (검토에서).
ZF007

1

내가 찾은 사실은 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 버전의 비 호환성으로 인해 더 큰 문제가 발생하고 다른 많은 숨겨진 버그 또는 문제가 발생할 수 있음을 지적하는 것입니다.


0

Tensorflow는 tf-nightly 버전에서 수정되었습니다.

!pip install tf-nightly

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


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

나는 보통 이런 것들에 게시하지 않지만 이것은 매우 성가신 일이었습니다. 혼란은 일부 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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.