1. Przegląd
W tym laboratorium dowiesz się, jak utworzyć klasyfikator Keras. Zamiast próbować znaleźć idealną kombinację warstw sieci neuronowej do rozpoznawania kwiatów, najpierw użyjemy techniki uczenia transferowego, aby dostosować do naszego zbioru danych zaawansowany wstępnie wytrenowany model.
Ten moduł zawiera niezbędne wyjaśnienia teoretyczne dotyczące sieci neuronowych i jest dobrym punktem wyjścia dla programistów, którzy chcą dowiedzieć się więcej o deep learning.
Ten moduł jest drugą częścią serii „Keras na TPU”. Możesz wykonać je w podanej kolejności lub niezależnie od siebie.
- Potoki danych o szybkości TPU: tf.data.Dataset i TFRecords
- [TO ĆWICZENIE] Pierwszy model Keras z uczeniem transferowym
- Konwolucyjne sieci neuronowe z użyciem Keras i TPU
- Nowoczesne sieci konwolucyjne, SqueezeNet i Xception z użyciem Keras i TPU

Czego się nauczysz
- Aby utworzyć własny klasyfikator obrazów Keras z warstwą softmax i funkcją straty entropii krzyżowej:
- Aby oszukiwać 😈, używaj uczenia przez przeniesienie zamiast tworzyć własne modele.
Prześlij opinię
Jeśli zauważysz w tym module coś nieprawidłowego, poinformuj nas o tym. Opinie można przesyłać za pomocą zgłoszeń w GitHub [link do opinii].
2. Krótkie wprowadzenie do Google Colaboratory
W tym module używamy Google Collaboratory, więc nie musisz niczego konfigurować. Colaboratory to internetowa platforma do tworzenia notatników przeznaczona do celów edukacyjnych. Oferuje bezpłatne szkolenia dotyczące procesorów, układów GPU i TPU.

Możesz otworzyć ten przykładowy notatnik i uruchomić kilka komórek, aby zapoznać się z Colaboratory.
Wybieranie backendu TPU

W menu Colab kliknij Środowisko wykonawcze > Zmień typ środowiska wykonawczego, a następnie wybierz TPU. W tym module nauczysz się korzystać z wydajnej jednostki TPU (Tensor Processing Unit) do trenowania z akceleracją sprzętową. Połączenie z czasem działania nastąpi automatycznie przy pierwszym wykonaniu kodu. Możesz też użyć przycisku „Połącz” w prawym górnym rogu.
Wykonywanie notatnika

Uruchamiaj komórki pojedynczo, klikając je i naciskając Shift + Enter. Możesz też uruchomić cały notatnik, klikając Środowisko wykonawcze > Uruchom wszystko.
Spis treści

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

Niektóre komórki będą wyświetlać tylko swój tytuł. Jest to funkcja notatnika Colab. Możesz kliknąć je dwukrotnie, aby zobaczyć kod w środku, ale zwykle nie jest on zbyt interesujący. Zwykle są to funkcje pomocnicze lub wizualizacyjne. Nadal musisz uruchomić te komórki, aby zdefiniować funkcje w nich zawarte.
Uwierzytelnianie

Colab może uzyskać dostęp do Twoich prywatnych zasobników Google Cloud Storage, jeśli uwierzytelnienie nastąpi przy użyciu autoryzowanego konta. Powyższy fragment kodu uruchomi proces uwierzytelniania.
3. [INFO] Klasyfikator sieci neuronowej – wprowadzenie
W skrócie
Jeśli znasz już wszystkie pogrubione terminy w następnym akapicie, możesz przejść do kolejnego ćwiczenia. Jeśli dopiero zaczynasz przygodę z uczeniem głębokim, witamy. Czytaj dalej.
W przypadku modeli zbudowanych jako sekwencja warstw Keras oferuje interfejs Sequential API. Na przykład klasyfikator obrazów z 3 warstwami gęstymi można zapisać w Kerasie w ten 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, ... )

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 i przekazuje wyniki do innych warstw. Jest ona nazywana „gęstą”, ponieważ każdy neuron jest połączony ze wszystkimi neuronami w poprzedniej warstwie.

Obraz możesz przekazać do takiej sieci, spłaszczając wartości RGB wszystkich pikseli do długiego wektora i używając go jako danych wejściowych. Nie jest to najlepsza technika rozpoznawania obrazów, ale w przyszłości ją ulepszymy.
Neurony, aktywacje, RELU
„Neuron” oblicza ważoną sumę wszystkich danych wejściowych, dodaje wartość zwaną „obciążeniem” i przekazuje wynik przez tzw. „funkcję aktywacji”. Wagi i wartości progowe są początkowo nieznane. Są one inicjowane losowo i „uczone” przez trenowanie sieci neuronowej na wielu znanych danych.

Najpopularniejsza funkcja aktywacji to RELU, czyli Rectified Linear Unit. Jest to bardzo prosta funkcja, co widać na wykresie powyżej.
Funkcja aktywacji softmax
Powyższa sieć kończy się warstwą 5 neuronów, ponieważ klasyfikujemy kwiaty w 5 kategoriach (róża, tulipan, mniszek lekarski, stokrotka, słonecznik). Neurony w warstwach pośrednich są aktywowane za pomocą klasycznej funkcji aktywacji RELU. W ostatniej warstwie chcemy jednak obliczyć liczby z zakresu od 0 do 1, które będą reprezentować prawdopodobieństwo, że dany kwiat jest różą, tulipanem itp. W tym celu użyjemy funkcji aktywacji o nazwie „softmax”.
Zastosowanie funkcji softmax do wektora polega na obliczeniu wartości wykładniczej każdego elementu, a następnie znormalizowaniu wektora, zwykle za pomocą normy L1 (sumy wartości bezwzględnych), tak aby wartości sumowały się do 1 i można je było interpretować jako prawdopodobieństwa.

Funkcja straty entropii krzyżowej
Gdy nasza sieć neuronowa generuje prognozy na podstawie obrazów wejściowych, musimy zmierzyć, jak dobre są te prognozy, czyli odległość między tym, co mówi nam sieć, a prawidłowymi odpowiedziami, często nazywanymi „etykietami”. Pamiętaj, że mamy prawidłowe etykiety dla wszystkich obrazów w zbiorze danych.
Sprawdzi się dowolna odległość, ale w przypadku problemów z klasyfikacją najskuteczniejsza jest tzw. odległość entropii krzyżowej. Nazwiemy ją funkcją błędu lub „straty”:

Metoda gradientu prostego
„Trenowanie” sieci neuronowej polega na używaniu obrazów i etykiet treningowych do dostosowywania wag i odchyleń w celu zminimalizowania funkcji utraty entropii krzyżowej. Działa to w następujący sposób:
Entropia krzyżowa jest funkcją wag, odchyleń, pikseli obrazu treningowego i jego znanej klasy.
Jeśli obliczymy pochodne cząstkowe entropii krzyżowej względem wszystkich wag i wszystkich odchyleń, otrzymamy „gradient” obliczony dla danego obrazu, etykiety oraz bieżącej wartości wag i odchyleń. Pamiętaj, że możemy mieć miliony wag i odchyleń, więc obliczanie gradientu wydaje się bardzo pracochłonne. Na szczęście TensorFlow robi to za nas. Własnością matematyczną gradientu jest to, że wskazuje on „w górę”. Chcemy, aby entropia krzyżowa była jak najmniejsza, więc idziemy w przeciwnym kierunku. Wagi i odchylenia aktualizujemy o ułamek gradientu. Następnie powtarzamy ten proces w przypadku kolejnych partii obrazów i etykiet treningowych w pętli trenowania. Mamy nadzieję, że zbiegnie się to w miejscu, w którym entropia krzyżowa jest minimalna, chociaż nic nie gwarantuje, że to minimum jest unikalne.

Mini-batching i dynamika
Możesz obliczyć gradient na podstawie tylko jednego przykładowego obrazu i od razu zaktualizować wagi i odchylenia, ale zrobienie tego na podstawie np. 128 obrazów daje gradient, który lepiej odzwierciedla ograniczenia narzucone przez różne przykładowe obrazy, a tym samym prawdopodobnie szybciej zbiega się do rozwiązania. Rozmiar mini-partii jest parametrem, który można dostosować.
Ta technika, czasami nazywana „stochastycznym spadkiem gradientu”, ma jeszcze jedną, bardziej praktyczną zaletę: praca z partiami oznacza też pracę z większymi macierzami, które zwykle łatwiej jest optymalizować na GPU i TPU.
Proces zbieżności może być jednak nieco chaotyczny, a nawet zatrzymać się, jeśli wektor gradientu będzie składać się z samych zer. Czy to oznacza, że znaleźliśmy minimum? Nie zawsze. Składnik gradientu może wynosić zero w przypadku wartości minimalnej lub maksymalnej. W przypadku wektora gradientu z milionami elementów, jeśli wszystkie są zerami, prawdopodobieństwo, że każde zero odpowiada minimum, a żadne z nich nie odpowiada punktowi maksimum, jest dość małe. W przestrzeni wielowymiarowej punkty siodłowe są dość powszechne i nie chcemy się na nich zatrzymywać.

Ilustracja: punkt siodłowy. Gradient wynosi 0, ale nie jest minimum we wszystkich kierunkach. (Atrybucja obrazu: Wikimedia: By Nicoguaro - Own work, CC BY 3.0)
Rozwiązaniem jest dodanie do algorytmu optymalizacji pewnego rozpędu, aby mógł on przechodzić przez punkty siodłowe bez zatrzymywania się.
Słownik
wsadowe lub miniwsadowe: trenowanie jest zawsze przeprowadzane na partiach danych treningowych i etykiet. Ułatwia to algorytmowi zbieżność. Wymiar „batch” jest zwykle pierwszym wymiarem 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 straty często używana w klasyfikatorach.
warstwa gęsta: warstwa neuronów, w której każdy neuron jest połączony ze wszystkimi neuronami w poprzedniej warstwie.
cechy: dane wejściowe sieci neuronowej są czasami nazywane „cechami”. Sztuka określania, które części zbioru danych (lub ich kombinacje) należy przekazać do sieci neuronowej, aby uzyskać dobre prognozy, jest nazywana „inżynierią cech”.
etykiety: inna nazwa „klas” lub prawidłowych odpowiedzi w problemie klasyfikacji nadzorowanej.
Tempo uczenia się: ułamek gradientu, o który wagi i odchylenia są aktualizowane w każdej iteracji pętli trenowania.
Logity: wyniki warstwy neuronów przed zastosowaniem funkcji aktywacji są nazywane „logitami”. Pochodzi od „funkcji logistycznej”, czyli „funkcji sigmoidalnej”, która była najpopularniejszą funkcją aktywacji. „Neuron outputs before logistic function” (Wyniki neuronu przed funkcją logistyczną) skrócono do „logits” (logity).
funkcja straty: funkcja błędu porównująca dane wyjściowe sieci neuronowej z prawidłowymi odpowiedziami;
Neuron: oblicza ważoną sumę danych wejściowych, dodaje odchylenie i przekazuje wynik do funkcji aktywacji.
Kodowanie 1 z n: klasa 3 z 5 jest kodowana jako wektor 5 elementów, z których wszystkie są zerami z wyjątkiem 3 elementu, który ma wartość 1.
relu: jednostka liniowa z prostownikiem. Popularna funkcja aktywacji neuronów.
sigmoid: kolejna funkcja aktywacji, która była kiedyś popularna i nadal jest przydatna w szczególnych przypadkach.
softmax: specjalna funkcja aktywacji, która działa na wektor, zwiększa różnicę między największym komponentem a wszystkimi pozostałymi, a także normalizuje wektor, aby jego suma wynosiła 1, dzięki czemu można go interpretować jako wektor prawdopodobieństw. Używana jako ostatni krok w klasyfikatorach.
tensor: „tensor” to macierz o dowolnej liczbie wymiarów. Tensor 1-wymiarowy to wektor. Tensor 2-wymiarowy to macierz. Możesz też mieć tensory o 3, 4, 5 lub większej liczbie wymiarów.
4. Transfer Learning
W przypadku problemu z klasyfikacją obrazów warstwy gęste prawdopodobnie nie wystarczą. Musimy poznać warstwy konwolucyjne i wiele sposobów ich rozmieszczenia.
Możemy jednak pójść na skróty. Możesz pobrać w pełni wytrenowane splotowe sieci neuronowe. Możesz odciąć ostatnią warstwę, czyli głowicę 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ę uczeniem przez przenoszenie i działa, o ile zbiór danych, na którym sieć neuronowa jest wstępnie trenowana, jest „wystarczająco podobny” do Twojego.
Praktyczne
Otwórz ten notatnik, uruchom komórki (Shift-ENTER) i postępuj zgodnie z instrukcjami, gdy zobaczysz etykietę „WORK REQUIRED”.
Keras Flowers transfer learning (playground).ipynb
Informacje dodatkowe
Dzięki uczeniu przez przenoszenie możesz korzystać zarówno z zaawansowanych architektur konwolucyjnych sieci neuronowych opracowanych przez najlepszych badaczy, jak i z wstępnego trenowania na ogromnym zbiorze danych obrazów. W naszym przypadku wykorzystamy uczenie przez przenoszenie wiedzy z sieci wytrenowanej na zbiorze danych ImageNet, czyli bazie obrazów zawierającej wiele roślin i scen na zewnątrz, które są wystarczająco podobne do kwiatów.

Ilustracja: używanie złożonej, wytrenowanej już konwolucyjnej sieci neuronowej jako czarnej skrzynki i ponowne trenowanie tylko głowicy klasyfikacji. To jest uczenie transferowe. Później zobaczymy, jak działają te skomplikowane układy warstw konwolucyjnych. Na razie to nie mój problem.
Uczenie się przez transfer w Keras
W Keras możesz utworzyć instancję wstępnie wytrenowanego modelu z kolekcji tf.keras.applications.*. Na przykład MobileNet V2 to bardzo dobra architektura konwolucyjna, która ma rozsądny rozmiar. Wybierając include_top=False, otrzymasz wstępnie wytrenowany model bez ostatniej warstwy softmax, dzięki czemu możesz dodać własną:
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. Zamraża wagi i odchylenia wytrenowanego modelu, dzięki czemu trenujesz tylko warstwę softmax. Zwykle obejmuje to stosunkowo niewiele wag i można to zrobić szybko bez konieczności korzystania z bardzo dużego zbioru danych. Jeśli jednak masz dużo danych, uczenie przez przenoszenie może działać jeszcze lepiej w przypadku pretrained_model.trainable = True. Wstępnie wytrenowane wagi zapewniają doskonałe wartości początkowe i mogą być nadal dostosowywane przez trenowanie, aby lepiej pasować do Twojego problemu.
Zwróć uwagę na warstwę Flatten() wstawioną przed warstwą gęstą softmax. Warstwy gęste działają na płaskich wektorach danych, ale nie wiemy, czy model wstępnie wytrenowany zwraca takie dane. Dlatego musimy spłaszczyć tę krzywą. W następnym rozdziale, w którym omówimy architektury konwolucyjne, wyjaśnimy format danych zwracanych przez warstwy konwolucyjne.
Dzięki tej metodzie powinnaś uzyskać dokładność na poziomie około 75%.
Rozwiązanie
Oto notatnik z rozwiązaniem. Możesz z niej skorzystać, jeśli utkniesz w martwym punkcie.
Keras Flowers transfer learning (solution).ipynb
Omówione zagadnienia
- 🤔 Jak napisać klasyfikator w Keras
- 🤓 skonfigurowany z ostatnią warstwą softmax i funkcją straty entropii krzyżowej,
- 😈 Uczenie się przez transfer
- 🤔 Trenowanie pierwszego modelu
- 🧐 śledzenie utraty i dokładności podczas trenowania,
Poświęć chwilę na przejrzenie tej listy kontrolnej.
5. Gratulacje!
Możesz teraz utworzyć model Keras. Aby dowiedzieć się, jak tworzyć warstwy konwolucyjne, przejdź do następnego modułu.
- Potoki danych o szybkości TPU: tf.data.Dataset i TFRecords
- [TO ĆWICZENIE] Pierwszy model Keras z uczeniem transferowym
- Konwolucyjne sieci neuronowe z użyciem Keras i TPU
- Nowoczesne sieci konwolucyjne, SqueezeNet i Xception z użyciem Keras i TPU
TPU w praktyce
TPU i GPU są dostępne na AI Platform w Google Cloud:
- Na maszynach wirtualnych do deep learningu
- W sekcji Notatniki w AI Platform
- W zadaniach trenowania w AI Platform
Na koniec dodamy, że chętnie poznamy Twoją opinię. Jeśli zauważysz w tym module coś nieprawidłowego lub uważasz, że można go ulepszyć, daj nam znać. Opinie można przesyłać za pomocą zgłoszeń w GitHub [link do opinii].

|

