Twój pierwszy model Keras z nauką przenoszenia

1. Omówienie

W tym module dowiesz się, jak utworzyć klasyfikator Keras. Zamiast próbować wymyślić idealną kombinację warstw sieci neuronowych do rozpoznawania kwiatów, zaczniemy najpierw stosować technikę zwaną transfer learning, aby dostosować zaawansowany, wytrenowany model do naszego zbioru danych.

Ten moduł zawiera niezbędne wyjaśnienia teoretyczne dotyczące sieci neuronowych i jest dobrym punktem wyjścia dla programistów, którzy chcą się uczyć głębokiego uczenia.

Ten moduł jest 2. częścią serii „Keras na TPU”. Możesz je wykonać w podanej kolejności lub niezależnie od siebie.

ca8cc21f6838eccc.png

Czego się nauczysz

  • Aby utworzyć własny klasyfikator obrazów Keras z warstwą softmax i stratą entropii krzyżowej.
  • Aby oszukać 😈, używając uczenia transferowego zamiast tworzenia własnych modeli.

Prześlij opinię

Jeśli zauważysz, że w tym laboratorium z kodem coś jest nie tak, daj nam znać. Opinię można przesłać, korzystając z formularza dotyczącego problemów na GitHubie [link do przesyłania opinii].

2. Krótki przewodnik po Google Colaboratory

Ten moduł używa Google Collaboratory i nie wymaga konfiguracji. Colaboratory to internetowa platforma do tworzenia notatek przeznaczona do użytku edukacyjnego. Oferuje on bezpłatne szkolenie dotyczące procesora CPU, GPU i TPU.

688858c21e3beff2.png

Aby zapoznać się z Colaboratory, możesz otworzyć ten przykładowy notatnik i przejrzeć kilka komórek.

c3df49e90e5a654f.png Welcome to Colab.ipynb

Wybierz backend TPU

8832c6208c99687d.png

W menu Colab wybierz Środowisko wykonawcze > Zmień typ środowiska wykonawczego, a następnie wybierz TPU. W tym laboratorium kodu skorzystasz z wydajnego TPU (jednostki Tensor Processing Unit) z przyspieszeniem sprzętowym. Połączenie ze środowiskiem wykonawczym zostanie nawiązane automatycznie przy pierwszym uruchomieniu. Możesz też użyć przycisku „Połącz” w prawym górnym rogu.

Wykonywanie notatnika

76d05caa8b4db6da.png

Uruchom po kolei komórki, klikając wybraną komórkę i naciskając klawisze Shift+ENTER. Możesz też uruchomić cały notatnik, klikając Środowisko wykonawcze > Uruchom wszystko.

Spis treści

429f106990037ec4.png

Wszystkie notatniki mają spis treści. Możesz go otworzyć, klikając czarną strzałkę po lewej stronie.

Ukryte komórki

edc3dba45d26f12a.png

W niektórych komórkach będzie widoczny tylko tytuł. Jest to funkcja notatnika specyficzna dla Colab. Można je dwukrotnie kliknąć, aby zobaczyć w nich kod, ale zwykle nie jest to zbyt interesujące. Zwykle są to funkcje obsługi lub wizualizacji. Nadal musisz uruchomić te komórki, aby zdefiniować funkcje znajdujące się w nich.

Uwierzytelnianie

cdd4b41413100543.png

Colab może uzyskać dostęp do Twoich prywatnych zasobników Google Cloud Storage, jeśli uwierzytnisz się za pomocą autoryzowanego konta. Powyższy fragment kodu spowoduje uruchomienie procesu uwierzytelniania.

3. [INFO] Klasyfikator sieci neuronowych 101

W skrócie

Jeśli znasz już wszystkie terminy wyróżnione pogrubieniem w następnym akapicie, możesz przejść do następnego ćwiczenia. Jeśli dopiero zaczynasz korzystać z głębokiego uczenia się, czytaj dalej.

W przypadku modeli utworzonych jako sekwencja warstw Keras oferuje interfejs Sequential API. Na przykład klasyfikator obrazów wykorzystujący 3 gęste warstwy możesz zapisać w Kerarze w taki sposób:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

Gęsta sieć neuronowa

Jest to najprostsza sieć neuronowa do klasyfikowania obrazów. Składa się z „neuronów” ułożonych w warstwach. Pierwsza warstwa przetwarza dane wejściowe, a potem wprowadza dane wyjściowe do innych warstw. Nazywa się ją „gęstą”, ponieważ każdy neuron jest połączony ze wszystkimi neuronami w poprzedniej warstwie.

c21bae6dade487bc.png

Obraz możesz przesłać do takiej sieci, spłaszczając wartości RGB wszystkich pikseli do postaci wektora długości i używając go jako danych wejściowych. Nie jest to najlepsza technika rozpoznawania obrazów, ale ulepszymy ją w przyszłości.

Neurony, aktywacje, RELU

„Neuron” oblicza ważoną sumę wszystkich swoich wejść, dodaje wartość zwaną „uśrednieniem” i przekazuje wynik przez tak zwaną „funkcję aktywacji”. Wagi i uśrednienia są na początku nieznane. Zostaną one zainicjowane losowo i „wyuczą się” przez trenowanie sieci neuronowej na wielu znanych danych.

644f4213a4ee70e5.png

Najpopularniejszą funkcją aktywacji jest RELU (Rectified Linear Unit). Jest to bardzo prosta funkcja, jak widać na wykresie powyżej.

Aktywacja softmaxa

Powyższa sieć kończy się warstwą 5-neuronową, ponieważ kwiaty dzielimy na 5 kategorii (róża, tulipan, mniszek, stokrotka, słonecznik). Neurony w warstwach pośrednich są aktywowane przy użyciu klasycznej funkcji aktywacji RELU. W ostatniej warstwie chcemy jednak obliczyć liczby z zakresu od 0 do 1, które będą odpowiadać prawdopodobieństwu, że dany kwiat to róża, tulipan itp. W tym celu użyjemy funkcji aktywacji o nazwie „softmax”.

Zastosowanie funkcji softmax do wektora odbywa się przez pobranie wykładniczej każdego pierwiastka, a następnie normalizację wektora, zwykle z użyciem normy L1 (sumy wartości bezwzględnych), tak aby sumy się sumowały do 1 i można je zinterpretować jako prawdopodobieństwa.

ef0d98c0952c262d.png d51252f75894479e.gif

Entropia krzyżowa

Teraz, gdy nasza sieć neuronowa generuje prognozy na podstawie danych wejściowych, musimy zmierzyć, jak dobre są te prognozy, czyli odległość między tym, co mówi nam sieć, a prawidłowymi odpowiedziami, które często nazywamy „etykietami”. Pamiętaj, że wszystkie obrazy w zbiorze danych mają prawidłowe etykiety.

Dobrze sprawdzi się dowolna odległość, ale w przypadku problemów z klasyfikacją najbardziej skuteczna jest tzw. odległość entropii krzyżowej. Będziemy to nazwać funkcją błędu lub „straty”:

7bdf8753d20617fb.png

Spadek wzdłuż gradientu

„Trenowanie” sieci neuronowej oznacza używanie obrazów i etykiet treningowych do korygowania wag i odchyleń w celu zminimalizowania funkcji utraty entropii krzyżowej. Oto jak to działa.

Entropia krzyżowa jest funkcją wag, przesunięć, pikseli obrazu treningowego i jego znanej klasy.

Jeśli obliczamy częściowe pochodne entropii krzyżowej względem wszystkich wag i wszystkich odchyleń, uzyskujemy „gradient” obliczony dla danego obrazu, etykiety oraz bieżącej wartości wag i odchylenia. Pamiętaj, że możemy mieć miliony wag i odchyleń, więc obliczenie gradientu wymaga sporo wysiłku. Na szczęście robi to za nas Tensorflow. Właściwością matematyczną gradientu jest to, że skierowany jest „do góry”. Ponieważ chcemy uzyskać wartość entropii krzyżowej zbliżoną do zera, idziemy w przeciwnym kierunku. Aktualizujemy wagi i uświadczenia o części nachylenia. Następnie powtarzamy ten sam proces wielokrotnie, używając kolejnych partii obrazów i etykiet do treningu. Mamy nadzieję, że zjawisko to zbiega się w miejsce, w którym entropia krzyżowa jest minimalna, ale nic nie gwarantuje, że te minimum jest unikalne.

gradient 2.png

Krótkie partie i pęd

Możesz obliczyć gradient tylko na jednym przykładowym obrazie i od razu zaktualizować wagi i odchylenia, ale w przypadku grupy np. 128 obrazów uzyskasz gradient, który lepiej odpowiada ograniczeniom nałożonym przez różne przykładowe obrazy i z większym prawdopodobieństwem będzie szybciej zbliżyć się do rozwiązania. Rozmiar minipartii jest parametrem, który można dostosować.

Ta technika, czasami nazywana „stochastycznym gradientem”, ma jeszcze jedną, bardziej pragmatyczną korzyść: praca z wsadami oznacza również pracę z większymi matrycami, które zwykle można łatwiej zoptymalizować w przypadku układów GPU i TPU.

Zbieżność może być jednak nieco chaotyczna i może nawet zostać zatrzymana, jeśli wektor gradientu składa się wyłącznie ze zera. Czy to oznacza, że znaleźliśmy minimum? Nie zawsze. Minimalna lub maksymalna wartość komponentu gradientu może wynosić zero. W przypadku wektora gradientu zawierającego miliony elementów (jeśli wszystkie są zerami), prawdopodobieństwo, że każde zero odpowiada minimum i żadnym z nich nie znajdzie się w punkcie maksymalnym, jest bardzo małe. W wielowymiarowej przestrzeni punkty siodła są dość powszechne i nie chcemy się na nich zatrzymywać.

52e824fe4716c4a0.png

Ilustracja: punkt siodłowy. Gradient wynosi 0, ale nie jest on minimalny we wszystkich kierunkach. (źródło obrazu: Wikimedia: By Nicoguaro - Own work, CC BY 3.0)

Rozwiązaniem jest dodanie algorytmowi optymalizacji pewnej dynamiki, aby mógł on omijać punkty spoczynku bez zatrzymywania się.

Słownik

wsadowym lub miniwsadowym: trenowanie jest zawsze wykonywane na zbiorach danych treningowych i etykiet; Ułatwia to algorytmowi ujednolicenie. Wymiar „zbiorczy” to zwykle pierwszy wymiar tensorów danych. Na przykład tensor o kształcie [100, 192, 192, 3] zawiera 100 obrazów o wymiarach 192 x 192 piksele z 3 wartościami na piksel (RGB).

entropia krzyżowa: specjalna funkcja utraty często używana w klasyfikatorach.

warstwy gęste: warstwa neuronów, w której każdy neuron jest połączony ze wszystkimi neuronami z poprzedniej warstwy.

funkcje: dane wejściowe sieci neuronowej są czasami nazywane „cechami”. Sztuka ustalania, które części zbioru danych (lub ich kombinacje) przekazać do sieci neuronowej w celu uzyskania dobrych prognoz, nosi nazwę „inżynierii cech”.

labels: inna nazwa „klas” lub prawidłowych odpowiedzi w problemie klasyfikacji nadzorowanej

tempo uczenia się: ułamek gradientu, za pomocą którego wagi i uśrednienia są aktualizowane przy każdej iteracji pętli treningowej.

Logity: wyjścia warstwy neuronów przed zastosowaniem funkcji aktywacyjnej nazywane są „logitami”. Termin pochodzi od „funkcji logistycznej”, nazywanej też „funkcją sigmoidalną”, która kiedyś była najpopularniejszą funkcją aktywacyjną. „Neuron outputs before logistic function” (Wyjścia neuronu przed funkcją logistycznej) zostało skrócone do „logitów”.

strata: funkcja błędu porównująca dane wyjściowe sieci neuronowej z prawidłowymi odpowiedziami.

neuron: oblicza ważony ciąg danych wejściowych, dodaje odchylenie i przekazuje wynik przez funkcję aktywacji.

kodowanie jedno- gorące: klasa 3 z 5 jest zakodowana jako wektor pięciu elementów, z wyjątkiem trzeciego, czyli 1.

relu: wyprostowana jednostka liniowa. Popularna funkcja aktywacji neuronów.

sigmoid: inna funkcja aktywacji, która była kiedyś popularna i przydaje się w szczególnych przypadkach.

softmax: specjalna funkcja aktywacji, która działa na wektorze, zwiększa różnicę między największym składnikiem a pozostałymi, a także normalizuje wektor do sumy 1, co umożliwia zinterpretowanie go jako wektora prawdopodobieństw. Jest używany jako ostatni krok w klasyfikatorach.

tensor: „tensor” jest jak macierz, ale z dowolną liczbą wymiarów. Jednowymiarowy tensor to wektor. Tensor dwuwymiarowy to macierz. Tensory mogą mieć 3, 4, 5 lub więcej wymiarów.

4. Przekazanie nauki

Gęste warstwy prawdopodobnie nie wystarczą do rozwiązania problemu z klasyfikacją obrazów. Musimy się dowiedzieć więcej o warstwach konwolucyjnych i o wielu sposobach ich porządkowania.

Możemy też użyć skrótu. Dostępne do pobrania są w pełni wytrenowane splotowe sieci neuronowe. Można odciąć ostatnią warstwę, czyli nagłówek klasyfikacji softmax, i zastąpić ją własną. Wszystkie wytrenowane wagi i odchylenia pozostają bez zmian. Ponownie trenujesz tylko dodaną warstwę softmax. Ta technika nazywa się transfer learning i co ciekawe, działa, o ile zbiór danych, na którym sieć neuronowa jest wstępnie trenowana, jest „wystarczająco podobny” do Twojego.

Ćwiczenie

Otwórz ten notatnik, uruchom komórki (Shift + ENTER) i postępuj zgodnie z instrukcjami, gdy zobaczysz etykietę „WYMAGANE PRACY”.

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

Informacje dodatkowe

Dzięki uczeniu przenoszonemu możesz korzystać z zaawansowanych architektur konwolucyjnych sieci neuronowych opracowanych przez najlepszych badaczy oraz z wstępnego trenowania na ogromnym zbiorze danych obrazów. W naszym przypadku będziemy przenosić dane z sieci wytrenowanej w ImageNet – bazie zdjęć z wieloma roślinami i zdjęciami plenerowymi, która jest wystarczająco blisko kwiatów.

b8fc1efd2001f072.png

Ilustracja: wykorzystanie złożonej splotowej sieci neuronowej, która została już wytrenowana jako czarna ramka, ponownie trenuje tylko głowicę klasyfikacji. To jest uczenie się przez przenoszenie. Jak działają te skomplikowane układy warstw konwolucyjnych, wyjaśnimy później. Na razie ten problem ma ktoś inny.

Przenoszenie nauki w Keras

W Keras możesz utworzyć instancję wytrenowanego wcześniej modelu z kolekcji tf.keras.applications.*. Na przykład MobileNet V2 to bardzo dobra architektura konwolucyjna, która zajmuje rozsądną ilość miejsca. Jeśli wybierzesz include_top=False, uzyskasz już wytrenowany model bez ostatniej warstwy softmax, więc możesz dodać własny:

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

Zwróć też uwagę na ustawienie pretrained_model.trainable = False. Blokuje wagi i uzależnienia wytrenowanego wcześniej modelu, aby trenować tylko warstwę softmax. Zwykle wiąże się to ze stosunkowo niewielką wagą i może zostać przeprowadzone szybko i bez konieczności użycia bardzo dużego zbioru danych. Jeśli jednak masz dużo danych, pretrained_model.trainable = True może usprawnić naukę przenoszenia. Wstępnie wytrenowane wagi zapewniają doskonałe wartości początkowe, które można jeszcze dostosować podczas trenowania, aby lepiej dopasować je do problemu.

Na koniec zwróć uwagę na warstwę Flatten() włożoną przed gęstą warstwą softmax. Gęste warstwy działają na płaskich wektorach danych, ale nie wiemy, czy właśnie tak zwraca już wytrenowany model. Dlatego musimy to zrobić. W następnym rozdziale, przechodząc do architektur splotowych, wyjaśnimy format danych zwracany przez warstwy splotowe.

Przy takim podejściu możesz uzyskać dokładność na poziomie 75%.

Rozwiązanie

Oto notatnik z rozwiązaniem. Możesz z niego skorzystać, jeśli utkniesz.

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

Omówione zagadnienia

  • 🤔 Jak napisać klasyfikator w Keraście
  • 🤓 skonfigurowany z ostatnią warstwą softmax i stratą entropii krzyżowej
  • 😈 Przeniesienie nauki
  • 🤔 Trenowanie pierwszego modelu
  • 🧐 Po straceniu i dokładności podczas treningu

Poświęć chwilę na zapoznanie się z tą listą kontrolną.

5. Gratulacje!

Możesz teraz utworzyć model Keras. Aby dowiedzieć się, jak składać warstwy konwolucyjne, przejdź do następnego modułu.

TPU w praktyce

TPU i GPU są dostępne na platformie Cloud AI:

Bardzo zależy nam na opiniach użytkowników. Daj nam znać, jeśli zauważysz w tym module coś nie tak lub uważasz, że coś jest nie tak. Opinie można przesyłać za pomocą zgłoszeń na GitHubie [link do opinii].

HR.png

Martin Görner ID small.jpg
Autor: Martin Görner
Twitter: @martin_gorner

logo Tensorflow.jpg
www.tensorflow.org