Imdb.load_data () फ़ंक्शन के लिए allow_pickle = False के दौरान 'ऑब्जेक्ट सरणियों को कैसे लोड किया जा सकता है?'


113

मैं Google Colab में IMDb डेटासेट का उपयोग करके द्विआधारी वर्गीकरण उदाहरण को लागू करने का प्रयास कर रहा हूं । मैंने इस मॉडल को पहले भी लागू किया है। लेकिन जब मैंने कुछ दिनों के बाद इसे फिर से करने की कोशिश की, तो यह एक मूल्य त्रुटि लौटाया: load_data () फ़ंक्शन के लिए allow_pickle = False के समय 'ऑब्जेक्ट सरणियों को लोड नहीं किया जा सकता है।

मैंने पहले ही इसे हल करने की कोशिश की है, इसी तरह की समस्या के लिए मौजूदा जवाब का जिक्र करते हुए: स्केच_आरएन एल्गोरिथ्म में allow_pickle = False के 'ऑब्जेक्ट एरेज़' को कैसे ठीक किया जा सकता है, इसे ठीक नहीं किया जा सकता, लेकिन यह पता चलता है कि सिर्फ एक allow_ickle तर्क जोड़ना पर्याप्त नहीं है।

मेरा कोड:

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
इस त्रुटि का मतलब क्या है?
चार्ली पार्कर

3
@CharlieParker जाहिरा तौर पर numpy.load () फ़ंक्शन में एक पैरामीटर के अतिरिक्त है। पहले यह था np.load(path), अब यह np.load(path, boolean)डिफ़ॉल्ट रूप से है, बूलियन (allow_pickle) झूठा है
कणाद

धन्यवाद! लेकिन क्या इसका मतलब यह है कि सुन्न अब बचत के दौरान मेरी अनुमति के बिना मेरे लिए चीजें चुनता है ?! अजीब! मैंने np.savezडॉक्स को देखा, लेकिन अचार का कोई संदर्भ नहीं था, इसलिए मुझे नहीं पता कि यह पहली बार में भी कैसे पता चला कि मैं जिन चीजों को सहेज रहा था, वे पॉइटोरच सामान थे और न केवल सुन्न ... अजीब! यदि आप जानते हैं कि हमारे साथ क्या चल रहा है :)
चार्ली पार्कर

एक ही समस्या में चलाने के बाद मेरा विश्वास यह है कि यह पूरी तरह से इस बात पर निर्भर करता है कि आप एक .npz में क्या बचत कर रहे हैं। यदि आप अंतर्निहित प्रकारों की बचत कर रहे हैं, तो कोई अचार नहीं। हालांकि, यदि आप एक वस्तु लिखते हैं तो अजगर / सुन्न इसे अचार करेगा (यानी इसे क्रमबद्ध करें)। मुझे लगता है कि यह एक सुरक्षा जोखिम को खोलता है, इसलिए बाद में सुन्न के संस्करणों ने इसे डिफ़ॉल्ट होने की अनुमति दी ... बस एक कूबड़ हालांकि।
रॉबर्ट लैग

जवाबों:


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

मैं शुरुआत में "इम्पोर्ट न्यूम एज एनपी" जोड़ने का सुझाव देता हूं। नम्पी को एक अलग नाम से आयात किया जा सकता है, या बिल्कुल भी आयात नहीं किया जा सकता ...
क्रिस्टोफ

यह मुझे बहुत मदद करता है
स्टेचर

7
त्रुटि प्राप्त करनाTypeError: <lambda>() got multiple values for keyword argument 'allow_pickle'
हयात

1
कीवर्ड तर्क के लिए कई मानों की समस्या को stackoverflow.com/a/58586450/5214998
सजाद नॉरोज़ी

91

यह मुद्दा अभी भी केर गेट पर है। मुझे उम्मीद है कि यह जल्द से जल्द हल हो जाएगा। तब तक, अपने संख्यात्मक संस्करण को 1.16.2 तक अपग्रेड करने का प्रयास करें। यह समस्या को हल करने के लिए लगता है।

!pip install numpy==1.16.1
import numpy as np

Numpy के इस संस्करण का डिफ़ॉल्ट मान है allow_pickleके रूप में True


4
मैं डाउनग्रेड सुन्न संस्करण के बजाय MappaGnosis से समाधान का उपयोग करेगा: मेरे लिए संस्करण नृत्य के साथ चारों ओर चक्कर लगाना एक अंतिम उपाय है!
eric

2
1.16.4 के पास यह मुद्दा भी है
केंसई

धन्यवाद @kensai क्या किसी को पता है कि यह सुन्न 1.17 में हल हो गया है?
nsheff

1.18 की संख्या में अभी भी यह समस्या मौजूद है। मुझे 1.16.1 पर स्विच करना पड़ा और यह अब हल हो गया है। धन्यवाद।
बीसी स्मिथ

55

GitHub पर इस मुद्दे के बाद , आधिकारिक समाधान imdb.py फ़ाइल को संपादित करना है। इस फिक्स ने मेरे लिए सुन्नता को कम करने की आवश्यकता के बिना अच्छी तरह से काम किया। Imdb.py फ़ाइल को खोजें tensorflow/python/keras/datasets/imdb.py(मेरे लिए पूर्ण पथ था: C:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py- अन्य इंस्टॉल अलग-अलग होंगे) और लाइन 85 को भिन्न के अनुसार बदलें:

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

परिवर्तन का कारण एक पिकेड फ़ाइल में SQL इंजेक्शन के बराबर पायथन को रोकने के लिए सुरक्षा है। ऊपर दिया गया परिवर्तन केवल imdb डेटा को प्रभावित करेगा और इसलिए आप कहीं और सुरक्षा बनाए रखेंगे (नॉट अपग्रेड करके)।


1
जैसा कि मैंने कहा, मैं कोलाब का उपयोग कर रहा हूं, मैं imdb.py फ़ाइल में परिवर्तन कैसे कर सकता हूं?
कनाड

यह एक Colab मुद्दा नहीं है क्योंकि IMDB स्थानीय रूप से पहली बार डाउनलोड किया जाता है जब आप इसे संदर्भित करते हैं। तो, आपके कंप्यूटर पर कहीं न कहीं एक स्थानीय प्रतिलिपि होगी (ऊपर दिए गए सुझाए गए पथों को आज़माएँ - या, यदि आप कोलाब के लिए एक निर्देशिका सेट करते हैं, तो पहले वहाँ प्रयास करें) और बस किसी भी IDE या यहाँ तक कि एक पाठ संपादक में imdb.py फ़ाइल खोलें परिवर्तन करें (मैं नोटपैड ++ का उपयोग imdb.py फ़ाइल को संपादित करने के लिए किया गया था जो कि जुपिटर में काम करते समय डाउनलोड की गई थी - इसलिए कोलाब के लिए एक बहुत ही समान वातावरण!)।
मप्पाग्नोसिस

मेरे लिए काम करने वाला समाधान है> np.load (data_path, एन्कोडिंग = 'latin1', allow_pickle = True)
जॉर्ज सेंटोस नील

यह वह समाधान है जिसका उपयोग मैं संस्करणों के साथ गड़बड़ कर रहा हूं (विशेष रूप से सुन्न), जैसा कि स्वीकृत उत्तर में है, कुछ ऐसा है जिससे मैं बचने की कोशिश करता हूं। यह भी अधिक pythonic है क्योंकि यह स्पष्ट रूप से समस्या को ठीक करता है। (यह भी ध्यान रखें Keras के नवीनतम संस्करण, GitHub पर, वास्तव में यह सुधार शामिल)
eric

35

मैं सिर्फ np.load () के तर्क के रूप में allow_pickle = True का उपयोग करता हूं और यह मेरे लिए काम करता है।


मैं देख रहा हूँ कि अचार को सरणी में बदलाव की अनुमति है। सहेजने से पहले और बाद में लोड होने के बाद .npy सरणी np.array_equal का उपयोग करते हुए समानता के लिए प्रयास करने के लिए एक अपवाद है
yasht

18

मेरे मामले में साथ काम किया:

np.load(path, allow_pickle=True)

12

मुझे लगता है कि cheez ( https://stackoverflow.com/users/122933/cheez ) का उत्तर सबसे आसान और सबसे प्रभावी है। मैं इसके बारे में थोड़ा विस्तार करूंगा ताकि यह पूरे सत्र की अवधि के लिए एक संख्यात्मक कार्य को संशोधित न करे।

मेरा सुझाव नीचे है। मैं इसका उपयोग केरेस से रॉयटर्स डेटासेट को डाउनलोड करने के लिए कर रहा हूँ जो एक ही तरह की त्रुटि दिखा रहा है:

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
मैं केरस डेटासेट लोड नहीं कर पा रहा था। मैंने इंटरनेट पर खोज की और एक समाधान पाया जिसमें कहा गया था कि मुझे डी imdb.py फ़ाइल को संपादित करना चाहिए, अन्य लोगों ने संख्यात्मक स्थापना (जैसे यहां) में परिवर्तन या एक विकास संस्करण में टेंसरफ़्लो को बदलने के लिए कहा। मैं चेज समाधान के दौरान आया था। IMHO जो सबसे आसान और सबसे प्रभावी था।
गुस्तावो मिरपाल्टा

1
@ कणाद - लंबोदर एक अनाम कार्य है। गुस्तावो ने np.load के लिए एक फ़ंक्शन-वृद्धि बनाई, संवर्धित संस्करण का उपयोग किया, फिर डिफ़ॉल्ट मान पर वापस सेट करें।
EngrStudent


4

उपर्युक्त सूचीबद्ध समाधानों में से कोई भी मेरे लिए काम नहीं करता है: मैं एंथोडा को अजगर 3.7.3 के साथ चलाता हूं। मेरे लिए क्या काम था

  • एनाकोंडा पॉवरशेल से "conda install numpy == 1.16.1" चलाएं

  • नोटबुक को बंद करें और फिर से खोलें


धन्यवाद, यही मैंने खोजा था। वैसे, यह 1.16.2 का नवीनतम संस्करण है, जहां allow_pickle=Trueडिफ़ॉल्ट मान है।
मटोज राकिन्स्की 21

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

मैं यहाँ उतरा, अपने तरीके आज़माए और यह पता नहीं लगा सका।

मैं वास्तव में जहां एक pregiven कोड पर काम कर रहा था

pickle.load(path)

इस्तेमाल किया गया था इसलिए मैंने इसे बदल दिया

np.load(path, allow_pickle=True)

2

हां, पिछले अंक के एक संस्करण को स्थापित करने से समस्या हल हो गई।

उन लोगों के लिए जो PyCharm IDE का उपयोग करते हैं:

मेरे IDE (Pycharm), फ़ाइल-> सेटिंग्स-> प्रोजेक्ट इंटरप्रेटर में: मुझे मेरी संख्या ३.१.३ होने की संभावना है, इसलिए मैं १.१.११ पर वापस लौटता हूं। + पर क्लिक करें और खोज में सुन्न टाइप करें, "निर्दिष्ट संस्करण" पर टिक करें: 1.16.1 और चुनें -> पैकेज स्थापित करें।


2

imdb.py तो बस झंडा जोड़ने के लिए np.load (पथ, ... झंडा ...)

    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-अल्फा 0 का उपयोग कर रहा हूं) 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)

मैंने पाया सबसे आसान समाधान या तो विश्व स्तर पर 1.16.1 स्थापित किया गया था, या आभासी वातावरण में टेंसोफ़्लो और सुन्न के संगत संस्करणों का उपयोग किया गया था।

इस उत्तर के साथ मेरा लक्ष्य यह इंगित करना है कि इसकी न केवल 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

मैं आमतौर पर इन चीजों के लिए पोस्ट नहीं करता, लेकिन यह सुपर कष्टप्रद था। भ्रम इस तथ्य से आता है कि कुछ केरेस 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)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.