Как исправить 'объектные массивы не могут быть загружены, когда allow_pickle = False' для функции imdb.load_data()?
Я пытаюсь реализовать пример двоичной классификации, используя набор данных IMDb в Google Colab. Я реализовал эту модель раньше. Но когда я попытался сделать это снова через несколько дней, он вернул ошибку значения: "Объектные массивы не могут быть загружены, когда allow_pickle = False" для функции load_data().
Я уже пытался решить эту проблему, ссылаясь на существующий ответ для аналогичной проблемы: как исправить "объектные массивы не могут быть загружены, когда allow_pickle = False" в алгоритме sketch_rnn, но оказывается, что простого добавления аргумента 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
Вот трюк, чтобы заставить 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
Ответ 2
Эта проблема до сих пор не решена. Я надеюсь, что это будет решено как можно скорее. А пока попробуйте понизить версию до 1.16.2. Кажется, чтобы решить проблему.
!pip install numpy==1.16.1
import numpy as np
Эта версия numpy имеет значение по умолчанию allow_pickle
как True
.
Ответ 3
После этой проблемы на GitHub официальным решением является редактирование файла imdb.py. Это исправление работало хорошо для меня без необходимости понижать версию numpy. Найдите файл imdb.py по адресу tensorflow/python/keras/datasets/imdb.py
(полный путь для меня был: C:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py
- другие установки будет другим) и измените строку 85 согласно diff:
- with np.load(path) as f:
+ with np.load(path, allow_pickle=True) as f:
Причиной изменения является безопасность для предотвращения Python-эквивалента SQL-инъекции в маринованном файле. Вышеуказанное изменение повлияет ТОЛЬКО на данные IMDB, и поэтому вы сохраняете безопасность в другом месте (не понижая NumPy).
Ответ 4
Я просто использовал allow_pickle = True в качестве аргумента для np.load(), и это сработало для меня.
Ответ 5
Я думаю, что ответ от Cheez (https://stackoverflow.com/users/122933/cheez) является самым простым и эффективным. Я бы немного уточнил это, чтобы он не изменял функцию numpy в течение всего периода сеанса.
Мое предложение ниже. Я использую его для загрузки набора данных Reuters из Keras, который показывает такую же ошибку:
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)
Ответ 6
Вы можете попробовать изменить значение флага
np.load(training_image_names_array,allow_pickle=True)
Ответ 7
Да, установка предыдущей версии numpy решила проблему.
Для тех, кто использует PyCharm IDE:
в моей IDE (Pycharm), File-> Настройки-> Интерпретатор проекта: я обнаружил, что мой numpy равен 1.16.3, поэтому я возвращаюсь обратно к 1.16.1. Нажмите + и введите numpy в поиске, отметьте "указать версию": 1.16.1 и choose--> установить пакет.
Ответ 8
В Tensorflow исправлена ночная версия.
!pip install tf-nightly
Текущая версия - 2.0.0-dev20190511.
Ответ 9
Я обнаружил, что 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'.
Это также привело к ошибке allow_pickle при попытке загрузить набор данных imdb из keras
Я попытался использовать следующее решение, которое работало просто отлично, но мне приходилось делать это каждый проект, в который я импортировал TF2 или tf.keras.
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)
Самым простым решением, которое я нашел, было либо установить numpy 1.16.1 глобально, либо использовать совместимые версии tenorflow и numpy в виртуальной среде.
Моя цель в этом ответе состоит в том, чтобы указать, что это не просто проблема с imdb.load_data, а более серьезная проблема, вызванная несовместимостью версий TF2 и Numpy, которая может привести ко многим другим скрытым ошибкам или проблемам.
Ответ 10
найдите путь к imdb.py, затем просто добавьте флаг в np.load (путь,... флаг...)
def load_data(.......):
.......................................
.......................................
- with np.load(path) as f:
+ with np.load(path,allow_pickle=True) as f:
Ответ 11
на ноутбуке 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)
работал нормально, но проблема возникает, когда вы используете этот метод в spyder (вам придется каждый раз перезагружать ядро, иначе вы получите сообщение об ошибке:
TypeError:() получил несколько значений для ключевого аргумента allow_pickle
Я решил эту проблему, используя решение здесь:
Ответ 12
Его работа для меня
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
Ответ 13
Ни одно из перечисленных выше решений не помогло мне: я запускаю anaconda с python 3.7.3.
То, что сработало для нас, было