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
'programing' 카테고리의 다른 글
HTML 특수 문자를 제거하는 방법은 무엇입니까? (0) | 2023.07.24 |
---|---|
.용 오라클 데이터 공급자.NET: 연결 요청 시간이 초과되었습니다. (0) | 2023.07.24 |
모수 크기의 인수로 고정 장치를 사용한 파이 검정 (0) | 2023.07.24 |
Android Facebook 스타일 슬라이드 (0) | 2023.07.24 |
윈도우즈에서 node.js 모듈의 기본 글로벌 설치 디렉토리를 변경하시겠습니까? (0) | 2023.07.24 |