TensorFlow, Keras i deep learning bez doktora

1. Omówienie

Ten samouczek został zaktualizowany pod kątem Tensorflow 2.2.

74f6fbd758bf19e6.png

Z tego ćwiczenia w Codelabs dowiesz się, jak zbudować i wytrenować sieć neuronowa, która będzie rozpoznawać odręczne cyfry. W miarę rozwijania sieci neuronowej do osiągnięcia dokładności na poziomie 99% odkryjesz też narzędzia przydatne w branży, których profesjonaliści używają deep learningu do efektywnego trenowania swoich modeli.

W ramach tych ćwiczeń w programie wykorzystano zbiór danych MNIST, czyli zbiór 60 tys. cyfr oznaczonych etykietami, który od niemal 2 dekad sprawia, że prace doktoranckie są zajęte. Rozwiąż problem, używając mniej niż 100 wierszy kodu Pythona lub TensorFlow.

Czego się nauczysz

  • Co to jest sieć neuronowa i jak ją trenować
  • Jak zbudować podstawową 1-warstwową sieć neuronowa przy użyciu tf.keras
  • Jak dodać więcej warstw
  • Jak skonfigurować harmonogram tempa uczenia się
  • Jak budować splotowe sieci neuronowe
  • Jak korzystać z technik regularyzacji: porzucenie, normalizacja wsadowa
  • Co jest nadmiernym dopasowaniem

Czego potrzebujesz

Tylko przeglądarka. Te warsztaty można w całości przeprowadzić przy użyciu Google Colaboratory.

Prześlij opinię

Daj nam znać, jeśli zauważysz, że w tym module coś jest nie tak lub jeśli uważasz, że coś jest nie tak. Opinie przekazujemy poprzez GitHub [feedback link].

2. Krótki przewodnik po Google Colaboratory

To moduł korzysta z Google Colaboratory i nie wymaga żadnej konfiguracji. Możesz go uruchomić z Chromebooka. Aby zapoznać się z notatnikami Colab, otwórz plik poniżej i uruchom te komórki.

c3df49e90e5a654f.png Welcome to Colab.ipynb

Dodatkowe instrukcje poniżej:

Wybierz backend z GPU

hsy7H7O5qJNvKcRnHRiZoyh0Iznlzmr

W menu Colab wybierz Środowisko wykonawcze > Zmień typ środowiska wykonawczego i wybierz GPU. Połączenie ze środowiskiem wykonawczym następuje automatycznie przy pierwszym uruchomieniu. Możesz też skorzystać z opcji „Połącz” w prawym górnym rogu.

Wykonywanie notatnika

evlBKSO15ImjocdEcsIo8unzEe6oDGYnKFe8CoHS_7QiP3sDbrs2jB6lbyitEtE7Gt_1UsCdU5dJA-_2IgBWh9ofYf4yVDE740PwJ6kiQwuXNOLkgktzzf0E_k5VN5mq29ZXI5wb7Q

Uruchomienie komórki po kolei przez kliknięcie komórki i naciśnięcie klawiszy Shift+ENTER. Możesz też uruchomić cały notatnik, wybierając Środowisko wykonawcze > Uruchom wszystko

Spis treści

OXeYYbtKdLCNnw_xovSMeMwSdD7CL_w25EfhnpRhhhO44bYp3zZpU72J5tKaSuo8wpas0GK5B2sTBlIMiFmdGxFRQ9NmwJ7JIRYy5XtpWKQCPdxQVRPy_0J_LshGIKjtw8P9fXozaA

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

Ukryte komórki

GXTbXUO8xpPFKiGc6Q-cFwFHxHvOa105hHg3vk77EDpStyhU4AQMN3FYenbiBusHXUSk-yGXbRDcK-Cwx18XbDtyqB5WRr3_2jhnLvFxW8a7H_4cGvVDKrEMto_QxhfTeO0hwmrfng

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 wspomagające lub wizualizacyjne. Nadal musisz uruchomić te komórki, aby zdefiniować funkcje znajdujące się w nich.

3. Wytrenuj sieć neuronowa

Najpierw zobaczymy pociąg sieci neuronowej. Otwórz notatnik poniżej i przejrzyj wszystkie komórki. Nie zwracaj jeszcze uwagi na kod. Wyjaśnimy go później.

c3df49e90e5a654f.png keras_01_mnist.ipynb

Wykonując notatnik, skup się na wizualizacjach. Poniżej znajdziesz wyjaśnienia.

Dane treningowe

Mamy zbiór danych składających się z odręcznych cyfr, które zostały oznaczone etykietami, tak aby wiemy, co reprezentuje każdy obraz (czyli liczby od 0 do 9). W notatniku zobaczysz taki fragment:

ad83f98e56054737.png

Stworzona przez nas sieć neuronowa klasyfikuje odręczne cyfry w 10 klasach (0, .., 9). Dzieje się tak na podstawie parametrów wewnętrznych, które muszą mieć odpowiednią wartość, aby klasyfikacja działała prawidłowo. „Prawidłowa wartość”. jest opanowany przez proces trenowania, który wymaga „zbioru danych z etykietami” z obrazkami i powiązanymi poprawnymi odpowiedziami.

Skąd wiadomo, czy wytrenowana sieć neuronowa działa dobrze? Użycie zbioru danych treningowych do testowania sieci stanowiłoby oszustwo. Już widziała ten zbiór danych wiele razy podczas trenowania i na pewno działa bardzo wydajnie. Aby ocenić „rzeczywisty” zbiór danych, potrzebujemy innego oznaczonego etykietami zbioru danych, który nigdy nie był widoczny podczas trenowania. wydajność sieci. Nazywa się go „zbiorem danych do weryfikacji”.

Szkolenia

W miarę postępu trenowania porcja danych treningowych pojedynczo jest aktualizowana, a model staje się coraz lepszy w rozpoznawaniu odręcznych cyfr. Możesz to zobaczyć na wykresie treningowym:

3f7b405649301ea

Po prawej stronie „dokładność” to po prostu procent poprawnie rozpoznanych cyfr. Ta wartość zwiększa się w miarę postępów trenowania.

Po lewej stronie widoczny jest symbol „strata”. Aby wspomóc szkolenie, określimy „strata”. która pokazuje, jak dobrze system rozpoznaje cyfry i próbuje je zminimalizować. Jak widać, straty zmniejszają się zarówno w przypadku danych do trenowania, jak i danych weryfikacyjnych w miarę postępów trenowania. To świetnie. To oznacza, że sieć neuronowa się uczy.

Oś X przedstawia liczbę „epoek”. lub iteracji w całym zbiorze danych.

Prognozy

Po wytrenowaniu modelu możemy go używać do rozpoznawania odręcznych cyfr. Na następnej wizualizacji widać jej skuteczność na kilku cyfrach renderowanych z czcionek lokalnych (pierwszy wiersz), a następnie na 10 tys. cyfr zbioru danych do weryfikacji. Pod każdą cyfrą pojawi się przewidywana klasa, jeśli się pomylisz, na czerwono.

c0699216ba0effdb.png

Jak widać, ten początkowy model nie jest zbyt dobry, ale nadal poprawnie rozpoznaje niektóre cyfry. Ostateczna dokładność walidacji wynosi około 90%, co nie jest aż tak dobre dla uproszczonego modelu, od którego zaczynamy, ale i tak oznacza, że nie spełnia 1000 cyfr z 10 000. Tyle można wyświetlić, dlatego wygląda na to, że wszystkie odpowiedzi (na czerwono) są błędne.

Tensory

Dane są przechowywane w macierzy. Obraz w skali szarości o wymiarach 28 x 28 pikseli mieści się w dwuwymiarowej macierzy 28 x 28. Jednak w przypadku obrazu kolorowego potrzebujemy więcej wymiarów. Każdy piksel ma 3 wartości koloru (czerwony, zielony, niebieski), więc potrzebna jest trójwymiarowa tabela o wymiarach [28, 28, 3]. Z kolei do przechowywania grupy 128 kolorowych obrazów potrzebna jest tabela czterowymiarowa o wymiarach [128, 28, 28, 3].

Tabele te nazywane są „tensorami”, a lista ich wymiarów to ich „kształt”.

4. [INFO]: sieci neuronowe

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 przygodę z technologią deep learning, witamy w serwisie i czytaj dalej.

witch.png

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

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[28, 28, 1]),
    tf.keras.layers.Dense(200, activation="relu"),
    tf.keras.layers.Dense(60, activation="relu"),
    tf.keras.layers.Dense(10, activation='softmax') # classifying into 10 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

Pojedyncza gęsta warstwa

Odręczne cyfry w zbiorze danych MNIST to obrazy w skali szarości o wymiarach 28 x 28 pikseli. Najprostszym sposobem ich sklasyfikowania jest użycie jako danych wejściowych dla jednowarstwowej sieci 28 x 28=784 pikseli.

Zrzut ekranu 2016-07-26 at 12.32.24.png

Każdy „neuron” w sieci neuronowej dokonuje ważonej sumy wszystkich swoich danych wejściowych, dodając stałą zwaną „uprzedzenia” a następnie wprowadza do wyników jakąś nieliniową „funkcję aktywacji”. „wagi” i „uchylenia” to parametry, które zostaną określone podczas trenowania. Początkowo są one inicjowane losowymi wartościami.

Powyższy obraz przedstawia jednowarstwową sieć neurońską z 10 neuronami wyjściowymi, ponieważ chcemy sklasyfikować cyfry na 10 klas (od 0 do 9).

Za pomocą mnożenia macierzy

Oto jak warstwa sieci neuronowej, która przetwarza zbiór obrazów, można zobrazować mnożeniem macierzy:

matmul.gif

Wykorzystując pierwszą kolumnę wag w macierzy W, obliczamy ważoną sumę wszystkich pikseli pierwszego obrazu. Ta suma odpowiada pierwszemu neuronie. Korzystając z drugiej kolumny wag, robimy to samo dla drugiego neuronu i tak dalej aż do dziesiątego neuronu. Możemy wtedy powtórzyć operację dla pozostałych 99 zdjęć. Jeśli nazywamy X macierzą zawierającą 100 obrazów, wszystkie ważone sumy 10 neuronów obliczone na 100 obrazach to po prostu X, W, czyli mnożenie macierzy.

Każdy neuron musi teraz dodać swoje odchylenie (stałą). Ponieważ mamy 10 neuronów, mamy 10 stałych uprzedzeń. Nazwijmy ten wektor o 10 wartościach b. Należy ją dodać do każdego wiersza wcześniej obliczonej macierzy. Używanie magii zwanej „transmitowaniem” wpiszemy to za pomocą prostego znaku plusa.

Na koniec stosujemy funkcję aktywacji, na przykład „softmax”. (wyjaśniono poniżej) i otrzymaj wzór opisujący jednowarstwową sieć neuronowa, stosowany do 100 obrazów:

Zrzut ekranu 2016-07-26 at 16.02.36.png

W Keraście

Dzięki bibliotekom sieci neuronowych wysokiego poziomu, takim jak Keras, nie musimy wdrażać tej formuły. Trzeba jednak pamiętać, że warstwa sieci neuronowej to tylko kilka mnożników i dodatkowych elementów. W Keras gęsta warstwa wyglądałaby następująco:

tf.keras.layers.Dense(10, activation='softmax')

Zapoznaj się z treścią

Tworzenie łańcuchowych warstw sieci neuronowych jest proste. Pierwsza warstwa oblicza ważone sumy pikseli. Kolejne warstwy obliczają ważone sumy danych wyjściowych poprzednich warstw.

fba0638cc213a29.png

Jedyną różnicą, oprócz liczby neuronów, będzie wybór funkcji aktywacji.

Funkcje aktywujące: relu, softmax i sigmoid

Parametr „relu” jest zwykle aktywacji dla wszystkich warstw oprócz ostatniej. Ostatnia warstwa w klasyfikatorze używałaby parametru „softmax” aktywacji.

644f4213a4ee70e5.png

I znowu, „neuron”, oblicza ważoną sumę wszystkich jego danych wejściowych i dodaje wartość zwaną „odchyleniem” i przekazuje wynik przy użyciu funkcji aktywacji.

Najpopularniejsza funkcja aktywacji nosi nazwę „RELU” w przypadku prostopadłej jednostki liniowej. Jest to bardzo prosta funkcja, jak widać na wykresie powyżej.

Tradycyjną funkcją aktywacyjną w sieciach neuronowych była „sigmoid”, ale „relu” ma lepsze właściwości zbieżności niemal wszędzie i jest teraz preferowany.

41fc82288c4aff5d.png

Aktywacja Softmax na potrzeby klasyfikacji

Ostatnia warstwa naszej sieci neuronowej ma 10 neuronów, ponieważ chcemy sklasyfikować odręczne cyfry na 10 klas (0,...9). Powinna wyświetlić się 10 liczb z zakresu od 0 do 1, które reprezentują prawdopodobieństwo, że dana cyfra to 0, 1, 2 itd. W tym celu w ostatniej warstwie użyjemy funkcji aktywacji o nazwie „softmax”.

Zastosowanie funkcji softmax do wektora polega na podzieleniu wykładniczej wartości każdego pierwiastka, a następnie normalizacji wektora, zazwyczaj przez podzielenie go przez wartość „L1”. norma (tj. suma wartości bezwzględnych), aby znormalizowane wartości sumowały się do 1 i można je było zinterpretować jako prawdopodobieństwa.

Dane wyjściowe ostatniej warstwy, przed aktywacją, są czasami nazywane „logit”. Jeśli ten wektor ma postać L = [L0, L1, L2, L3, L4, L5, L6, L7, L8, L9], to:

ef0d98c0952c262d.png d51252f75894479e.gif

Utrata entropii krzyżowej

Skoro nasza sieć neuronowa generuje prognozy na podstawie obrazów wejściowych, musimy sprawdzić, na ile są dobre, czyli odległość między informacjami z sieci a prawidłowymi odpowiedziami, często nazywanymi „etykietami”. Pamiętaj, że wszystkie obrazy w zbiorze danych mają prawidłowe etykiety.

Każda odległość byłaby odpowiednia, ale dla problemów klasyfikacyjnych można zastosować tak zwaną „dystans entropii krzyżowej” jest najskuteczniejszy. Nazywamy to błędem lub stratą. funkcja:

6dbba1bce3cadc36.png

Efekt gradientu

„Szkolenie” sieć neuronowa faktycznie polega na używaniu obrazów i etykiet treningowych do korygowania 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 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 TensorFlow. Matematyczną właściwością gradientu jest to, że wskazuje on „do góry”. Chcemy dotrzeć tam, gdzie entropia krzyżowa jest niska, więc idziemy w przeciwną stronę. Wagi i odchylenia aktualizujemy według części gradientu. Następnie robimy to samo w pętli trenowania z kolejnymi partiami obrazów i etykiet do trenowania. Mamy nadzieję, że zjawisko to zbiega się w miejsce, w którym entropia krzyżowa jest minimalna, ale nic nie gwarantuje, że ta minimalna wartość będzie unikalna.

gradient 2.png

Mini-bateria 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. Wielkość minigrupy, którą można dostosować, jest parametrem.

Technika ta, czasem nazywana „stochastycznym gradientem”, ma jeszcze jedną, bardziej pragmatyczną zaletę: praca z wsadami oznacza również pracę z większymi macierzami, które zwykle łatwiej można 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 przestrzeni obejmującej wiele wymiarów siedziska są dość powszechne i nie chcemy na nich poprzestać.

cc544924671fa208.png

Ilustracja: siodło Gradient wynosi 0, ale nie jest on minimalny we wszystkich kierunkach. (Źródło grafiki: Wikimedia: By Nicoguaro – własne materiały, CC BY 3.0)

Rozwiązaniem jest dodanie pewnego pędu do algorytmu optymalizacji, tak aby mógł bez wahania pokonywać kolejne etapy.

Słownik

zbiorcze lub małowsadowe: trenowanie jest zawsze wykonywane na grupach danych i etykiet do trenowania. Ułatwia to stosowanie algorytmu. Grupa „zbiorcza” jest zwykle pierwszym wymiarem tensorów danych. Na przykład tensor kształtu [100, 192, 192, 3] zawiera 100 obrazów o wymiarach 192 x 192 piksele, z 3 wartościami na piksel (RGB).

Utrata entropii krzyżowej: specjalna funkcja straty często używana w klasyfikatorach.

gęsta warstwa: 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 „zajęć” lub popraw odpowiedzi w rozwiązywaniu zadań z klasyfikacją nadzorowaną

szybkość uczenia się: odsetek gradientu, według którego wagi i odchylenia są aktualizowane w każdej iteracji pętli trenowania.

logits: dane wyjściowe warstwy neuronów przed zastosowaniem funkcji aktywacji są nazywane „logitami”. Termin pochodzi z „funkcji logistycznej” inaczej „funkcja sigmoidalna” która była najpopularniejszą funkcją aktywacyjną. „Dane wyjściowe Neuron przed funkcją logistyki” została skrócona do „logits”.

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

neuron: oblicza ważoną sumę swoich danych wejściowych, dodaje odchylenie i dostarcza wynik przy użyciu funkcji aktywacji.

kodowanie jednorazowe: 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. Używany jako ostatni krok w klasyfikatorach.

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

5. Przejdźmy do kodu

Wróćmy do notatnika badania. Tym razem przeczytajmy kod.

c3df49e90e5a654f.png keras_01_mnist.ipynb

Przyjrzyjmy się całej komórce w notatniku.

Komórka „Parametry”

Tutaj zdefiniowano rozmiar wsadu, liczbę epok trenowania i lokalizację plików danych. Pliki danych są przechowywane w zasobniku Google Cloud Storage (GCS), dlatego ich adres zaczyna się od gs://

Komórka „Importy”

Tutaj zostaną zaimportowane wszystkie niezbędne biblioteki Pythona, w tym TensorFlow oraz matplotlib na potrzeby wizualizacji.

Komórka „Narzędzia do wizualizacji [RUN ME]****”

Ta komórka zawiera nieciekawy kod wizualizacji. Jest ona domyślnie zwinięta, ale możesz ją otworzyć i zobaczyć kod w wolnej chwili, klikając go dwukrotnie.

Komórka „tf.data.Dataset: przeanalizuj pliki i przygotuj zbiory danych do trenowania i walidacji

W tej komórce użyto interfejsu tf.data.Dataset API do wczytania zbioru danych MNIST z plików danych. Nie musisz spędzać w niej zbyt dużo czasu. Jeśli interesuje Cię interfejs tf.data.Dataset API, zapoznaj się z samouczkiem, który go wyjaśnia: Potoki danych z szybkością TPU. Podstawowe informacje to:

Obrazy i etykiety (prawidłowe odpowiedzi) ze zbioru danych MNIST są przechowywane w rekordach o stałej długości w 4 plikach. Pliki mogą być wczytywane za pomocą dedykowanej funkcji nagrywania stałego:

imagedataset = tf.data.FixedLengthRecordDataset(image_filename, 28*28, header_bytes=16)

Dysponujemy teraz zbiorem danych składających się z bajtów obrazów. Należy je zdekodować na obrazy. Definiujemy funkcję służącą do tego celu. Obraz nie jest kompresowany, więc funkcja nie musi niczego dekodować (decode_raw właściwie nic nie robi). Obraz jest następnie konwertowany na wartości zmiennoprzecinkowe z zakresu od 0 do 1. Moglibyśmy przekształcić go w obraz 2D, ale w rzeczywistości zachowujemy go w postaci płaskiej tablicy pikseli o rozmiarze 28 x 28, ponieważ tego oczekuje nasza gęsta warstwa.

def read_image(tf_bytestring):
    image = tf.io.decode_raw(tf_bytestring, tf.uint8)
    image = tf.cast(image, tf.float32)/256.0
    image = tf.reshape(image, [28*28])
    return image

Stosujemy tę funkcję do zbioru danych za pomocą metody .map i uzyskujemy zbiór danych z obrazami:

imagedataset = imagedataset.map(read_image, num_parallel_calls=16)

Odczytujemy i dekodujemy etykiety w ten sam sposób, a obrazy i etykiety .zip wybieramy razem:

dataset = tf.data.Dataset.zip((imagedataset, labelsdataset))

Mamy teraz zbiór danych składających się z par (obraz, etykieta). Tego oczekujemy od naszego modelu. Nie jesteśmy jeszcze gotowi do użycia go w funkcji trenowania:

dataset = dataset.cache()
dataset = dataset.shuffle(5000, reshuffle_each_iteration=True)
dataset = dataset.repeat()
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

Interfejs tf.data.Dataset API ma wszystkie funkcje potrzebne do przygotowywania zbiorów danych:

.cache buforuje zbiór danych w pamięci RAM. To niewielki zbiór danych, więc będzie działać. .shuffle losuje ją z buforem zawierającym 5000 elementów. Ważne jest, aby dane treningowe były dobrze pomieszane. .repeat zapętla zbiór danych. Będziemy z niej trenować wiele razy (w wielu epokach). .batch łączy w małą grupę obrazy i etykiety. Na koniec .prefetch może użyć procesora, aby przygotować następną wsad podczas trenowania bieżącego wsadu w GPU.

Zbiór danych do weryfikacji jest przygotowywany w podobny sposób. Teraz możemy zdefiniować model i wykorzystać ten zbiór danych do jego trenowania.

Komórka „Keras Model”

Wszystkie nasze modele będą prostymi sekwencjami warstw, aby można było je utworzyć za pomocą stylu tf.keras.Sequential. Początkowo jest to pojedyncza gęsta warstwa. Składa się z 10 neuronów, ponieważ dzielimy odręczne cyfry na 10 klas. Wykorzystywane jest ustawienie „softmax” aktywacji, ponieważ jest to ostatnia warstwa w klasyfikatorze.

Model Keras musi również znać kształt swoich danych wejściowych. Do zdefiniowania można użyć atrybutu tf.keras.layers.Input. W tym przypadku wektory wejściowe są płaskimi wektorami o długości 28*28 pikseli.

model = tf.keras.Sequential(
  [
    tf.keras.layers.Input(shape=(28*28,)),
    tf.keras.layers.Dense(10, activation='softmax')
  ])

model.compile(optimizer='sgd',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# print model layers
model.summary()

# utility callback that displays training curves
plot_training = PlotTraining(sample_rate=10, zoom=1)

Konfigurowanie modelu odbywa się w Keras za pomocą funkcji model.compile. Tutaj używamy podstawowego optymalizatora 'sgd' (stochastyczny gradient gradientowy). Model klasyfikacji wymaga funkcji straty krzyżowej o nazwie 'categorical_crossentropy' w Keras. Na koniec prosimy model o obliczenie danych 'accuracy', czyli odsetka prawidłowo sklasyfikowanych obrazów.

Keras oferuje przydatne narzędzie model.summary(), które drukuje szczegóły utworzonego modelu. Nauczyciel rodzaju dodał narzędzie PlotTraining (zdefiniowane w komórce „narzędzia do wizualizacji”), które wyświetla różne krzywe do trenowania podczas trenowania.

Komórka „Wytrenuj i zweryfikuj model”

W tym miejscu odbywa się trenowanie przez wywołanie metody model.fit i przekazywanie zbiorów danych do trenowania i weryfikacji. Domyślnie Keras przeprowadza rundę weryfikacji na końcu każdej epoki.

model.fit(training_dataset, steps_per_epoch=steps_per_epoch, epochs=EPOCHS,
          validation_data=validation_dataset, validation_steps=1,
          callbacks=[plot_training])

W Keras można używać wywołań zwrotnych, aby dodawać podczas trenowania niestandardowe zachowania. W ten sposób wdrożyliśmy dynamicznie aktualizowany plan szkolenia na potrzeby tych warsztatów.

Komórka „Wizualizacja prognoz”

Po wytrenowaniu modelu możemy uzyskać z niego prognozy, wywołując funkcję model.predict():

probabilities = model.predict(font_digits, steps=1)
predicted_labels = np.argmax(probabilities, axis=1)

Przygotowaliśmy w ramach testu zestaw drukowanych cyfr renderowanych z lokalnych czcionek. Pamiętaj, że sieć neuronowa zwraca wektor 10 prawdopodobieństw od ostatecznej wartości parametru „softmax”. Aby uzyskać etykietę, musimy ustalić, które prawdopodobieństwo jest najwyższe. np.argmax z biblioteki numpy.

Aby zrozumieć, dlaczego wymagany jest parametr axis=1, pamiętaj, że przetworzyliśmy grupę 128 obrazów i dlatego model zwraca 128 wektorów prawdopodobieństw. Kształt tensora wyjściowego to [128, 10]. Obliczamy wartość argumentu argmax na podstawie 10 prawdopodobieństw zwracanych dla każdego obrazu, więc axis=1 (pierwsza oś to 0).

Ten prosty model rozpoznaje już 90% cyfr. Nieźle, ale teraz znacznie poprawisz tę jakość.

396c54ef66fad27f.png

6. Dodawanie warstw

godeep.png

Aby zwiększyć dokładność rozpoznawania, dodamy więcej warstw do sieci neuronowej.

Zrzut ekranu 2016-07-27 at 15.36.55.png

Na ostatniej warstwie pozostawiamy funkcję aktywacji softmax, ponieważ to ona najlepiej sprawdza się w przypadku klasyfikacji. W warstwach pośrednich użyjemy jednak najbardziej klasycznej funkcji aktywacji: sigmoida:

41fc82288c4aff5d.png

Model może na przykład wyglądać w ten sposób (nie zapomnij o przecinkach – tf.keras.Sequential ma rozdzielaną przecinkami listę warstw):

model = tf.keras.Sequential(
  [
      tf.keras.layers.Input(shape=(28*28,)),
      tf.keras.layers.Dense(200, activation='sigmoid'),
      tf.keras.layers.Dense(60, activation='sigmoid'),
      tf.keras.layers.Dense(10, activation='softmax')
  ])

Spójrz na „podsumowanie” z Twojego modelu. Ma teraz co najmniej 10 razy więcej parametrów. To powinno być 10 razy lepsze! Jednak z jakiegoś powodu nie jest ...

5236f91ba6e07d85.png

Wygląda na to, że straty też przebiły się przez dach. Coś jest nie tak.

7. Szczególna opieka nad precyzyjnymi sieciami

Właśnie udało Ci się odkryć sieci neuronowe znane z ich projektowania w latach 80. i 90. ubiegłego wieku. Nic dziwnego, że zrezygnowali z tego pomysłu i zapoczątkowaliśmy tzw. „zimę AI”. W miarę dodawania warstw sieci neuronowe coraz trudniej się ze sobą połączyć.

Okazuje się, że głębokie sieci neuronowe z wieloma warstwami (dzisiejsze 20, 50, a nawet 100) mogą się bardzo dobrze sprawdzić, stosując parę matematycznych sztuczek, które ujednolicić je ze sobą. Odkrycie tych prostych sztuczek było jedną z przyczyn renesansu deep learning w latach 2010–2019.

Aktywacja RELU

relu.png

W przypadku głębokich sieci funkcja aktywacji sigmoidalnej jest dość problematyczna. Zmniejsza to wszystkie wartości z zakresu od 0 do 1 i przy powtarzaniu tych działań dane wyjściowe neuronów i ich gradienty mogą całkowicie zniknąć. Wspomniano o nim ze względów historycznych, ale nowoczesne sieci używają zrektyfikowanej jednostki liniowej RELU (Rectified Linear Unit), które wyglądają tak:

1abce89f7143a69c.png

Z drugiej strony atrybut relu ma pochodną 1, przynajmniej po swojej prawej stronie. Dzięki aktywacji RELU, nawet jeśli gradienty pochodzące z niektórych neuronów mogą mieć wartość zero, zawsze będą jakieś gradienty niezerowe, a trenowanie będzie przebiegać w dobrym tempie.

Lepszy optymalizator

W bardzo dużych przestrzeniach, takich jak tutaj, mamy rzędu 10 tys. wag i odchyleń – „punkty siodłonne” są bardzo częste. Są to punkty, które nie są lokalnymi minimami, ale gradient wynosi zero i optymalizator opadania gradientu zatrzymuje się tam. TensorFlow ma pełną gamę dostępnych optymalizatorów, w tym takich, które działają z pewną bezwładnością i bezpiecznie pokonują siodło.

Inicjalizacje losowe

Sztuka inicjowania uprzedzeń wagowych przed trenowaniem stanowi dziedzinę badań samą w sobie, ponieważ na ten temat opublikowano wiele artykułów. Listę wszystkich inicjatorów dostępnych w Kera znajdziesz tutaj. Na szczęście Keras domyślnie działa poprawnie i używa inicjatora 'glorot_uniform', który sprawdza się niemal we wszystkich przypadkach.

Nie musisz nic robić, ponieważ Keras robi to, co trzeba.

NaN ???

Wzór na entropię krzyżową obejmuje logarytm, a log(0) nie jest liczbą (NaN, czyli awaria numeryczna, jeśli wolisz). Czy dane wejściowe dla entropii krzyżowej mogą wynosić 0? Dane wejściowe pochodzą z funkcji softmax, która jest zasadą wykładniczą, a jej wartość wykładnicza nigdy nie wynosi zero. Tak więc nic nam nie grozi!

Naprawdę? W pięknym świecie matematyki bylibyśmy bezpieczni, ale w świecie komputerów exp(-150) przedstawione w formacie float32 nie jest aż tak banalne, jak i zapada w pamięć entropii krzyżowej.

Na szczęście nie musisz nic robić w tym przypadku, ponieważ Keras zajmuje się tym zadaniem i przelicza parametry softmax, po których następuje entropia krzyżowa, w szczególnie ostrożny sposób, aby zapewnić stabilność liczbową i uniknąć groźnych NaN.

Gotowe?

e1521c9dd936d9bc.png

Dokładność powinna wynosić 97%. Celem tych warsztatów jest osiągnięcie znacznie powyżej 99%, więc róbmy to tak dalej.

Jeśli napotkasz problem, oto rozwiązanie tego problemu:

c3df49e90e5a654f.png keras_02_mnist_dense.ipynb

8. Spadek tempa uczenia się

Może spróbujemy poćwiczyć szybciej? Domyślne tempo uczenia się w optymalizatorze Adama wynosi 0,001. Spróbujmy go zwiększyć.

Szybsze przyspieszenie raczej nie pomaga. Co to za szum?

d4fd66346d7c480e.png

Krzywe treningowe są naprawdę zagłośne i przyjmują obie krzywe walidacji: skaczą w górę i w dół. To oznacza, że działamy za szybko. Możemy wrócić do poprzednich ustawień, ale jest lepsze rozwiązanie.

spowolnienie.png

Dobrym rozwiązaniem jest szybkie rozpoczęcie nauki i znaczne spadek tempa uczenia się. W Keras możesz to zrobić za pomocą wywołania zwrotnego tf.keras.callbacks.LearningRateScheduler.

Przydatny kod do kopiowania i wklejania:

# lr decay function
def lr_decay(epoch):
  return 0.01 * math.pow(0.6, epoch)

# lr schedule callback
lr_decay_callback = tf.keras.callbacks.LearningRateScheduler(lr_decay, verbose=True)

# important to see what you are doing
plot_learning_rate(lr_decay, EPOCHS)

Pamiętaj, aby wykorzystać utworzone przez siebie lr_decay_callback. Dodaj go do listy wywołań zwrotnych w model.fit:

model.fit(...,  callbacks=[plot_training, lr_decay_callback])

Efekty tej drobnej zmiany są spektakularne. Zauważasz, że większość szumu zniknęła, a dokładność testu wynosi teraz ponad 98% w dłuższej perspektywie.

8c1ae90976c4a0c1.png

9. Porzucenia, nadmierne dopasowanie

Wygląda na to, że model dobrze się teraz łączy. Spróbujmy pójść głębiej.

Czy to pomogło?

e36c09a3088104c6.png

Nie, dokładność jest wciąż na poziomie 98% i należy sprawdzić utratę danych. Idzie w górę! Algorytm uczenia się działa tylko na danych treningowych i odpowiednio optymalizuje straty podczas trenowania. Nigdy nie widzi danych walidacji, więc nie jest zaskoczeniem, że po jakimś czasie jego praca nie ma już wpływu na utratę danych walidacji, która przestaje się spadać, a czasem nawet odbija się z powrotem.

Nie wpływa to od razu na rzeczywiste możliwości rozpoznawania modelu, ale zapobiega przeprowadzaniu wielu iteracji i zwykle oznacza, że trenowanie nie przynosi już pozytywnych efektów.

dropout.png

Takie rozłączenie jest zwykle nazywane „nadmiernym dopasowaniem”. A kiedy zobaczysz ten wynik, możesz zastosować technikę regularyzacji zwaną „porzuceniem”. Metoda ta polega na strzelaniu do losowych neuronów przy każdej iteracji treningowej.

Jaki był efekt

43fd33801264743f.png

Znowu pojawia się szum (nie było zaskoczeniem, jak działa porzucanie). Utrata weryfikacji nie wydaje się rosnąć, ale ogólnie jest wyższa niż bez niej. Dokładność weryfikacji nieco spadła. Jest to dość rozczarowujący wynik.

Wygląda na to, że porzucenie nie było odpowiednim rozwiązaniem albo może to być „nadmierne dopasowanie”. to bardziej złożona koncepcja, a niektóre z jej przyczyn nie stanowią podstawy do „porzucenia”. naprawić?

Co oznacza „nadmierne dopasowanie”? Nadmierne dopasowanie ma miejsce, gdy sieć neuronowa uczy się „niewłaściwie”, co sprawdza się w przypadku przykładów treningowych, ale niezbyt dobrze w przypadku danych ze świata rzeczywistego. Istnieją techniki regularyzacji, takie jak porzucenia gry, które mogą zmusić system do lepszej nauki. Pamiętaj jednak, że nadmierne dopasowanie ma głębsze korzenie.

overfitting.png

Podstawowe nadmiarowe dopasowanie ma miejsce, gdy sieć neuronowa ma zbyt wiele stopni swobody dla zgłaszanego problemu. Wyobraź sobie, że mamy tyle neuronów, że sieć może zapisać w nich wszystkie nasze obrazy treningowe i rozpoznać je na podstawie dopasowania do wzorca. W przypadku rzeczywistych danych ich zastosowanie nie byłoby możliwe. Sieć neuronowa musi być w pewien sposób ograniczona, aby została zmuszona do uogólnienia zdobytych informacji podczas trenowania.

Jeśli masz bardzo mało danych treningowych, nawet niewielka sieć może nauczyć się ich na bieżąco, a Ty zobaczysz, że wyniki są przesadnie uniwersalne. Ogólnie rzecz biorąc, do trenowania sieci neuronowych zawsze potrzebujesz dużej ilości danych.

Jeśli masz już za sobą wszystko w ramach książki, poeksperymentujesz z różnymi rozmiarami sieci, aby upewnić się, że ich stopnie swobody są ograniczone, a potem rezygnuje z ich nauki i wytrenowane na podstawie dużej ilości danych. W takim przypadku możesz utknąć na poziomie wydajności, którego chyba nie da się poprawić. Oznacza to, że sieć neuronowa w obecnym stanie nie jest w stanie pozyskać więcej informacji z Twoich danych, tak jak w naszym przypadku.

Pamiętasz, jak używamy obrazów, rozbitych na jeden wektor? To był naprawdę zły pomysł. Odręczne cyfry składają się z kształtów i po rozdrobnieniu pikseli odrzuciliśmy informacje o kształcie. Istnieją jednak sieci neuronowe, które wykorzystują informacje o kształcie: sieci splotowe. Wypróbujmy je.

Jeśli napotkasz problem, oto rozwiązanie tego problemu:

c3df49e90e5a654f.png keras_03_mnist_dense_lrdecay_dropout.ipynb

10. [INFO] sieci splotowe

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ć ze splotowych sieci neuronowych, poczytaj dalej.

convolutional.gif

Ilustracja: filtrowanie obrazu za pomocą 2 kolejnych filtrów o wymiarach 4 x 4 x 3=48 wag, które można wyuczyć.

Tak wygląda prosta splotowa sieć neuronowa w Keras:

model = tf.keras.Sequential([
    tf.keras.layers.Reshape(input_shape=(28*28,), target_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(kernel_size=3, filters=12, activation='relu'),
    tf.keras.layers.Conv2D(kernel_size=6, filters=24, strides=2, activation='relu'),
    tf.keras.layers.Conv2D(kernel_size=6, filters=32, strides=2, activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation='softmax')
])

688858c21e3beff2.png

W warstwie sieci splotowej jeden „neuron” wykonuje ważoną sumę pikseli tuż nad nim i tylko na niewielkim obszarze obrazu. Dodaje odchylenie i dostarcza sumę przez funkcję aktywacji, tak jak neuron w regularnej gęstej warstwie. Ta operacja jest następnie powtórzona na całym zdjęciu z tą samą wagą. Pamiętaj, że w gęstych warstwach każdy neuron ma własną wagę. Tutaj jest tylko jedna „poprawka” ciężarów przesuwają się po obrazie w obu kierunkach („splot”). Dane wyjściowe mają tyle wartości, ile jest pikseli na obrazie (wymagane jest jednak pewne dopełnienie na krawędziach). Jest to operacja filtrowania. Na ilustracji powyżej użyto filtra wag 4 x 4=48.

Jednak 48 wag nie wystarczy. Aby dodać więcej stopni swobody, powtarzamy tę samą operację z nowym zestawem wag. Spowoduje to utworzenie nowego zestawu wyników filtra. Nazwijmy go „kanałem”. danych wyjściowych – analogia z kanałami R, G i B obrazu wejściowego.

Zrzut ekranu 2016-07-29 at 16.02.37.png

Dwa (lub więcej) zestawów wag można zsumować jako jeden tensor, dodając nowy wymiar. W ten sposób uzyskamy ogólny kształt tensora wag dla warstwy splotowej. Ponieważ liczba kanałów wejściowych i wyjściowych jest parametrami, możemy zacząć porządkować i łączyć splotowe warstwy.

d1b557707bcd1cb9.png

Ilustracja: splotowa sieć neuronowa przekształca „sześciany” danych na inne „sześciany”, danych.

Sploty kroczące, maksymalna liczba grupowania

Wykonując splot 2 lub 3, możemy również zmniejszyć wynikową kostkę danych w wymiarach poziomych. Można to zrobić na 2 sposoby:

  • Splot liniowy: filtr przesuwany jak powyżej, ale z krokiem >1
  • Maksymalne łączenie w ramach: przesuwane okno z operacją MAX (zwykle przy 2 × 2 poprawkach, powtarzane co 2 piksele).

2b2d4263bb8470b.gif

Ilustracja: przesunięcie okna przetwarzania o 3 piksele powoduje zmniejszenie wartości wyjściowych. Sploty rozciągnięte lub maksymalne złączenie (maks. przy przesuwaniu okna 2 x 2 o krok 2) to sposób zmniejszania kostki danych w wymiarach poziomych.

Ostatnia warstwa

Po ostatniej warstwie splotowej dane mają postać kostki. Istnieją dwa sposoby wprowadzenia go przez ostatnią, gęstą warstwę.

Pierwszą jest spłaszczenie sześcianu danych do postaci wektora, a następnie podanie ich do warstwy softmax. Czasami możesz nawet dodać gęstą warstwę przed warstwą softmax. Zwykle jest to kosztowne pod względem liczby wag. Gęsta warstwa na końcu sieci splotowej może zawierać ponad połowę ciężarów całej sieci neuronowej.

Zamiast korzystać z drogich i gęstych warstw, możemy też podzielić przychodzące dane „sześcianem”. na tyle części, ile mamy klasy, uśredniać ich wartości i udostępniać je za pomocą funkcji aktywacji softmax. Ten sposób tworzenia nagłówka klasyfikacji kosztuje 0 wag. W Keras znajduje się warstwa związana z tym elementem: tf.keras.layers.GlobalAveragePooling2D().

a44aa392c7b0e32a.png

Przejdź do następnej sekcji, aby stworzyć splotową sieć rozwiązaną w danym problemie.

11. Sieć spłowowa

Stwórzmy splotową sieć do rozpoznawania odręcznych cyfr. Na górze zostaną użyte 3 splotowe warstwy, tradycyjna warstwa odczytu softmax na dole i połączymy je z jedną w pełni połączoną warstwą:

e1a214a170957da1.png

Zwróć uwagę, że druga i trzecia splotowa warstwa są podzielone na dwie, co wyjaśnia, dlaczego zmniejszają liczbę wartości wyjściowych z 28 x 28 do 14 x 14, a następnie do 7 x 7.

Napiszmy kod Keras.

Przed pierwszą warstwą splotową należy zwrócić szczególną uwagę. Oczekiwany jest trójwymiarowy „sześcian” ale nasz zbiór danych został jak dotąd skonfigurowany pod kątem gęstych warstw i wszystkie piksele obrazów są spłaszczone do wektora. Musimy je przekształcić z powrotem w obrazy o wymiarach 28 x 28 x 1 (1 kanał dla obrazów w skali szarości):

tf.keras.layers.Reshape(input_shape=(28*28,), target_shape=(28, 28, 1))

Możesz użyć tej linii zamiast warstwy tf.keras.layers.Input, która była dostępna do tej pory.

W Keras składnia warstwy splotowej aktywowanej przez „relu” to:

140f80336b0e653b.png

tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu')

W przypadku splotu krokowego wpisz:

tf.keras.layers.Conv2D(kernel_size=6, filters=24, padding='same', activation='relu', strides=2)

Aby rozłożyć kostkę danych na wektor w taki sposób, aby mogła zostać użyta przez gęstą warstwę:

tf.keras.layers.Flatten()

W przypadku gęstej warstwy składnia nie uległa zmianie:

tf.keras.layers.Dense(200, activation='relu')

Czy Twój model przekroczył barierę dokładności 99%? Prawie dobrze... ale spójrz na krzywą utraty danych. Czy to dzwonek?

ecc5972814885226.png

Przyjrzyj się też prognozom. Za pierwszym razem większość z 10 000 cyfr testowych została poprawnie rozpoznana. Pozostało tylko około 41⁄2 wierszy błędów (około 110 cyfr z 10 000)

37e4cbd3f390c89e.png

Jeśli napotkasz problem, oto rozwiązanie tego problemu:

c3df49e90e5a654f.png keras_04_mnist_convolutional.ipynb

12. Porzuć ponownie

Poprzednie szkolenie wykazuje wyraźne oznaki nadmiernego dopasowania (i wciąż nie przekracza 99% dokładności). Czy możemy jeszcze raz zrezygnować?

Jak Ci poszło tym razem?

63e0cc982cee2030.png

Wygląda na to, że tym razem udało się zrezygnować z subskrypcji. Utrata weryfikacji nie zwiększa się już, a ostateczna dokładność powinna być znacznie powyżej 99%. Gratulacje!

Gdy po raz pierwszy próbowaliśmy zastosować dane o porzuceniu, myśleliśmy, że mamy problem z nadmiernym dopasowaniem, podczas gdy w rzeczywistości problemem była architektura sieci neuronowej. Bez splotowych warstw nie można pójść dalej. Nikt nie mógłby tego zrobić.

Tym razem wygląda na to, że przyczyną problemu było nadmierne dopasowanie, co w rzeczywistości pomogło. Pamiętaj, że istnieje wiele czynników, które mogą powodować rozłączenie krzywych utraty między trenowaniem i walidacją, co powoduje coraz większą liczbę utraconych wartości. Nadmierne dopasowanie (zbyt wiele stopni swobody, niewłaściwie wykorzystywane przez sieć) to tylko jeden z nich. Jeśli zbiór danych jest zbyt mały lub architektura sieci neuronowej jest nieodpowiednia, możesz zauważyć podobne zachowanie na krzywych utraty, ale rezygnacja nie pomoże.

13. Normalizacja wsadowa

oggEbikl2I6_sOo7FlaX2KLdNeaYhJnVSS8GyG8FHXid75PVJX73CRiOynwpMZpLZq6_xAy69wgyez5T-ZlpuC2XSlcmjk7oVcOzefKKTFhTEoLO3kljz2RDyKcaFtHvtTey-I4VpQ

Na koniec spróbujmy dodać normalizację wsadową.

Tak to wynika z teorii. W praktyce pamiętaj tylko o kilku zasadach:

Na razie pobawmy się z książką i dodajmy zbiorczą warstwę normy w każdej, oprócz ostatniej warstwy sieci neuronowej. Nie dodawaj go do ostatniego parametru softmax warstwę. W tym przypadku nie byłoby to przydatne.

# Modify each layer: remove the activation from the layer itself.
# Set use_bias=False since batch norm will play the role of biases.
tf.keras.layers.Conv2D(..., use_bias=False),
# Batch norm goes between the layer and its activation.
# The scale factor can be turned off for Relu activation.
tf.keras.layers.BatchNormalization(scale=False, center=True),
# Finish with the activation.
tf.keras.layers.Activation('relu'),

Jaka jest teraz dokładność?

ea48193334c565a1.png

Po wprowadzeniu niewielkich zmian (BATCH_SIZE=64, parametr spadku tempa uczenia się 0,666 i współczynnik porzuceń w gęstej warstwie 0,3) i odrobinę szczęścia możesz uzyskać wartość 99,5%. Korekty w tempie uczenia się i porzuceniach zostały przeprowadzone zgodnie ze sprawdzonymi metodami dla użycia normy wsadu:

  • Norma zbiorcza ułatwia ujednolicenie sieci neuronowych i zwykle umożliwia szybsze trenowanie.
  • Norma zbiorcza to regularyzator. Zwykle możesz zmniejszyć liczbę porzuceń, a nawet wcale z niej nie korzystać.

Notatnik rozwiązania ma 99,5% uruchomienia trenowania:

c3df49e90e5a654f.png keras_05_mnist_batch_norm.ipynb

14. Ćwiczenia w chmurze przy użyciu wydajnego sprzętu: AI Platform

d7d0282e687bdad8.png

W folderze mlengine na GitHubie znajdziesz wersję kodu działającą w chmurze wraz z instrukcjami uruchamiania go w Google Cloud AI Platform. Zanim wykonasz tę część, musisz utworzyć konto Google Cloud i włączyć płatności. Zasoby potrzebne do ukończenia modułu powinny kosztować mniej niż kilka dolarów (zakładając, że zajmie to 1 godzinę trenowania na 1 GPU). Aby przygotować konto:

  1. Utwórz projekt Google Cloud Platform ( http://cloud.google.com/console).
  2. Włącz płatności.
  3. Zainstaluj narzędzia wiersza poleceń GCP ( pakiet SDK GCP znajdziesz tutaj).
  4. Utwórz zasobnik Google Cloud Storage (umieść w regionie us-central1). Zostanie ona użyta do etapu trenowania kodu i przechowywania wytrenowanego modelu.
  5. Włącz niezbędne interfejsy API i poproś o niezbędne limity. Wystarczy, że po jednorazowym uruchomieniu polecenia treningowego zostaną wyświetlone komunikaty o błędach z informacjami o tym, co należy włączyć.

15. Gratulacje!

Udało Ci się zbudować swoją pierwszą sieć neuronowa i wytrenować ją aż do dokładności na poziomie 99%. Techniki opanowane w trakcie pracy nie są ściśle związane ze zbiorem danych MNIST, a w rzeczywistości są powszechnie stosowane podczas pracy z sieciami neuronowymi. W ramach prezentu na pożegnanie dołączamy „nuty klifu” w postaci kreskówki. Możesz w ten sposób zapamiętać, czego się nauczyliśmy:

Cliffs notes Tensorflow lab.png

Dalsze kroki

  • Po w pełni połączonych i skonwolucyjnych sieciach warto przyjrzeć się ponownym sieciom neuronowym.
  • Aby umożliwiać trenowanie i wnioskowanie w chmurze, w infrastrukturze rozproszonej, Google Cloud udostępnia AI Platform.
  • Bardzo zależy nam na opiniach użytkowników. Daj nam znać, jeśli zauważysz, że w tym module coś jest nie tak lub jeśli uważasz, że coś jest nie tak. Opinie przekazujemy poprzez GitHub [feedback link].

HR.png

Martin Görner ID small.jpgAutor: Martin GörnerTwitter: @martin_gorner

Wszystkie kreskówki objęte prawami autorskimi w tym module: zdjęcia licencjonowane alexpokusay / 123RF