keras.datasets.imdb.load_data() に 'Object arrays cannot be loaded when allow_pickle=False' で失敗する.

Tensorflow tutorials の「映画レビューのテキスト分類」(https://www.tensorflow.org/tutorials/keras/basic_text_classification) にて、データセットのロードに失敗します。

In [6]: from keras.datasets import imdb
In [7]: (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-7d41db3a3caa> in <module>
----> 1 imdb.load_data(num_words=10)

/anaconda3/envs/py36_base/lib/python3.6/site-packages/tensorflow/python/keras/datasets/imdb.py in load_data(path, num_words, skip_top, maxlen, seed, start_char, oov_char, index_from, **kwargs)
     84       file_hash='599dadb1135973df5b59232a0e9a887c')
     85   with np.load(path) as f:
---> 86     x_train, labels_train = f['x_train'], f['y_train']
     87     x_test, labels_test = f['x_test'], f['y_test']
     88

/anaconda3/envs/py36_base/lib/python3.6/site-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)

/anaconda3/envs/py36_base/lib/python3.6/site-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

これは numpy のバージョンに依存するエラーで、numpy=1.16.3 から、read_array(fp, allow_pickle, pickle_kwargs) の allow_pickle のデフォルト値が False に変更されたことに起因しています。

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

$ conda list
...
numpy                     1.16.3           py36hacdab7b_0
numpy-base                1.16.3           py36h6575580_0
...

ここで示される解決方法は単純に numpy=1.16.2 にダウングレードすることです。

$ conda install numpy=1.16.2

$ conda list | grep numpy
...
numpy                     1.16.2
numpy-base                1.16.2
...

動作を確認しました。

In [5]: imdb.load_data(num_words=1)
Out[5]:
((array([list([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
...

ちなみに、colab では以下のコードが挿入されており、tf のバージョンを変えることで対応しています。 nightly build では修正されているようですので次のバージョンでは解消されるはずです。

# keras.datasets.imdb is broken in 1.13 and 1.14, by np 1.16.3
# (nightly build は最新バージョンのビルド)
!pip install tf_nightly