Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00023 005329 19042171 na godz. na dobę w sumie
Deep Learning. Praca z językiem Python i biblioteką Keras - książka
Deep Learning. Praca z językiem Python i biblioteką Keras - książka
Autor: Liczba stron: 368
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-4778-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> python - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

W skrócie uczenie maszynowe polega na wyodrębnianiu informacji z surowych danych i budowie modelu, który służy do przetwarzania kolejnych surowych danych. Technologia ta od kilku lat intensywnie się rozwija, a w miarę wzrostu jej możliwości rosną również zainteresowanie i oczekiwania architektów i użytkowników. Niektórzy widzą w głębokim uczeniu poważne zagrożenie, jednak obietnice, jakie daje ten rodzaj sztucznej inteligencji, są fascynujące. Narzędzia służące do programowania uczenia maszynowego, takie jak zaimplementowana w Pythonie biblioteka Keras, są dostępne dla każdego, kto chce wykorzystać tę technologię do własnych celów.

Niniejsza książka jest praktycznym przewodnikiem po uczeniu głębokim. Znalazły się tu dokładne informacje o istocie uczenia głębokiego, o jego zastosowaniach i ograniczeniach. Wyjaśniono zasady rozwiązywania typowych problemów uczenia maszynowego. Pokazano, jak korzystać z pakietu Keras przy implementacji rozpoznawania obrazu, przetwarzania języka naturalnego, klasyfikacji obrazów, przewidywania danych szeregu czasowego, analizy sentymentu, generowania tekstu i obrazu. Nawet dość skomplikowane zagadnienia, włączając w to koncepcje i dobre praktyki, zostały wyjaśnione w sposób bardzo przystępny i zrozumiały, tak aby umożliwić samodzielne stosowanie technik uczenia głębokiego w kolejnych projektach.

W tej książce między innymi:

Uczenie głębokie. Nikt nie zna granic tej technologii!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Deep Learning with Python Tłumaczenie: Konrad Matuk ISBN: 978-83-283-4778-6 Original edition copyright © 2018 by Manning Publications Co. All rights reserved Polish edition copyright © 2019 by HELION SA. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Dodatkowe materiały do książki można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/delepy.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/delepy Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Przedmowa Podziękowania O książce O autorze Spis treści 9 11 13 17 CZĘŚĆ I Rozdział 1. Czym jest uczenie głębokie? 1.1. 1.2. Formy danych umożliwiające uczenie „Głębia” uczenia głębokiego Sztuczna inteligencja, uczenie maszynowe i uczenie głębokie 1.1.1. Sztuczna inteligencja 1.1.2. Uczenie maszynowe 1.1.3. 1.1.4. 1.1.5. Działanie uczenia głębokiego przedstawione na trzech rysunkach 1.1.6. Co dotychczas osiągnięto za pomocą uczenia głębokiego? 1.1.7. Nie wierz w tymczasową popularność 1.1.8. Nadzieje na powstanie sztucznej inteligencji Zanim pojawiło się uczenie głębokie: krótka historia uczenia maszynowego 1.2.1. Modelowanie probabilistyczne 1.2.2. Wczesne sieci neuronowe 1.2.3. Metody jądrowe 1.2.4. Drzewa decyzyjne, lasy losowe i gradientowe wzmacnianie maszyn 1.2.5. Powrót do sieci neuronowych 1.2.6. Co wyróżnia uczenie głębokie? 1.2.7. Współczesne uczenie maszynowe PODSTAWY UCZENIA GŁĘBOKIEGO .......................................... 19 21 22 22 23 24 26 28 29 30 31 32 33 33 33 35 36 36 37 38 38 39 40 41 41 42 43 44 47 47 48 48 1.3.1. Sprzęt 1.3.2. Dane 1.3.3. Algorytmy 1.3.4. Nowa fala inwestycji 1.3.5. Demokratyzacja uczenia głębokiego 1.3.6. Co dalej? 1.3. Dlaczego uczenie głębokie? Dlaczego teraz? Rozdział 2. Matematyczne podstawy sieci neuronowych Pierwszy przykład sieci neuronowej 2.1. 2.2. Reprezentacja danych sieci neuronowych Skalary (tensory zerowymiarowe) 2.2.1. 2.2.2. Wektory (tensory jednowymiarowe) 2.2.3. Macierze (tensory dwuwymiarowe) Poleć książkęKup książkę 4 Spis treści Trójwymiarowe tensory i tensory o większej liczbie wymiarów 2.2.4. 2.2.5. Główne atrybuty 2.2.6. Obsługa tensorów w bibliotece Numpy 2.2.7. Wsad danych 2.2.8. 2.2.9. Dane wektorowe 2.2.10. Dane szeregu czasowego i dane sekwencyjne 2.2.11. Dane w postaci obrazów 2.2.12. Materiały wideo Prawdziwe przykłady tensorów danych 2.3. Koła zębate sieci neuronowych: operacje na tensorach Iloczyn tensorowy Zmiana kształtu tensora 2.3.1. Operacje wykonywane element po elemencie 2.3.2. Rzutowanie 2.3.3. 2.3.4. 2.3.5. Geometryczna interpretacja operacji tensorowych 2.3.6. Interpretacja geometryczna uczenia głębokiego Silnik sieci neuronowych: optymalizacja gradientowa 2.4.1. Czym jest pochodna? 2.4.2. 2.4.3. 2.4.4. Ponowna analiza pierwszego przykładu Pochodna operacji tensorowej: gradient Stochastyczny spadek wzdłuż gradientu Łączenie pochodnych: algorytm propagacji wstecznej 2.4. 2.5. Rozdział 3. Rozpoczynamy korzystanie z sieci neuronowych 3.1. Anatomia sieci neuronowej 3.1.1. Warstwy: podstawowe bloki konstrukcyjne uczenia głębokiego 3.1.2. Modele: sieci warstw 3.1.3. Funkcja straty i optymalizatory: najważniejsze elementy konfiguracji procesu uczenia 3.2. Wprowadzenie do pakietu Keras Praca z pakietem Keras: krótkie wprowadzenie 3.2.1. Keras, TensorFlow, Theano i CNTK 3.2.2. Przygotowanie stacji roboczej do uczenia głębokiego 3.3.1. Notatniki Jupyter: najlepszy sposób na eksperymentowanie z uczeniem 3.3. 3.4. głębokim Jaki procesor graficzny najlepiej nadaje się do uczenia głębokiego? 3.3.2. Dwie opcje uruchamiania pakietu Keras 3.3.3. Wady i zalety uruchamiania uczenia głębokiego w chmurze 3.3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów Zbiór danych IMDB 3.4.1. 3.4.2. Przygotowywanie danych 3.4.3. Budowa sieci neuronowej 3.4.4. Walidacja modelu 3.4.5. Używanie wytrenowanej sieci do generowania przewidywań dotyczących nowych danych 3.4.6. Dalsze eksperymenty 3.4.7. Wnioski 48 49 50 51 51 52 52 53 53 54 54 55 56 59 59 60 61 62 63 64 67 68 71 72 72 74 74 75 76 77 78 79 79 80 80 81 81 82 83 85 89 90 90 Poleć książkęKup książkę Spis treści 5 3.5. 3.6. Zbiór danych Agencji Reutera Przygotowywanie danych Inne sposoby obsługi etykiet i funkcji straty Przykład klasyfikacji wieloklasowej: klasyfikacja krótkich artykułów prasowych 3.5.1. 3.5.2. 3.5.3. Budowanie sieci 3.5.4. Walidacja modelu 3.5.5. Generowanie przewidywań dotyczących nowych danych 3.5.6. 3.5.7. Dlaczego warto tworzyć odpowiednio duże warstwy pośrednie? 3.5.8. Dalsze eksperymenty 3.5.9. Wnioski Przykład regresji: przewidywanie cen mieszkań 3.6.1. 3.6.2. 3.6.3. Budowanie sieci 3.6.4. K-składowa walidacja krzyżowa 3.6.5. Wnioski Zbiór cen mieszkań w Bostonie Przygotowywanie danych Rozdział 4. Podstawy uczenia maszynowego 4.1. Cztery rodzaje uczenia maszynowego 4.1.1. Uczenie nadzorowane 4.1.2. Uczenie nienadzorowane 4.1.3. Uczenie częściowo nadzorowane 4.1.4. Uczenie przez wzmacnianie 4.2. Ocena modeli uczenia maszynowego Zbiory treningowe, walidacyjne i testowe 4.2.1. 4.2.2. Rzeczy, o których warto pamiętać 4.3. Wstępna obróbka danych, przetwarzanie cech i uczenie cech 4.3.1. 4.3.2. Przygotowywanie danych do przetwarzania przez sieci neuronowe Przetwarzanie cech 4.4. Nadmierne dopasowanie i zbyt słabe dopasowanie 4.4.1. Redukcja rozmiaru sieci 4.4.2. Dodawanie regularyzacji wag 4.4.3. Porzucanie — technika dropout 4.5. Uniwersalny przepływ roboczy uczenia maszynowego 4.5.1. Definiowanie problemu i przygotowywanie zbioru danych 4.5.2. Wybór miary sukcesu 4.5.3. Określanie techniki oceny wydajności modelu 4.5.4. 4.5.5. 4.5.6. Przygotowywanie danych Tworzenie modeli lepszych od linii bazowej Skalowanie w górę: tworzenie modelu, który ulega nadmiernemu dopasowaniu 4.5.7. Regularyzacja modelu i dostrajanie jego hiperparametrów 90 91 92 93 94 96 96 97 98 98 98 98 99 100 100 104 107 108 108 108 109 109 109 111 114 114 115 116 118 118 121 123 124 125 126 126 127 127 128 129 CZĘŚĆ II UCZENIE GŁĘBOKIE W PRAKTYCE ......................................... 131 133 Rozdział 5. Uczenie głębokie i przetwarzanie obrazu 134 136 141 5.1.1. Działanie sieci konwolucyjnej 5.1.2. Operacja max-pooling 5.1. Wprowadzenie do konwolucyjnych sieci neuronowych Poleć książkęKup książkę 6 5.2. Spis treści Stosowanie uczenia głębokiego w problemach małych zbiorów danych Pobieranie danych Trenowanie konwolucyjnej sieci neuronowej na małym zbiorze danych 5.2.1. 5.2.2. 5.2.3. Budowa sieci neuronowej 5.2.4. Wstępna obróbka danych 5.2.5. Stosowanie techniki augmentacji danych 5.3. Korzystanie z wcześniej wytrenowanej konwolucyjnej sieci neuronowej 5.3.1. Ekstrakcja cech 5.3.2. Dostrajanie 5.3.3. Wnioski 5.4. Wizualizacja efektów uczenia konwolucyjnych sieci neuronowych 5.4.1. Wizualizacja pośrednich aktywacji 5.4.2. Wizualizacja filtrów konwolucyjnych sieci neuronowych 5.4.3. Wizualizacja map ciepła aktywacji klas Rozdział 6. Uczenie głębokie w przetwarzaniu tekstu i sekwencji 6.1. Praca z danymi tekstowymi 6.1.1. Kodowanie słów i znaków metodą gorącej jedynki 6.1.2. Osadzanie słów 6.1.3. 6.1.4. Wnioski Łączenie wszystkich technik: od surowego tekstu do osadzenia słów 6.2. Rekurencyjne sieci neuronowe 6.3. Przykład warstwy LSTM zaimplementowanej w pakiecie Keras 6.2.1. Warstwa rekurencyjna w pakiecie Keras 6.2.2. Warstwy LSTM i GRU 6.2.3. 6.2.4. Wnioski Zaawansowane zastosowania rekurencyjnych sieci neuronowych 6.3.1. 6.3.2. 6.3.3. 6.3.4. Problem prognozowania temperatury Przygotowywanie danych Punkt odniesienia w postaci zdrowego rozsądku Podstawowe rozwiązanie problemu przy użyciu techniki uczenia maszynowego Punkt odniesienia w postaci pierwszego modelu rekurencyjnego Stosowanie rekurencyjnego porzucania w celu zmniejszenia nadmiernego dopasowania Tworzenie stosów warstw rekurencyjnych 6.3.7. 6.3.8. Korzystanie z dwukierunkowych rekurencyjnych sieci neuronowych 6.3.9. Kolejne rozwiązania 6.3.10. Wnioski 6.3.5. 6.3.6. 6.4. Konwolucyjne sieci neuronowe i przetwarzanie sekwencji 6.4.1. 6.4.2. 6.4.3. 6.4.4. Przetwarzanie sekwencji za pomocą jednowymiarowej sieci konwolucyjnej Jednowymiarowe łączenie danych sekwencyjnych Implementacja jednowymiarowej sieci konwolucyjnej Łączenie sieci konwolucyjnych i rekurencyjnych w celu przetworzenia długich sekwencji 6.4.5. Wnioski 143 143 144 147 148 152 156 157 165 171 172 172 179 184 189 190 191 194 198 205 205 208 211 214 216 216 217 219 222 223 224 225 227 228 232 233 234 234 235 235 238 241 Poleć książkęKup książkę Spis treści 7 Rozdział 7. Zaawansowane najlepsze praktyki uczenia głębokiego 7.1. Funkcjonalny interfejs programistyczny pakietu Keras: wykraczanie poza model sekwencyjny 7.1.1. Wprowadzenie do funkcjonalnego interfejsu API 7.1.2. Modele z wieloma wejściami 7.1.3. Modele z wieloma wyjściami 7.1.4. 7.1.5. Udostępnianie wag warstwy 7.1.6. Modele pełniące funkcję warstw 7.1.7. Wnioski Skierowane acykliczne grafy warstw 7.2. Monitorowanie modeli uczenia głębokiego przy użyciu wywołań zwrotnych pakietu Keras i narzędzia TensorBoard 7.2.1. Używanie wywołań zwrotnych w celu sterowania procesem trenowania 7.2.2. Wprowadzenie do TensorBoard — platformy wizualizacji danych modelu pakietu TensorFlow 7.2.3. Wnioski 7.3. Korzystanie z pełni możliwości modeli 7.3.1. Konstrukcja zaawansowanych architektur 7.3.2. Optymalizacja hiperparametru 7.3.3. 7.3.4. Wnioski Składanie modeli Rozdział 8. Stosowanie uczenia głębokiego w celu generowania danych 8.1. Generowanie tekstu za pomocą sieci LSTM 8.1.1. Krótka historia generatywnych sieci rekurencyjnych 8.1.2. Generowanie danych sekwencyjnych 8.1.3. Dlaczego strategia próbkowania jest ważna? 8.1.4. 8.1.5. Wnioski Implementacja algorytmu LSTM generującego tekst na poziomie liter 8.2. DeepDream Implementacja algorytmu DeepDream w pakiecie Keras 8.2.1. 8.2.2. Wnioski 8.3. Neuronowy transfer stylu Strata treści Strata stylu Implementacja neuronowego transferu stylu przy użyciu pakietu Keras 8.3.1. 8.3.2. 8.3.3. 8.3.4. Wnioski 8.4. Generowanie obrazów przy użyciu wariacyjnych autoenkoderów Próbkowanie z niejawnej przestrzeni obrazów 8.4.1. 8.4.2. Wektory koncepcyjne używane podczas edycji obrazu 8.4.3. Wariacyjne autoenkodery 8.4.4. Wnioski 8.5. Wprowadzenie do generatywnych sieci z przeciwnikiem Schematyczna implementacja sieci GAN Zbiór przydatnych rozwiązań 8.5.1. 8.5.2. 8.5.3. Generator 8.5.4. Dyskryminator 243 244 246 248 250 252 255 257 257 258 258 261 267 267 267 271 272 274 277 279 279 280 281 282 287 287 289 293 295 296 296 297 302 302 304 305 306 311 312 313 314 315 316 Poleć książkęKup książkę 8 Spis treści Sieć z przeciwnikiem Trenowanie sieci DCGAN 8.5.5. 8.5.6. 8.5.7. Wnioski Rozdział 9. Wnioski 9.1. Przypomnienie najważniejszych koncepcji 9.1.1. 9.1.2. Co sprawia, że uczenie głębokie to wyjątkowa dziedzina uczenia Sztuczna inteligencja maszynowego? Jak należy traktować uczenie głębokie? 9.1.3. 9.1.4. Najważniejsze technologie 9.1.5. Uniwersalny przepływ roboczy uczenia maszynowego 9.1.6. Najważniejsze architektury sieci 9.1.7. Przestrzeń możliwości 9.2. Ograniczenia uczenia głębokiego Lokalne uogólnianie a ekstremalne uogólnianie 9.2.1. Ryzyko antropomorfizacji modeli uczenia maszynowego 9.2.2. 9.2.3. Wnioski Przyszłość uczenia głębokiego 9.3.1. Modele jako programy 9.3.2. Wykraczanie poza algorytm propagacji wstecznej i warstwy 9.3. różniczkowalne Zautomatyzowane uczenie maszynowe 9.3.3. 9.3.4. Nieustanne uczenie się i wielokrotne używanie modułowych procedur składowych Przewidywania dotyczące dalekiej przyszłości 9.4. Bycie na bieżąco z nowościami związanymi z szybko rozwijającą się dziedziną Zdobywaj wiedzę praktyczną, pracując z prawdziwymi problemami przedstawianymi w serwisie Kaggle 9.4.2. Czytaj o nowych rozwiązaniach w serwisie arXiv 9.4.3. Eksploruj ekosystem związany z pakietem Keras 9.3.5. 9.4.1. 9.5. Ostatnie słowa Dodatek A Instalowanie pakietu Keras i innych bibliotek niezbędnych do jego działania w systemie Ubuntu Dodatek B Uruchamianie kodu notatników Jupyter przy użyciu zdalnej instancji procesora graficznego EC2 Skorowidz 317 317 319 321 322 322 322 323 324 325 326 330 332 332 334 335 336 337 339 340 341 342 343 343 344 344 345 347 353 361 Poleć książkęKup książkę Rozpoczynamy korzystanie z sieci neuronowych W tym rozdziale opisałem:  Najważniejsze komponenty sieci neuronowych.  Wprowadzenie do pakietu Keras.  Konfigurację stacji roboczej przeznaczonej do uczenia głębokiego.  Stosowanie sieci neuronowych w celu rozwiązywania podstawowych problemów klasyfikacji i regresji. Lektura tego rozdziału ma pozwolić Ci rozpocząć stosowanie sieci neuronowych w celu rozwiązywania prawdziwych problemów. Podsumuję wiadomości związane z pierw- szym praktycznym przykładem, opisanym w rozdziale 2. Zastosujesz zdobytą wiedzę w celu rozwiązania trzech nowych problemów dotyczących trzech najczęstszych zasto- sowań sieci neuronowych: klasyfikacji binarnej, klasyfikacji wieloklasowej i regresji skalarnej. W tym rozdziale przyjrzymy się bliżej głównym elementom sieci neuronowych wprowadzonych w rozdziale 2.: warstwom, sieciom, funkcjom celu i optymalizatorom. Przedstawię krótkie wprowadzenie do pakietu Keras — biblioteki Pythona przezna- czonej do uczenia głębokiego, z której będziemy korzystać w dalszej części tej książki. Skonfigurujesz swój komputer pod kątem uczenia głębokiego — zainstalujesz pakiet TensorFlow, Keras i włączysz obsługę układu graficznego. Rozwiązywanie prawdziwych problemów za pomocą sieci neuronowych przedstawię na podstawie trzech przykła- dów. Będą to: Poleć książkęKup książkę 72 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych  klasyfikacja recenzji filmów — dzielenie ich na recenzje pozytywne i negatywne (klasyfikacja binarna);  podział wiadomości na tematy (klasyfikacja wieloklasowa);  szacowanie ceny domu na podstawie danych opisujących nieruchomość (regresja). Po przeczytaniu tego rozdziału będziesz w stanie używać sieci neuronowych do rozwią- zywania prostych problemów takich jak klasyfikacja lub regresja wektora danych. Lektura tego rozdziału ma Cię przygotować do zrozumienia teorii działania uczenia maszyno- wego przedstawionej w rozdziale 4. 3.1. Anatomia sieci neuronowej Przypominam, że trenowanie sieci neuronowej jest związane z rzeczami, którymi są:  warstwy, które po połączeniu ze sobą tworzą sieć (lub model);  dane wejściowe i odpowiadające im docelowe etykiety;   optymalizator, który określa przebieg trenowania. funkcja straty, która definiuje sygnał zwrotny używany w procesie uczenia; Zależności między nimi przedstawiono na rysunku 3.1. Sieć składająca się z połączonych ze sobą warstw przypisuje przewidywane wartości wyjściowe do danych wejściowych. Następnie funkcja straty porównuje wyniki przewidywań sieci z docelowymi etykietami, wskutek czego obliczana jest wartość straty (miara tego, czy sieć zwraca oczekiwane wartości). Optymalizator korzysta z wartości straty podczas modyfikowania wag sieci. Rysunek 3.1. Zależności między siecią, jej warstwami, funkcją straty a optymalizatorem W kolejnych sekcjach opiszę, czym są warstwy, sieci, funkcje strat i optymalizatory. 3.1.1. Warstwy: podstawowe bloki konstrukcyjne uczenia głębokiego Warstwa jest podstawową strukturą danych sieci neuronowych (pojęcie to wprowa- dziłem w rozdziale 2.). Warstwa jest modułem przetwarzania danych, który przyjmuje dane wejściowe z jednego tensora lub kilku tensorów i generuje dane wyjściowe Poleć książkęKup książkę 3.1. Anatomia sieci neuronowej 73 w postaci tensora lub kilku tensorów. Niektóre warstwy nie mają stanów, ale najczę- ściej warstwy są charakteryzowane przez stan — wagę. Wagę tworzy tensor lub kilka tensorów. Wartości wag są ustalane przy użyciu algorytmu stochastycznego spadku wzdłuż gradientu. Wagi tworzą wiedzę sieci. Do przetwarzania różnych typów danych i tensorów o różnych formatach stosuje się różne typy warstw. Proste dane wektorowe są przechowywane w dwuwymiarowych ten- sorach mających kształt(próbki, cechy) — przetwarza się je za pomocą warstw gęsto połączonych, zwanych również warstwami w pełni połączonymi lub po prostu war- stwami gęstymi (ich implementacją jest klasa Dense pakietu Keras). Dane sekwencyjne są przechowywane w trójwymiarowych tensorach mających kształt (próbki, znaczniki_ czasu, cechy) — przetwarza się je zwykle za pomocą warstw rekurencyjnych (np. warstw LSTM). Dane obrazu przechowuje się w tensorach czterowymiarowych — przetwarza się je zazwyczaj za pomocą dwuwymiarowych warstw konwolucyjnych (Conv2D). Warstwy można porównać do klocków LEGO uczenia głębokiego. Z metafory tej korzystali między innymi twórcy pakietu Keras. Modele głębokie są budowane w tym pakiecie poprzez łączenie ze sobą kompatybilnych warstw, co umożliwia generowanie praktycznych potoków przekształcających dane. Pojęcie kompatybilności warstw odnosi się do tego, że każdy typ warstwy przyjmuje tylko tensory wejściowe o określonym kształ- cie i doprowadza do powstania tensorów wyjściowych mających określony kształt. Przyj- rzyj się następującemu przykładowi: from keras import layers Warstwa gęsta z 32 jednostkami wyjściowymi. layer = layers.Dense(32, input_shape=(784,)) Utworzyliśmy warstwę, która przyjmuje na wejściu tylko tensory dwuwymiarowe, a pierwszy wymiar tensora musi mieć długość 784 (oś 0 — wymiar próbki — jest nie- określony, a więc warstwa akceptuje jego dowolną wielkość). Warstwa ta zwróci tensor, którego pierwszy wymiar będzie miał długość równą 32. W związku z tym warstwa ta może być połączona z kolejną warstwą, która oczekuje na wejściu pojawienia się wektora o 32 wymiarach. Korzystając z pakietu Keras, nie musisz przejmować się kompatybilnością, ponieważ warstwy tworzące model są dyna- micznie budowane w celu dopasowania ich do poprzedniej warstwy. Załóżmy, że napi- saliśmy następujący kod: from keras import models from keras import layers model = models.Sequential() model.add(layers.Dense(32, input_shape=(784,))) model.add(layers.Dense(32)) Do drugiej warstwy nie przekazaliśmy argumentu definiującego kształt tensora wej- ściowego — parametr ten zostanie automatycznie określony na podstawie kształtu ten- sora zwracanego przez wcześniejszą warstwę. Poleć książkęKup książkę 74 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych 3.1.2. Modele: sieci warstw Model uczenia głębokiego jest skierowanym acyklicznym grafem warstw. Najpopular- niejszą jego formą jest liniowy stos warstw przypisujący jeden element wyjściowy do jednego elementu wejściowego. Z czasem poznasz również bardziej zaawansowane topologie sieci, takie jak:  sieci o dwóch rozgałęzieniach,  sieci typu multihead,  bloki incepcji. Topologia sieci definiuje przestrzeń hipotezy. W rozdziale 1. definiowaliśmy uczenie maszynowe jako „poszukiwanie praktycznej reprezentacji danych wejściowych w ramach zdefiniowanej przestrzeni możliwości na podstawie sygnału informacji zwrotnej”. Wybierając topologię sieci, ograniczamy przestrzeń możliwości (przestrzeń hipotez) do określonej serii operacji tensorowych przypisujących dane wyjściowe do danych wejściowych. Trenowanie sieci polega na poszukiwaniu odpowiedniego zestawu warto- ści wag operacji przetwarzania tensorów. Wybór właściwej architektury sieci to raczej kwestia doświadczenia niż analizy naukowej. Co prawda są pewne zasady doboru architektury do problemu, z których możesz korzystać, ale tylko praktyka sprawi, że będziesz w stanie zrobić to naprawdę dobrze. W kolejnych rozdziałach poznasz te zasady, ale pomogę Ci również w zdoby- ciu pewnej intuicji w tej kwestii, co ułatwi Ci wykonanie tego zadania. 3.1.3. Funkcja straty i optymalizatory: najważniejsze elementy konfiguracji procesu uczenia Po zdefiniowaniu architektury sieci musisz określić jeszcze dwie rzeczy:  Funkcję straty (funkcję celu) — wartość, która będzie minimalizowana w proce- sie trenowania. Jest miarą sukcesu wykonywanego zadania.  Optymalizator — sposób modyfikowania sieci na podstawie funkcji straty. Implementuje on określony wariant algorytmu stochastycznego spadku wzdłuż gradientu. Sieć neuronowa, która generuje wiele wartości wyjściowych, może mieć więcej niż jedną funkcję straty (może mieć po jednej funkcji straty dla każdej wartości wyjścio- wej), ale proces spadku gradientu musi być oparty na pojedynczej skalarnej wartości straty; a więc w przypadku sieci z wieloma wartościami straty wszystkie te wartości są łączone (uśredniane) w celu uzyskania jednej wartości skalarnej. Odpowiedni dobór funkcji celu do problemu jest bardzo ważny — sieć będzie robiła wszystko, by zminimalizować straty, a więc jeżeli funkcja celu nie będzie w pełni skore- lowana z osiągnięciem sukcesu w wykonywaniu zadania, to sieć będzie wykonywała niechciane operacje. Wyobraź sobie głupią wszechmogącą sztuczną inteligencję tre- nowaną za pomocą algorytmu SGD przy źle dobranej funkcji celu w postaci „maksy- malizuj średni dobrobyt wszystkich żywych ludzi”. Sztuczna inteligencja, aby osiągnąć ten cel w sposób jak najprostszy, może zdecydować się na zabicie wszystkich ludzi poza kilkoma najbogatszymi osobami. Takie rozwiązanie jest możliwe, ponieważ na średni Poleć książkęKup książkę 3.2. Wprowadzenie do pakietu Keras 75 dobrobyt nie wpływa liczba osób pozostałych przy życiu, a prawdopodobnie takiego rozwiązania nie miał na celu autor tej sztucznej inteligencji! Pamiętaj o tym, że wszyst- kie konstruowane przez Ciebie sztuczne sieci neuronowe będą zachowywały się po- dobnie — będą starały się za wszelką cenę obniżyć funkcję straty. W związku z tym musisz rozważnie dobierać cele, bo w przeciwnym razie osiągniesz niezamierzone efekty uboczne. Na szczęście w typowych problemach, takich jak klasyfikacja, regresja i przewidy- wanie sekwencyjne, można korzystać z prostych wskazówek umożliwiających wybranie właściwej funkcji straty. W przypadku podziału na dwie grupy będziemy posługiwać się entropią krzyżową, a w przypadku dzielenia na wiele grup będziemy korzystać z kate- goryzacyjnej entropii krzyżowej. Problem regresji będzie rozwiązywany za pomocą średniego błędu kwadratowego, a podczas pracy nad problemem uczenia sekwencyjnego będziemy korzystać z klasyfikacji CTC (ang. Connectionist Temporal Classification). Funkcje celu należy tworzyć samodzielnie w zasadzie tylko podczas pracy nad naprawdę nowym problemem badawczym. W kolejnych rozdziałach opiszę szczegółowo dobór funkcji straty do różnych typowych problemów. 3.2. Wprowadzenie do pakietu Keras W przykładach kodu przedstawionych w tej książce wykorzystano pakiet Keras (https:// keras.io/). Jest to rama projektowa uczenia głębokiego języka Python, która umożliwia wygodne definiowanie i trenowanie dowolnych modeli uczenia głębokiego. Biblioteka ta była początkowo tworzona w celu umożliwienia naukowcom szybkiego przeprowa- dzania eksperymentów. Główne cechy charakteryzujące tę bibliotekę to:  możliwość bezproblemowego uruchamiania tego samego kodu na procesorach  przyjazny interfejs programistyczny ułatwiający szybkie prototypowanie modeli CPU i GPU; uczenia głębokiego;  wbudowana obsługa sieci konwolucyjnych służących do przetwarzania obrazu, sieci rekurencyjnych służących do przetwarzania danych sekwencyjnych i sieci będących połączeniem obu tych rozwiązań;  obsługa sieci o dowolnych architekturach: modeli obsługujących wiele wejść i wyjść; możliwość współdzielenia warstw i modeli. Dzięki tym możliwościom pakiet Keras nadaje się do budowania praktycznie dowolnych modeli uczenia głębokiego — od generatywnych sieci z przeciwnikiem (sieci GAN) do neuro- nowych maszyn Turinga. Pakiet Keras jest dystrybuowany na podstawie liberalnej licencji MIT, a więc można go używać za darmo nawet w projektach komercyjnych. Jest kompatybilny z dowolną wer- sją Pythona od 2.7 do 3.6 (stan na pierwszą połowę 2017 r.). Z biblioteki Keras korzysta ponad 200 000 użytkowników — należą do nich naukowcy, inżynierowie, pracownicy małych firm i dużych korporacji, absolwenci uczelni wyższych i zwykli entuzjaści nowych technologii. Z Keras korzystają takie firmy jak Google, Netflix, Poleć książkęKup książkę 76 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych Uber, CERN, Yelp, Square, a także setki małych start-upów pracujących nad różnymi problemami. Biblioteka ta jest również popularna wśród uczestników konkursów Kaggle — praktycznie każdy konkurs dotyczący uczenia głębokiego wygrywa ostatnio model korzystający z Keras. Rysunek 3.2. Wykres zmian zainteresowania różnymi pakietami uczenia maszynowego sporządzony na podstawie danych wyszukiwarki Google 3.2.1. Keras, TensorFlow, Theano i CNTK Keras jest biblioteką funkcjonującą na poziomie modelu. Zapewnia ona wysokopozio- mowe bloki konstrukcyjne służące do tworzenia modeli uczenia głębokiego. Pakiet ten nie obsługuje niskopoziomowych operacji takich jak przeprowadzanie działań na ten- sorach i różniczkowanie. W tych kwestiach polega on na wyspecjalizowanej i solidnie zoptymalizowanej bibliotece obsługującej tensory. Pełni ona funkcję bazowego silnika pakietu Keras. Autorzy Keras nie wybrali jednej biblioteki obsługującej tensory i nie powiązali implementacji pakietu Keras z żadną konkretną biblioteką. Problem ten został rozwiązany modułowo (patrz rysunek 3.3). Keras może korzystać z kilku różnych silników bazowych. Obecnie są to biblioteki TensorFlow, Theano i Microsoft Cognitive Toolkit (CNTK). W przyszłości zbiór ten może zostać powiększony o kolejne biblio- teki bazowe uczenia głębokiego. Rysunek 3.3. Stos programowy i sprzętowy uczenia głębokiego Obecnie TensorFlow, CNTK i Theano są podstawowymi platformami uczenia głębo- kiego. Platforma Theano (http://deeplearning.net/software/theano) jest rozwijana przez laboratorium MILA Uniwersytetu Montrealskiego, platforma TensorFlow (http://www. tensorflow.org) jest rozwijana przez firmę Google, a platforma CNTK (https://github. com/Microsoft/CNTK) — przez Microsoft. Każdy kod korzystający z Keras może być uruchomiony na dowolnej platformie wybranej spośród tych trzech. Kod nie będzie Poleć książkęKup książkę 3.2. Wprowadzenie do pakietu Keras 77 wymagał żadnych modyfikacji. Platformę można zmienić w dowolnym momencie pracy, co przyda się, gdy któraś platforma okaże się szybsza podczas rozwiązywania danego problemu. Polecam traktowanie platformy TensorFlow jako platformy domyślnej. Jest ona najpopularniejsza. Charakteryzuje ją możliwość skalowania i wdrażania w rozwią- zaniach produkcyjnych. Dzięki platformie TensorFlow (lub Theano albo CNTK) pakiet Keras może korzy- stać z możliwości procesorów CPU i GPU. W przypadku wykonywania kodu na proce- sorze CPU platforma TensorFlow obudowuje niskopoziomową bibliotekę operacji ten- sorowych o nazwie Eigen (http://eigen.tuxfamily.org). W przypadku pracy na procesorze GPU platforma TensorFlow obudowuje wysoce zoptymalizowaną bibliotekę uczenia głębokiego NVIDIA CUDA Deep Neural Network (cuDNN). 3.2.2. Praca z pakietem Keras: krótkie wprowadzenie Przedstawiłem już jeden przykład modelu opartego na pakiecie Keras — przykład MNIST. Typowy przepływ roboczy podczas pracy z tym pakietem wygląda tak, jak poka- zano we wspomnianym przykładzie: 1. Zdefiniuj dane treningowe: tensory wejściowe i tensory wartości docelowych. 2. Zdefiniuj warstwy sieci (lub modelu) przypisującej dane wejściowe do docelo- 3. Skonfiguruj proces uczenia, wybierając funkcję straty, optymalizator i monitoro- wych wartości. wane metryki. 4. Wykonaj iteracje procesu uczenia na danych treningowych, wywołując metodę fit() zdefiniowanego modelu. Model może zostać zdefiniowany na dwa sposoby: przy użyciu klasy Sequential (tylko w przypadku liniowych stosów warstw, czyli obecnie najpopularniejszej architektury sieci) lub funkcjonalnego interfejsu API (w przypadku skierowanych acyklicznych grafów warstw — interfejs ten pozwala na tworzenie sieci o dowolnej architekturze). Dla przypomnienia — oto przykład dwuwarstwowego modelu zdefiniowanego za pomocą klasy Sequential (zauważ, że określono w nim oczekiwany kształt danych wej- ściowych pierwszej warstwy sieci): from keras import models from keras import layers model = models.Sequential() model.add(layers.Dense(32, activation= relu , input_shape=(784,))) model.add(layers.Dense(10, activation= softmax )) Oto definicja tego samego modelu napisana przy użyciu funkcjonalnego interfejsu API: input_tensor = layers.Input(shape=(784,)) x = layers.Dense(32, activation= relu )(input_tensor) output_tensor = layers.Dense(10, activation= softmax )(x) model = models.Model(inputs=input_tensor, outputs=output_tensor) Poleć książkęKup książkę 78 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych Korzystając z funkcjonalnego interfejsu API, przeprowadzasz operacje na tensorach danych przetwarzanych przez model — przetwarzasz tensory przez warstwy sieci tak, jakby były funkcjami. UWAGA W rozdziale 7. znajdziesz szczegółowy opis możliwości funkcjonalnego interfejsu API. Do tego rozdziału w prezentowanych przykładach kodu będę korzystał tylko z klasy Sequential. Po zdefiniowaniu architektury modelu nie ma znaczenia to, czy został on utworzony za pomocą klasy Sequential, czy posługiwałeś się funkcjonalnym interfejsem API. W obu przypadkach następne operacje przebiegają tak samo. Proces uczenia jest konfigurowany w kroku kompilacji, w którym należy określić optymalizator i funkcję straty (niektóre modele mogą mieć kilka funkcji strat) — ele- menty, z których powinien korzystać model, a także metryki, które mają być stosowane do monitorowania procesu trenowania. Oto przykład, w którym zastosowano jedną funk- cję straty (jest to najczęstszy przypadek): from keras import optimizers model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss= mse , metrics=[ accuracy ]) Ostatni proces — etap uczenia polega na przekazywaniu tablic Numpy zawierających dane wejściowe (i docelowe dane — etykiety próbek) do modelu przy użyciu metody fit(). Proces ten przebiega podobnie do procesu używanego podczas pracy z biblio- teką Scikit-Learn, a także kilkoma innymi bibliotekami uczenia maszynowego: model.fit(input_tensor, target_tensor, batch_size=128, epochs=10) Podczas lektury kilku kolejnych rozdziałów będziesz w stanie intuicyjnie określić typ architektury sieci, który sprawdzi się w danym problemie. Nauczysz się konfigurować proces uczenia i dostrajać model aż do uzyskania oczekiwanych rezultatów. W podroz- działach 3.4, 3.5 i 3.6 opiszę trzy podstawowe przykłady: przykład klasyfikacji dzielą- cej na dwie grupy, przykład klasyfikacji dzielącej na wiele grup i przykład regresji. 3.3. Przygotowanie stacji roboczej do uczenia głębokiego Zanim rozpoczniesz pracę nad tworzeniem aplikacji uczenia głębokiego, musisz skonfi- gurować swoją stację roboczą. Zalecam wykonywanie kodu uczenia głębokiego na nowo- czesnym procesorze graficznym NVIDIA, ale nie jest to konieczne. Niektóre aplikacje, a szczególnie aplikacje przetwarzające obraz za pomocą konwolucyjnych sieci neuro- nowych i aplikacje przetwarzające sekwencje za pomocą rekurencyjnych sieci neuro- nowych będą działały bardzo wolno na zwykłym procesorze CPU. Dotyczy to nawet szybkich wielordzeniowych procesorów tego typu. Nawet aplikacje, które mogą być uruchomione na zwykłym procesorze, gdy zostaną uruchomione na nowoczesnym pro- cesorze graficznym, będą działały szybciej od 5 do nawet 10 razy. Jeżeli nie chcesz instalować procesora graficznego w swoim komputerze, to możesz przeprowadzać swoje eksperymenty na procesorze GPU w chmurze Google lub Amazon Web Services Poleć książkęKup książkę 3.3. Przygotowanie stacji roboczej do uczenia głębokiego 79 (instancja EC2 GPU), ale musisz pamiętać o tym, że na dłuższą metę korzystanie z pro- cesorów GPU dostępnych w chmurze jest drogie. Niezależnie od tego, czy będziesz pracować na własnym sprzęcie, czy korzystać z chmury, najlepiej jest wybrać środowisko systemu Unix. Pomimo tego, że uru- chomienie pakietu Keras w systemie Windows jest, technicznie rzecz biorąc, możliwe (wszystkie trzy silniki przetwarzania danych obsługują system Windows), to nie zale- cam tego rozwiązania. W instrukcji instalacji znajdującej się w dodatku A opisałem konfi- gurację środowiska programistycznego w systemie Ubuntu. Jeżeli korzystasz z systemu Windows, to najprostszym rozwiązaniem jest zainstalowanie na swoim komputerze dru- giego systemu operacyjnego (systemu Ubuntu). Może się to wydawać dość kłopotliwe, ale praca w Ubuntu oszczędzi Ci wiele czasu i pozwoli uniknąć kłopotów w przyszłości. Aby móc korzystać z pakietu Keras, musisz zainstalować platformę TensorFlow, CNTK lub Theano (albo wszystkie te platformy jednocześnie, jeżeli chcesz dysponować możliwością przełączania się między nimi w dowolnej chwili). W tej książce skupię się na platformie TensorFlow, czasami będę udzielał wskazówek dotyczących platformy Theano, ale zupełnie pominę zagadnienia związane z platformą CNTK. 3.3.1. Notatniki Jupyter: najlepszy sposób na eksperymentowanie z uczeniem głębokim Notatniki Jupyter doskonale nadają się do eksperymentowania z uczeniem głębokim — umożliwiają między innymi uruchomienie kodu opisywanego w tej książce. Jest to narzędzie popularne wśród analityków i osób zajmujących się uczeniem maszynowym. Notatnik jest plikiem wygenerowanym przez aplikację Jupyter Notebook (https:// jupyter.org), który można edytować w oknie przeglądarki internetowej. Umożliwia on wykonywanie kodu Pythona i tworzenie rozbudowanych notatek opisujących jego dzia- łanie. Notatnik pozwala na podzielenie długiego eksperymentu na mniejsze etapy, które mogą być wykonywane w sposób niezależny, a więc proces pracy nad programem staje się interaktywny — nie musisz uruchamiać ponownie całego wcześniejszego kodu, jeżeli napotkasz problemy pod koniec eksperymentu. Polecam korzystanie z notatników Jupyter na początku przygody z pakietem Keras, ale nie jest to wymóg konieczny. Możesz równie dobrze uruchamiać samodzielne skrypty Pythona lub korzystać ze środowiska programistycznego takiego jak PyCharm. Wszystkie przykłady kodu opisanego w tej książce możesz pobrać w formie notatników: ftp://ftp. helion.pl/przyklady/delepy.zip. 3.3.2. Dwie opcje uruchamiania pakietu Keras Polecam Ci skorzystanie z jednej z dwóch następujących opcji w celu rozpoczęcia pracy nad uczeniem maszynowym:  Skorzystanie z oficjalnej maszyny wirtualnej — obrazu EC2 Deep Learning AMI (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) — i urucha- mianie na niej eksperymentów w postaci notatników Jupyter. Jeżeli nie posiadasz komputera z odpowiednim procesorem graficznym, to warto skorzystać z tej możliwości. Konfigurację tego rozwiązania opisano w dodatku B. Poleć książkęKup książkę 80 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych  Zainstalowanie wszystkich niezbędnych narzędzi od podstaw na swoim kompu- terze w systemie Unix. Możliwe wówczas stanie się uruchamianie notatników Jupyter i skryptów Pythona w środowisku lokalnym. Skorzystaj z tej opcji, jeżeli dysponujesz szybkim procesorem graficznym firmy NVIDIA. Proces instalacji i konfiguracji wszystkich narzędzi opisałem w dodatku A. Przeanalizujmy wady i zalety poszczególnych rozwiązań. 3.3.3. Wady i zalety uruchamiania uczenia głębokiego w chmurze Jeżeli nie posiadasz procesora graficznego (nowego, wysokiego modelu procesora firmy NVIDIA), który może zostać użyty w celu przetwarzania kodu uczenia maszynowego, to przeprowadzanie eksperymentów w chmurze jest prostym i tanim rozwiązaniem, które nie wymaga zakupu dodatkowego sprzętu. Uruchamianie kodu notatnika Jupyter w chmurze nie różni się niczym od uruchamiania go lokalnie. W połowie 2017 r. naj- prostszym rozwiązaniem umożliwiającym rozpoczęcie pracy nad uczeniem głębokim jest AWS EC2. W dodatku B znajdziesz wszystkie informacje niezbędne do uruchomie- nia notatników Jupyter na procesorze EC2 dostępnym w chmurze. Jeżeli często pracujesz z tego typu kodem, to ciężko będzie Ci korzystać z tego rozwiązania, ponieważ jest ono kosztowne. Obsługa instancji opisanej przeze mnie w dodatku B (instancja p2.xlarge, której moc obliczeniowa wcale nie jest duża) kosztuje około 4 zł za godzinę (cena z połowy 2017 r.). Solidny konsumencki procesor graficzny kosztuje od 3500 zł do 6000 zł. Ceny tego typu układów są dość stabilne pomimo tego, że możliwości kolejnych generacji procesorów graficznych są coraz większe. Jeżeli poważnie podchodzisz do uczenia głębokiego, to powinieneś zbudować własny komputer roboczy wyposażony w przynajmniej jeden procesor graficzny. Ogólnie rzecz biorąc, wykupienie dostępu do maszyny wirtualnej EC2 jest dobrym sposobem na rozpoczęcie pracy z algorytmami uczenia głębokiego. Instancja tej maszyny wyposażona w procesor GPU umożliwia wykonanie całego przykładowego kodu zapre- zentowanego w tej książce, ale jeżeli chcesz zajmować się uczeniem głębokim na co dzień, to warto kupić własny układ graficzny. 3.3.4. Jaki procesor graficzny najlepiej nadaje się do uczenia głębokiego? Jeżeli masz zamiar kupić procesor graficzny, to jaki warto wybrać? Przede wszystkim musi być to układ firmy NVIDIA. Tylko ten producent układów graficznych inwestuje duże pieniądze w rozwój technologii uczenia głębokiego i zarazem nowoczesne pakiety uczenia głębokiego działają tylko na kartach graficznych firmy NVIDIA. W połowie 2017 r. za układ najlepiej nadający się do uczenia głębokiego uważałem NVIDIA TITAN Xp. Wśród tańszych rozwiązań warto rozważyć kartę GTX 1060. Jeżeli czytasz tę książkę w 2018 r. lub później, to zajrzyj do internetu i poszukaj aktualnych rekomendacji, ponieważ na rynku co roku pojawia się wiele nowych rozwiązań. Od teraz zakładam, że dysponujesz dostępem do komputera z zainstalowanym pakietem Keras i bibliotekami zależnymi. Najlepiej byłoby, aby był to komputer wypo- Poleć książkęKup książkę 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów 81 sażony w obsługiwany procesor graficzny. Zainstaluj wszystkie niezbędne komponenty, zanim przejdziesz dalej. Wykonaj wszystkie kroki opisane w dodatkach. W razie jakich- kolwiek problemów szukaj pomocy w internecie. Znajdziesz w nim wiele poradników instalowania Keras i najczęściej używanych bibliotek zależnych. Teraz możemy przejść do przykładów praktycznego zastosowania pakietu Keras. 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów Klasyfikacja dzieląca na dwie grupy (klasyfikacja binarna) jest najczęściej spotykanym problemem uczenia maszynowego. Analizując ten przykład, nauczysz się klasyfikować recenzje filmów — dzielić je na pozytywne i negatywne na podstawie ich treści. 3.4.1. Zbiór danych IMDB Będziemy pracować ze zbiorem IMDB: zbiorem 50 000 bardzo spolaryzowanych recen- zji opublikowanych w serwisie Internet Movie Database. Recenzje zostały podzielone na zbiór treningowy (25 000 recenzji) i zbiór testowy (25 000 recenzji). Każdy z tych zbio- rów składa się w połowie z recenzji pozytywnych i w połowie z recenzji negatywnych. Dlaczego korzystamy z oddzielnych zbiorów? Wynika to z tego, że nigdy nie powinno się testować modelu uczenia maszynowego na tych samych danych, które były używane do jego trenowania! To, że model dobrze klasyfikuje dane treningowe, wcale nie oznacza tego, że będzie równie dobrze klasyfikował nowe dane, a tak naprawdę intere- suje nas wydajność modelu podczas klasyfikacji nowych danych (znamy etykiety pró- bek treningowego zbioru danych, a więc to oczywiste, że nie musimy ich przewidy- wać za pomocą modelu). Model mógłby po prostu zapamiętać etykiety treningowego zbioru danych i być zupełnie nieprzydatny podczas przewidywania etykiet nowych recenzji. Zagadnienie to zostanie opisane w sposób bardziej szczegółowy w kolejnym rozdziale. Zbiór IMDB, podobnie jak zbiór MNIST, jest dołączony do pakietu Keras. Zbiór ten został już przygotowany do analizy: recenzje (sekwencje słów) zostały zamienione na sekwencje wartości całkowitoliczbowych, w których każda wartość symbolizuje obec- ność w recenzji wybranego słowa ze słownika. Poniższy kod załaduje zbiór danych (podczas uruchamiania go po raz pierwszy na dysk twardy Twojego komputera pobranych zostanie około 80 MB danych). Listing 3.1. Ładowanie zbioru danych IMDB from keras.datasets import imdb (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000) Argument num_words=10000 oznacza, że w treningowym zbiorze danych zostanie zacho- wanych tylko 10 000 słów, występujących najczęściej w tym zbiorze danych. Słowa występujące rzadziej zostaną pominięte. Rozwiązanie to umożliwia pracę z wektorem danych o rozmiarze umożliwiającym jego przetwarzanie. Poleć książkęKup książkę 82 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych Zmienne train_data i test_data są listami recenzji. Każda recenzja jest listą indeksów słów (zakodowaną sekwencją słów). Zmienne train_labels i test_labels zawierają etykiety w postaci zer i jedynek: 0 oznacza recenzję negatywną, a 1 oznacza recenzję pozytywną: train_data[0] [1, 14, 22, 16, ... 178, 32] train_labels[0] 1 Ograniczamy się do 10 000 najczęściej występujących słów, a więc będziemy mieli 10 000 wartości indeksów słów: max([max(sequence) for sequence in train_data]) 9999 Dla ciekawskich — oto sposób na szybkie odkodowanie jednej z recenzji i odczytanie jej treści w języku angielskim: word_index = imdb.get_word_index() reverse_word_index = dict( [(value, key) for (key, value) in word_index.items()]) decoded_review = .join( [reverse_word_index.get(i - 3, ? ) for i in train_data[0]]) Słownik word_index przypisuje słowom wartości indeksów. Odwracajac go, możemy przypisać indeksy do słów. Kod dekodujący recenzję. Zauważ, że indeksy są przesunięte o 3, ponieważ pod indeksami o numerach 0, 1 i 2 znajdują się indeksy symbolizujące „wypełnienie”, „początek sekwencji” i „nieznane słowo”. 3.4.2. Przygotowywanie danych List wartości całkowitoliczbowych nie można przekazać bezpośrednio do sieci neuro- nowej. Trzeba je zamienić na listę tensorów. Można to zrobić na dwa sposoby:  Można dopełnić listy tak, aby miały takie same długości, i zamienić je na tensor wartości całkowitoliczbowych mający kształt (próbki, indeksy_słów), a następnie w roli pierwszej warstwy sieci neuronowej zastosować warstwę mogącą przetwa- rzać tensory wartości całkowitoliczbowych (warstwę Embedding — więcej informa- cji na jej temat znajdziesz w dalszej części tej książki).  Można zakodować listy tak, aby zamienić je w wektory zer i jedynek. Oznacza to np. zamienienie sekwencji [3, 5] na wektor mający 10 000 wymiarów, który będzie wypełniony samymi zerami, a tylko pod indeksami o numerach 3 i 5 znajdą się jedynki. W takiej sytuacji pierwszą warstwą naszej sieci mogłaby być warstwa Dense, która potrafi obsłużyć wektory danych zmiennoprzecinkowych. Skorzystajmy z drugiego rozwiązania i zamieńmy dane na wektory. W celu zachowania przejrzystości kodu zrobimy to ręcznie. Listing 3.2. Kodowanie sekwencji wartości całkowitoliczbowych do postaci macierzy wartości binarnych import numpy as np def vectorize_sequences(sequences, dimension=10000): Poleć książkęKup książkę 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów 83 results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1. return results Pod wybranymi indeksami umieszcza wartość 1. Tworzy macierz wypełnioną zerami o kształcie (len(sequences), dimension). x_train = vectorize_sequences(train_data) x_test = vectorize_sequences(test_data) Zbiór treningowy w postaci wektora. Zbiór testowy w postaci wektora. Teraz próbki wyglądają tak: x_train[0] array([ 0., 1., 1., ..., 0., 0., 0.]) Musimy jeszcze wykonać operację zamiany na wektory etykiet próbek: y_train = np.asarray(train_labels).astype( float32 ) y_test = np.asarray(test_labels).astype( float32 ) Teraz dane mogą zostać przetworzone przez sieć neuronową. 3.4.3. Budowa sieci neuronowej Dane wejściowe są wektorami, a etykiety mają formę wartości skalarnych (jedynek i zer): to najprostsza sytuacja, z jaką można mieć do czynienia. Tego typu problemy najlepiej jest rozwiązywać za pomocą sieci prostego stosu w pełni połączonych warstw (Dense) z aktywacjami relu: Dense(16, activation= relu ). Argument przekazywany do każdej warstwy Dense (16) jest liczbą ukrytych jednostek warstwy. Jednostka ukryta jest wymiarem przestrzeni reprezentacji warstwy. W roz- dziale 2. pisałem o tym, że każda warstwa Dense z aktywacją relu implementuje nastę- pujący łańcuch operacji tensorowych: output = relu(dot(W, input) + b) Przy 16 ukrytych jednostkach macierz wag W będzie miała kształt (wymiar_wejściowy, 16): iloczyn skalarny macierzy W będzie rzutował dane wejściowe na 16-wymiarową prze- strzeń reprezentacji (następnie dodawany jest wektor wartości progowych b i wyko- nywana jest operacja relu). Wymiary przestrzeni reprezentacji danych można rozumieć jako „stopień swobody, jaką dysponuje sieć podczas nauki wewnętrznych reprezentacji danych”. Zwiększenie liczby ukrytych jednostek (zwiększenie liczby wymiarów prze- strzeni reprezentacji) pozwala sieci na uczenie się bardziej skomplikowanych repre- zentacji, ale działanie takiej sieci będzie wymagało większej mocy obliczeniowej i może prowadzić do wytrenowania niechcianych parametrów (prawidłowości, które poprawią wydajność przetwarzania treningowego zbioru danych, ale będą bezużyteczne podczas przetwarzania danych testowych). Pracując z warstwami Dense, należy odpowiedzieć sobie na dwa pytania dotyczące architektury sieci:  Ile warstw należy zastosować?  Ile ukrytych jednostek należy wybrać w każdej z warstw? W kolejnym rozdziale przedstawię formalne zasady udzielania odpowiedzi na te pyta- nia. Na razie przyjmijmy następujące założenia: Poleć książkęKup książkę 84 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych  Dwie warstwy pośrednie, zawierające po 16 ukrytych jednostek każda.  Trzecia warstwa, generująca przewidywanie sentymentu analizowanej recenzji w postaci wartości skalarnej. Warstwy pośrednie będą korzystały z funkcji aktywacji relu, a ostatnia warstwa będzie korzystała z funkcji aktywacji sigmoid, co pozwoli na wygenerowanie wartości znajdują- cej się w zakresie od 0 do 1 określającej prawdopodobieństwo tego, że dana recenzja jest pozytywna. Funkcja relu (wyprostowana jednostka liniowa) jest funkcją, która ma wyzerowywać negatywne wartości (patrz rysunek 3.4), a funkcja sigmoid „upycha” war- tości tak, aby znalazły się w zakresie od 0 do 1 (patrz rysunek 3.5), co pozwala sieci na generowanie wartości, które można interpretować jako prawdopodobieństwo. Rysunek 3.4. Funkcja relu Rysunek 3.5. Funkcja sigmoid Poleć książkęKup książkę 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów 85 Na rysunku 3.6 pokazano schemat sieci. Oto kod implementacji sieci za pomocą pakietu Keras (przypomina on implementację sieci z zaprezentowanego wcześniej przykładu przetwarzania zbioru MNIST). Rysunek 3.6. Sieć składająca się z trzech warstw Listing 3.3. Definicja modelu from keras import models from keras import layers model = models.Sequential() model.add(layers.Dense(16, activation= relu , input_shape=(10000,))) model.add(layers.Dense(16, activation= relu )) model.add(layers.Dense(1, activation= sigmoid )) Czym są funkcje aktywacji i dlaczego musimy z nich korzystać? Warstwa Dense bez funkcji aktywacji takiej jak funkcja relu (zwana również funkcją nieli- niową) składałaby się z dwóch operacji liniowych — iloczynu skalarnego i dodawania: output = dot(W, input) + b W związku z tym warstwa mogłaby uczyć się tylko przekształceń liniowych (przekształ- ceń afinicznych) danych wejściowych. Przestrzeń hipotez takiej warstwy byłaby zesta- wem wszystkich możliwych przekształceń liniowych zbioru danych w przestrzeni o 16 wy- miarach. Taka przestrzeń hipotez jest zbyt ograniczona i nie wykorzystalibyśmy tego, że dysponujemy wieloma warstwami reprezentacji (głęboki stos warstw liniowych imple- mentowałby tylko operacje liniowe i dodawanie kolejnych warstw nie rozszerzałoby prze- strzeni hipotez). W celu uzyskania dostępu do o wiele bogatszej przestrzeni hipotez i skorzystania z możli- wości oferowanych przez głębokie reprezentacje danych potrzebujemy nieliniowości zapew- nianej przez funkcję aktywacji. Funkcją najczęściej stosowaną w uczeniu głębokim tego typu jest funkcja relu, ale istnieje wiele innych funkcji o podobnie dziwnych nazwach: prelu, elu itd. Na koniec musimy wybrać funkcję straty i optymalizator. Pracujemy nad problemem kla- syfikacji binarnej, a sieć zwraca wartości prawdopodobieństwa (na końcu sieci znajduje się warstwa jednej jednostki z funkcją aktywacji sigmoid), a więc najlepiej jest skorzystać z funkcji straty binary_crossentropy (binarnej entropii krzyżowej). Nie jest to jedyna opcja, z której możemy skorzystać. Możemy również użyć np. funkcji średniego błędu Poleć książkęKup książkę 86 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych kwadratowego mean_squared_error, ale entropia krzyżowa jest zwykle najlepszą opcją w przypadku modeli zwracających wartości prawdopodobieństwa. Termin entropia krzy- żowa wywodzi się z teorii informacji. Jest to miara odległości między rozkładami praw- dopodobieństwa a w tym przypadku rozkładem prawdziwych wartości i rozkładem przewidywanych wartości. Oto kod konfigurujący model. Wybieramy w nim optymalizator rmsprop i funkcję straty binary_crossentropy. Zauważ, że podczas trenowania monitorować będziemy rów- nież dokładność (accuracy). Listing 3.4. Kompilowanie modelu model.compile(optimizer= rmsprop , loss= binary_crossentropy , metrics=[ accuracy ]) Metryka, optymalizator i funkcja straty są definiowane za pomocą łańcuchów. Jest to możliwe, ponieważ rmsprop, binary_crossentropy i accuracy to pakiety wchodzące w skład biblioteki Keras. Czasami zachodzi konieczność skonfigurowania parametrów optymali- zatora lub przekazania samodzielnie wykonanej funkcji straty lub funkcji metryki. Można to zrobić, przekazując instancję klasy optymalizatora jako argument optimizer (patrz listing 3.5) i przekazując funkcję obiektów jako argumenty loss i metrics (patrz listing 3.6). Listing 3.5. Konfiguracja optymalizatora from keras import optimizers model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss= binary_crossentropy , metrics=[ accuracy ]) Listing 3.6. Korzystanie z własnych funkcji straty i metryki from keras import losses from keras import metrics model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss=losses.binary_crossentropy, metrics=[metrics.binary_accuracy]) 3.4.4. Walidacja modelu W celu monitorowania dokładności modelu w czasie trenowania utworzymy zbiór danych, które nie były używane do trenowania modelu. Zrobimy to, odtłaczając 10 000 próbek od treningowego zbioru danych. Listing 3.7. Tworzenie zbioru walidacyjnego x_val = x_train[:10000] partial_x_train = x_train[10000:] y_val = y_train[:10000] partial_y_train = y_train[10000:] Poleć książkęKup książkę 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów 87 Teraz będziemy trenować model przez 20 epok (wykonamy 20 iteracji wszystkich próbek znajdujących się w tensorach x_train i y_train) z podziałem na wsady po 512 próbek. Jednocześnie będziemy monitorować funkcje straty i dokładności modelu przy przetwa- rzaniu 10 000 próbek, które przed chwilą odłożyliśmy na bok. W tym celu musimy prze- kazać zbiór walidacyjny (kontrolny) jako argument validation_data: Listing 3.8. Trenowanie modelu: model.compile(optimizer= rmsprop , loss= binary_crossentropy , metrics=[ acc ]) history = model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512, validation_data=(x_val, y_val)) W przypadku trenowania na procesorze CPU przetworzenie jednej epoki procesu zaj- muje mniej niż 2 sekundy — cały proces trwa około 20 sekund. Pod koniec każdej epoki algorytm zatrzymuje się na chwilę, ponieważ model oblicza stratę i dokładność, korzy- stając z 10 000 próbek walidacyjnego zbioru danych. Zwróć uwagę na to, że wywołanie metody model.fit() zwraca obiekt History (historia). Obiekt ten mieści element o nazwie history, który jest słownikiem zawierającym dane dotyczące przebiegu procesu trenowania. Przyjrzyjmy się mu: history_dict = history.history history_dict.keys() [u acc , u loss , u val_acc , u val_loss ] Słownik zawiera cztery elementy: po jednym związanym z każdą z metryk monitoro- wanych podczas trenowania i walidacji. Utwórzmy wykres porównujący stratę treningu i walidacji (patrz rysunek 3.7), a także wykres zmian dokładności trenowania i wali- dacji (patrz rysunek 3.8). Uzyskane przez Ciebie wyniki mogą nieco odbiegać od moich z powodu losowego inicjowania sieci. Rysunek 3.7. Strata trenowania i walidacji Poleć książkęKup książkę 88 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych Listing 3.9. Tworzenie wykresu strat trenowania i walidacji Rysunek 3.8. Dokładność trenowania i walidacji import matplotlib.pyplot as plt acc = history.history[ acc ] val_acc = history.history[ val_acc ] loss = history.history[ loss ] val_loss = history.history[ val_loss ] epochs = range(1, len(acc) + 1) Parametr bo definiuje linię przerywaną w postaci niebieskich kropek. plt.plot(epochs, loss, bo , label= Strata trenowania ) plt.plot(epochs, val_loss, b , label= Strata walidacji ) plt.title( Strata trenowania i walidacji ) plt.xlabel( Epoki ) plt.ylabel( Strata ) plt.legend() Parametr b definiuje ciągłą niebieską linię. plt.show() Listing 3.10 Tworzenie wykresu dokładności trenowania i walidacji plt.clf() acc_values = history_dict[ acc ] val_acc_values = history_dict[ val_acc ] Czyszczenie rysunku. plt.plot(epochs, acc, bo , label= Dokladnosc trenowania ) plt.plot(epochs, val_acc, b , label= Dokladnosc walidacji ) plt.title( Dokladnosc trenowania i walidacji ) plt.xlabel( Epoki ) plt.ylabel( Strata ) plt.legend() plt.show() Jak widać, strata trenowania spada z każdą kolejną epoką, a dokładność trenowania wzrasta. Tego oczekujemy od optymalizacji algorytmem spadku gradientu — wartość, którą staramy się minimalizować, powinna maleć w każdej kolejnej iteracji, ale w czwartej epoce strata walidacji i dokładność walidacji rosną. To właśnie przykład sytuacji, przed którą ostrzegałem wcześniej — model sprawdzający się lepiej na treningowym zbiorze Poleć książkęKup książkę 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów 89 danych wcale nie musi sprawdzać się lepiej podczas przetwarzania nowych danych. W praktyce jest to przykład nadmiernego dopasowania — po drugiej epoce model jest zbytnio optymalizowany na treningowym zbiorze danych i uczy się konkretnej repre- zentacji treningowego zbioru danych, a nie ogólnej wizji sprawdzającej się również poza treningowym zbiorem danych. W tym przypadku nadmiernemu dopasowaniu możemy zapobiec, przerywając dzia- łanie algorytmu po 3 epokach, ale możemy skorzystać z wielu technik zapobiegających nadmiernemu dopasowaniu modelu, które opiszę w kolejnym rozdziale. Przeprowadźmy trenowanie nowej sieci od podstaw (zróbmy to przez cztery epoki), a następnie dokonajmy ewaluacji na podstawie testowego zbioru danych. Listing 3.11. Ponowne uczenie modelu od początku model = models.Sequential() model.add(layers.Dense(16, activation= relu , input_shape=(10000,))) model.add(layers.Dense(16, activation= relu )) model.add(layers.Dense(1, activation= sigmoid )) model.compile(optimizer= rmsprop , loss= binary_crossentropy , metrics=[ accuracy ]) model.fit(x_train, y_train, epochs=4, batch_size=512) results = model.evaluate(x_test, y_test) Tym razem uzyskaliśmy następujące wyniki: results [0.2929924130630493, 0.88327999999999995] To dość naiwne rozwiązanie pozwoliło uzyskać dokładność na poziomie 88 . Dopraco- wane modele powinny zbliżyć się do 95 . 3.4.5. Używanie wytrenowanej sieci do generowania przewidywań dotyczących nowych danych Po wytrenowaniu sieci możemy jej użyć w celu zrobienia czegoś praktycznego. Aby wyge- nerować wartość określającą prawdopodobieństwo tego, że recenzja jest pozytywna, wystarczy skorzystać z metody predict: model.predict(x_test) array([[ 0.98006207] [ 0.86563045], [ 0.99936908], ..., [ 0.45731062], [ 0.0038014 ], [ 0.79525089]], dtype=float32) Jak widać, w przypadku nowych próbek sieć jest bardzo pewna swojego werdyktu (generuje wartości zbliżone do 0,99 lub 0,01), ale w przypadku innych generuje o wiele mniej pewne wyniki, takie jak 0,6 lub 0,4. Poleć książkęKup książkę 90 ROZDZIAŁ 3. Rozpoczynamy korzystanie z sieci neuronowych 3.4.6. Dalsze eksperymenty Oto eksperymenty, które pomogą Ci utwierdzić się w przekonaniu, że wybraliśmy cał- kiem sensowną architekturę, z tym że można ją jeszcze usprawnić:  Korzystaliśmy z dwóch warstw ukrytych. Spróbuj dodać jedną lub trzy warstwy ukryte i sprawdź, jak wpłynie to na dokładność walidacji i testu.  Spróbuj użyć warstw z większą lub mniejszą liczbą ukrytych jednostek: wypró- buj warstwy z np. 32 i 64 jednostkami.  Zamiast funkcji straty binary_crossentropy skorzystaj z funkcji straty mse.  Wypróbuj działanie funkcji aktywacji tanh (funkcja ta była popularna na początku rozwoju sieci neuronowych) — zastąp nią funkcję relu. 3.4.7. Wnioski Oto wnioski, które należy wynieść z tego przykładu:  Zwykle dane wymagają przeprowadzenia wstępnej obróbki, po której można skie- rować je w formie tensorów do wejścia sieci neuronowej. Sekwencja słów może być przedstawiona w formie wektorów wartości binarnych, ale można to zrobić również na inne sposoby.  Stosy warstw Dense z aktywacją relu mogą służyć do rozwiązywania różnych pro- blemów (między innymi klasyfikacji tonu wypowiedzi). W związku z tym najpraw- dopodobniej będziesz często korzystać z nich w przyszłości.  W przypadku problemu klasyfikacji binarnej (dwie klasy wyjściowe) na końcu sieci powinna znajdować się warstwa Dense z jedną jednostką i funkcją aktywacji sigmoid — wartości wyjściowe generowane przez sieć powinny być skalarami znajdującymi się w zakresie od 0 do 1 (powinny określać prawdopodobieństwo).  W takiej konfiguracji warstwy wyjściowej sieci funkcją straty powinna być binarna entropia krzyżowa (binary_crossentropy).  Optymalizator rmsprop jest — ogólnie rzecz biorąc — dobrym wyborem do każ- dego problemu. W związku z tym masz o jedną rzecz mniej do przeanalizowania.  Sieci neuronowe wraz z coraz lepszym poznawaniem danych treningowych zaczy- nają się nadmiernie do nich dopasowywać, co prowadzi do pogorszenia rezulta- tów przetwarzania nowych danych. Musisz stale monitorować wydajność sieci podczas przetwarzania danych niewchodzących w skład zbioru treningowego. 3.5. Przykład klasyfikacji wieloklasowej: klasyfikacja krótkich artykułów prasowych W poprzednim podrozdziale przedstawiłem klasyfikację wektorów przy podziale na dwie rozłączne klasy za pomocą ściśle połączonej sieci neuronowej. Co się dzieje, gdy mamy więcej klas? W tym podrozdziale zbudujemy sieć klasyfikującą doniesienia prasowe Agencji Reu- tera na 46 niezależnych tematów. Podział ma być dokonany na wiele grup, a więc mamy tym razem do czynienia z problemem klasyfikacji wieloklasowej. Każdy element zbioru danych może być przypisany tylko do jednej kategorii, a więc problem ten możemy Poleć książkęKup książkę 3.5. Przykład klasyfikacji wieloklasowej: klasyfikacja krótkich artykułów prasowych 91 określić mianem jednoetykietowej klasyfikacji wieloklasowej. Gdyby element zbioru danych mógł należeć jednocześnie do wielu kategorii (w tym przypadku do wielu tematów), to mielibyśmy do czynienia z problemem wieloetykietowej klasyfikacji wie- loklasowej. 3.5.1. Zbiór danych Agencji Reutera W tym podrozdziale będziemy pracować nad zbiorem danych Agencji Reutera — zesta- wem krótkich informacji prasowych dotyczących określonego tematu, które zostały opu- blikowane przez tę agencję w 1986 r. Jest to prosty i popularny zbiór danych, doskonale nadający się do eksperymentowania z klasyfikacją tekstu. Zbiór ten zawiera 46 różnych tematów. Do niektórych z nich należy o wiele więcej informacji prasowych niż do innych, ale każdy z tematów ma przynajmniej 10 przykładów w treningowym zbiorze danych. Zbiór Agencji Reutera, podobnie jak zbiory IMDB i MNIST, wchodzi w skład pakietu Keras. Przyjrzyjmy się jego zawartości. Listing 3.12. Ładowanie zbioru danych Agencji Reutera from keras.datasets import reuters (train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000) Podobnie jak w przypadku zbioru IMDB stosujemy argument num_words=10000, który ogranicza nasze działania do 10 000 słów występujących najczęściej w analizowanym zbiorze danych. Dysponujemy 8982 przykładami treningowymi i 2246 przykładami testowymi: len(train_data) 8982 len(test_data) 2246 Każdy przykład jest listą wartości całkowitoliczbowych (indeksów słów) — takie samo rozwiązanie zostało zaprezentowane w przykładzie zbioru IMDB: train_data[10] [1, 245, 273, 207, 156, 53, 74, 160, 26, 14, 46, 296, 26, 39, 74, 2979, 3554, 14, 46, 4689, 4329, 86, 61, 3499, 4795, 14, 61, 451, 4329, 17, 12] Poniższy kod umożliwia odkodow
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Deep Learning. Praca z językiem Python i biblioteką Keras
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: