Próbuję zaimplementować przykład klasyfikacji binarnej przy użyciu zestawu danych IMDb w Google Colab . Wdrożyłem ten model już wcześniej. Ale kiedy próbowałem to zrobić ponownie po kilku dniach, zwróciło to błąd wartości: „Nie można załadować tablic obiektów, gdy allow_pickle = False” dla funkcji load_data ().
Próbowałem już to rozwiązać, odnosząc się do istniejącej odpowiedzi na podobny problem: Jak naprawić `` Tablice obiektów nie mogą być załadowane, gdy allow_pickle = False '' w algorytmie sketch_rnn Okazuje się, że samo dodanie argumentu allow_pickle nie jest wystarczające.
Mój kod:
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
Błąd:
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)
, teraz jestnp.load(path, boolean)
Domyślnie, wartość logiczna (allow_pickle) ma wartość falsenp.savez
doktorów, ale nie było żadnego odniesienia do marynowania, więc nie mam pojęcia, skąd w ogóle wiedziałem, że rzeczy, które oszczędzałem, to rzeczy Pytorch i nie tylko nudne ... dziwne! Jeśli wiesz, co się dzieje, podziel się z nami :)Odpowiedzi:
Oto sztuczka, którą można wymusić,
imdb.load_data
aby zezwolić na marynowanie w notatniku, zastępując tę linię:przez to:
źródło
TypeError: <lambda>() got multiple values for keyword argument 'allow_pickle'
Ten problem nadal występuje w keras git. Mam nadzieję, że zostanie rozwiązany tak szybko, jak to możliwe. Do tego czasu spróbuj obniżyć wersję numpy do 1.16.2. Wydaje się, że rozwiązuje problem.
Ta wersja numpy ma domyślną wartość
allow_pickle
asTrue
.źródło
W następstwie tego problemu na GitHub, oficjalnym rozwiązaniem jest edycja pliku imdb.py. Ta poprawka działała dobrze dla mnie bez konieczności obniżania wersji Numpy. Znajdź plik imdb.py pod adresem
tensorflow/python/keras/datasets/imdb.py
(pełna ścieżka dla mnie brzmiała:C:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py
- inne instalacje będą inne) i zmień wiersz 85 zgodnie z różnicą:Przyczyną tej zmiany jest ochrona przed stosowaniem w Pythonie odpowiednika iniekcji SQL w piklowanym pliku. Powyższa zmiana wpłynie TYLKO na dane imdb i dlatego zachowasz bezpieczeństwo w innym miejscu (nie obniżając wartości numpy).
źródło
Właśnie użyłem allow_pickle = True jako argument do np.load () i to zadziałało.
źródło
W moim przypadku pracował z:
źródło
Myślę, że odpowiedź z cheez ( https://stackoverflow.com/users/122933/cheez ) jest najłatwiejsza i najskuteczniejsza. Omówiłbym go trochę, aby nie modyfikował funkcji numpy przez cały okres sesji.
Moja sugestia jest poniżej. Używam go do pobrania zestawu danych firmy Reuters z keras, który pokazuje ten sam rodzaj błędu:
źródło
Możesz spróbować zmienić wartość flagi
źródło
żadne z wyżej wymienionych rozwiązań nie działało dla mnie: uruchamiam Anacondę z Pythonem 3.7.3. Dla mnie zadziałało
uruchom „conda install numpy == 1.16.1” z programu Anaconda powershell
zamknij i ponownie otwórz notatnik
źródło
allow_pickle=True
jest wartością domyślną.na notebooku jupyter za pomocą
działało dobrze, ale problem pojawia się, gdy używasz tej metody w spyder (musisz za każdym razem restartować jądro lub pojawi się błąd taki jak:
Rozwiązałem ten problem, korzystając z rozwiązania tutaj :
źródło
Wylądowałem tutaj, wypróbowałem twoje sposoby i nie mogłem tego rozgryźć.
Właściwie pracowałem nad wcześniej podanym kodem, w którym
był używany, więc zastąpiłem go
źródło
Tak, zainstalowanie poprzedniej wersji numpy rozwiązało problem.
Dla tych, którzy używają PyCharm IDE:
w moim IDE (Pycharm), File-> Settings-> Project Interpreter: Okazało się, że mój numpy to 1.16.3, więc wracam do 1.16.1. Kliknij + i wpisz numpy w wyszukiwaniu, zaznacz "Określ wersję": 1.16.1 i wybierz -> zainstaluj pakiet.
źródło
znajdź ścieżkę do imdb.py, a następnie po prostu dodaj flagę do np.load (ścieżka, ... flaga ...)
źródło
To dla mnie praca
źródło
Odkryłem, że TensorFlow 2.0 (używam 2.0.0-alpha0) nie jest kompatybilny z najnowszą wersją Numpy tj. V1.17.0 (i prawdopodobnie v1.16.5 +). Zaraz po zaimportowaniu TF2 wyświetla ogromną listę FutureWarning, która wygląda mniej więcej tak:
Spowodowało to również błąd allow_pickle podczas próby załadowania zestawu danych imdb z keras
Próbowałem użyć następującego rozwiązania, które działało dobrze, ale musiałem to robić w każdym projekcie, w którym importowałem TF2 lub tf.keras.
Najłatwiejszym rozwiązaniem, które znalazłem, było zainstalowanie numpy 1.16.1 globalnie lub użycie kompatybilnych wersji tensorflow i numpy w środowisku wirtualnym.
Moim celem w tej odpowiedzi jest wskazanie, że nie jest to tylko problem z imdb.load_data, ale większy problem wynikający z niekompatybilności wersji TF2 i Numpy i może powodować wiele innych ukrytych błędów lub problemów.
źródło
Tensorflow ma poprawkę w wersji tf-nightly.
Aktualna wersja to „2.0.0-dev20190511”.
źródło
Odpowiedź @cheez kiedyś nie działa rekursywnie i ponownie i ponownie wywołać funkcję. Aby rozwiązać ten problem, należy głęboko skopiować funkcję. Możesz to zrobić za pomocą funkcji
partial
, więc ostateczny kod to:źródło
Zwykle nie publikuję w tych sprawach, ale to było bardzo irytujące. Zamieszanie wynika z faktu, że niektóre
imdb.py
pliki Keras zostały już zaktualizowane:do wersji z
allow_pickle=True
. Upewnij się, że sprawdź plik imdb.py, aby zobaczyć, czy ta zmiana została już zaimplementowana. Jeśli zostało wyregulowane, działa dobrze:źródło
Najłatwiej jest zmienić
imdb.py
ustawienieallow_pickle=True
nanp.load
w linii, w którejimdb.py
generuje błąd.źródło