Estou tentando implementar o exemplo de classificação binária usando o conjunto de dados IMDb no Google Colab . Eu implementei esse modelo antes. Mas quando tentei fazer isso novamente após alguns dias, ele retornou um erro de valor: 'Matrizes de objetos não podem ser carregadas quando allow_pickle = False' para a função load_data ().
Já tentei resolver isso, referindo-se a uma resposta existente para um problema semelhante: Como corrigir 'Arrays de objetos não podem ser carregados quando allow_pickle = False' no algoritmo sketch_rnn Mas descobri que apenas adicionar um argumento allow_pickle não é suficiente.
Meu código:
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
O erro:
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
np.load(path)
, agora énp.load(path, boolean)
Por padrão, o booleano (allow_pickle) é falsonp.savez
documentos, mas não havia nenhuma referência a decapagem, então não tenho ideia de como ele sabia em primeiro lugar que as coisas que eu estava salvando eram coisas do Pytorch e não apenas entorpecidas ... estranho! Se você sabe o que está acontecendo, compartilhe conosco :)Respostas:
Aqui está um truque para forçar
imdb.load_data
para permitir picles, em seu caderno, substituindo esta linha:por este:
fonte
TypeError: <lambda>() got multiple values for keyword argument 'allow_pickle'
Este problema ainda está em jogo no keras git. Espero que seja resolvido o mais rápido possível. Até então, tente fazer o downgrade de sua versão numpy para 1.16.2. Parece resolver o problema.
Esta versão do numpy tem o valor padrão de
allow_pickle
asTrue
.fonte
Seguindo esse problema no GitHub, a solução oficial é editar o arquivo imdb.py. Essa correção funcionou bem para mim sem a necessidade de fazer o downgrade do numpy. Encontre o arquivo imdb.py em
tensorflow/python/keras/datasets/imdb.py
(o caminho completo para mim era:C:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py
- outras instalações serão diferentes) e altere a linha 85 de acordo com o diff:O motivo da mudança é a segurança para evitar o equivalente em Python de uma injeção de SQL em um arquivo em conserva. A mudança acima SOMENTE afetará os dados imdb e, portanto, você manterá a segurança em outro lugar (sem rebaixar o numpy).
fonte
Acabei de usar allow_pickle = True como um argumento para np.load () e funcionou para mim.
fonte
No meu caso trabalhei com:
fonte
Acho que a resposta de cheez ( https://stackoverflow.com/users/122933/cheez ) é a mais fácil e eficaz. Eu elaboraria um pouco sobre isso para não modificar uma função numpy durante todo o período da sessão.
Minha sugestão está abaixo. Estou usando para baixar o conjunto de dados reuters do keras, que está apresentando o mesmo tipo de erro:
fonte
Você pode tentar alterar o valor do sinalizador
fonte
nenhuma das soluções listadas acima funcionou para mim: eu executo o anaconda com o python 3.7.3. O que funcionou para mim foi
execute "conda install numpy == 1.16.1" do Anaconda PowerShell
feche e reabra o bloco de notas
fonte
allow_pickle=True
é o valor padrão.no notebook jupyter usando
funcionou bem, mas o problema aparece quando você usa esse método no spyder (você precisa reiniciar o kernel todas as vezes ou obterá um erro como:
Resolvi esse problema usando a solução aqui :
fonte
Aterrissei aqui, tentei seus caminhos e não consegui descobrir.
Na verdade, eu estava trabalhando em um código pré-determinado onde
foi usado, então eu o substituí por
fonte
Sim, instalar uma versão anterior do numpy resolveu o problema.
Para quem usa PyCharm IDE:
em meu IDE (Pycharm), Arquivo-> Configurações-> Intérprete do projeto: Eu descobri que meu numpy era 1.16.3, então volto para 1.16.1. Clique em + e digite numpy na pesquisa, marque "especificar versão": 1.16.1 e escolha -> instalar pacote.
fonte
encontre o caminho para imdb.py e, em seguida, adicione o sinalizador a np.load (caminho, ... sinalizador ...)
fonte
É trabalho para mim
fonte
O que descobri é que o TensorFlow 2.0 (estou usando 2.0.0-alpha0) não é compatível com a versão mais recente do Numpy, ou seja, v1.17.0 (e possivelmente v1.16.5 +). Assim que o TF2 é importado, ele lança uma lista enorme de FutureWarning, que se parece com isto:
Isso também resultou no erro allow_pickle ao tentar carregar o conjunto de dados imdb do keras
Tentei usar a solução a seguir que funcionou bem, mas tive que fazer isso em todos os projetos em que importava TF2 ou tf.keras.
A solução mais fácil que encontrei foi instalar o numpy 1.16.1 globalmente ou usar versões compatíveis do tensorflow e do numpy em um ambiente virtual.
Meu objetivo com esta resposta é apontar que não é apenas um problema com imdb.load_data, mas um problema maior gerado pela incompatibilidade das versões do TF2 e Numpy e pode resultar em muitos outros bugs ou problemas ocultos.
fonte
Tensorflow tem uma correção na versão tf-nightly.
A versão atual é '2.0.0-dev20190511'.
fonte
A resposta de @cheez às vezes não funciona e chama a função recursivamente novamente e novamente. Para resolver este problema, você deve copiar a função profundamente. Você pode fazer isso usando a função
partial
, então o código final é:fonte
Eu não costumo postar nessas coisas, mas isso era super irritante. A confusão vem do fato de que alguns dos
imdb.py
arquivos Keras já foram atualizados:para a versão com
allow_pickle=True
. Certifique-se de verificar o arquivo imdb.py para ver se essa alteração já foi implementada. Se tiver sido ajustado, o seguinte funciona bem:fonte
A maneira mais fácil é alterar a
imdb.py
configuraçãoallow_pickle=True
paranp.load
a linha em queimdb.py
lança o erro.fonte