• Nie Znaleziono Wyników

Splotowe sieci neuronowe

N/A
N/A
Protected

Academic year: 2021

Share "Splotowe sieci neuronowe"

Copied!
9
0
0

Pełen tekst

(1)

KATEDRA SYSTEMÓW MULTIMEDIALNYCH Lab:Inteligentne Systemy Decyzyjne

Ćwiczenie nr 4:

Splotowe sieci neuronowe.

Opracowanie: mgr inż. Sebastian Cygert

1. Wprowadzenie

W poprzednim laboratorium testowane były tzw. Fully Connected Neural Networks, tj. każdy neuron w kolejnej warstwie był połączony z każdym neuronem z poprzedniej warstwy. Ten typ połączeń znajduje wiele zastosowań, jednak w przypadku analizy obrazu bardziej efektywne są tzw. splotowe sieci neuronowe (Convolutional Neural Networks, CNN) [1]. W porównaniu do klasycznych sieci mają one znacznie mniej połączeń (parametrów) dzięki czemu są łatwiejsze w treningu, zwłaszcza dla wielowymiarowych danych wejściowych jakim jest obraz. 1.1. Sieci konwolucyjne

Pierwszą siecią z architekturą CNN była sieć LeNet[1]. Rys. 1 przedstawia jej architekturę.

Rysunek 1. Architektura sieci LeNet-5[1].

Klasyczna sieć CNN składa się z trzech głównych komponentów: - warstwa konwolucji (convolutions na rys. 1)

-warstwa poolingu, której celem jest zmniejszenie rozdzielczości obrazu wejściowego (subsampling)

- warstwa wyjściowa, która zwraca właściwy wynik. Zazwyczaj są to warstwy (jedna lub więcej) Fully Connected.

(2)

Warstwa konwolucji.

Sieci konwolucyjne składają się z wielu, zazwyczaj niewielkich (np. 5x5, 3x3) filtrów. Filtry te są „przykładane” w kolejne miejsca na obrazie wejściowym i dokonywana jest właśnie operacja splotu, tj. obliczony jest iloczyn skalarny między fragmentem obrazu wejściowe i filtrem.

Przyjmijmy, że g to obraz wejściowy o rozmiarze m x n a f to filtr o rozmiarze j x k, wtedy macierz wyjściowa może być obliczona jako:

Obraz wejściowy jest zazwyczaj dużych rozmiarów (np. 1080 x 720). W wyniku zastosowania operacji splotu otrzymujemy nowy obraz - w zależności od zastosowanego filtru może być to obraz wygładzony albo np. z wyostrzonymi krawędziami. W sieciach CNN filtry są uczone automatycznie tak aby zminimalizować zadaną funkcję kosztu.

Zastosowanie operacji splotu wymaga przyjęcia pewnych założeń co do warunków brzegowych, tzn. ustalenia jaka jest wartość obrazu g dla elementów znajdujących się tuż poza obrazem wejściowym. Dzięki temu rozmiar macierzy na wyjściu jest taki sam jak na wejściu. Zazwyczaj stosuje się tzw. zero padding, tj. przyjmuje się w takich miejscach zerową wartość obrazu.

Warstwa poolingu

Warstwa poolingu (również zwana subsampling albo downsampling layer) zmniejsza rozmiar obrazu wejściowego, tak aby zmniejszyć wymiarowość przetwarzanej macierzy i ułatwić/przyspieszyć trening. Wykorzystywanych jest kilka operatorów poolingu: np. Max, Average, Sum itp. W sieciach CNN najpopularniejszy jest Max pooling.

Definiowany jest obszar poolingu (np. okno 2x2) i dla każdego takiego kolejnego okna brana jest maksymalna wartość i zapisywana do macierzy wyjściowej. Następnie okno poolingu przesuwane jest do kolejnego elementu macierzy wejściowej.

(3)

Warstwa wyjściowa

Jest to zazwyczaj warstwa Fully Connected. W pierwszym etapie następuje spłaszczenie wektora wyjściowego z warstw CNN do jednowymiarowego wektora. Następnie warstwa ta jest łączona z wektorem wyjściowym (czasami pomiędzy tymi warstwami dodane zostają warstwy ukryte). W przypadku klasyfikatora funkcja aktywacja ostatniej warstwy to funkcja sigmoidalna, która zwraca prawdopodobieństwo dla każdej klasy.

MNIST

Zbiór danych MNIST ((Modified National Institute of Standards and Technology database)[4] jest klasycznym zbiorem do treningu i testowania algorytmów uczenia maszynowego do rozpoznawania cyfr. Zawiera on 60000 przykładów treningowych i 10000 przykładów testowych.

Rysunek 3. Przykładowe obrazy ze zbioru MNIST. Obraz wejściowy jest zapisany w macierzy 28x28 w skali szarości.

1.2. Regularyzacja

Trening sieci neuronowych odbywa się w tzw. epokach, jedna epoka oznacza, że każdy element ze zbioru treningowego został wykorzystany w treningu. W kolejnych epokach funkcja kosztu jest optymalizowana na zbiorze treningowym przy pomocy algorytmu propagacji wstecznej (backpropagation). Istnieje jednak ryzyko, że w kolejnych iteracjach dojdzie do „zapamiętania” zbioru treningowego, przez co sieć utraci zdolności generalizacji. Jest to tzw. problem kompromisu między obciążeniem a wariancją (bias-variance tradeoff). Zostało to zobrazowane na rys. 4.

(4)

Rysunek 4. Dane wejściowe oraz funkcja je aproksymująca - kolejno przykłady nadmiernego dopasowania (overfitting), niedouczenia (underfitting) oraz dobrego dopasowania[5].

W celu zapobiegania temu problemowi stosuje się różne techniki. Podstawową z nich jest stosowanie zbioru walidacyjnego w czasie treningu. W tym celu zbiór treningowy dzielony jest na dwie części: część treningową oraz walidacyjną – np. w stosunku około 4:1. W czasie treningu zapisywane są wartości funkcji kosztu dla zbioru treningowego i walidacyjnego dla kolejnych epok. Do testowania używany jest model, który uzyskał najmniejszą wartość funkcji kosztu na zbiorze walidacyjnym. Dzięki temu minimalizowana jest szansa wystąpienia nadmiernego dopasowania (który może nastąpić w późniejszych epokach) oraz niedouczenia (który występuje na początku treningu).

Do pozostałych technik pozwalających na otrzymanie modelu, który ma możliwie dużą zdolność generalizacji należą m. in:

- regularyzacja, tj. nakładanie kar na zbyt duże wartości wag sieci neuronowej.

- zastosowanie warstwy Dropout [6]. W (wytłumaczyć ile, jaka warstwa) czasie treningu losowe wagi sieci są zerowane.

- augmentacja danych. W czasie treningu obrazy (dane) wejściowe zostają poddane augmentacji danych, np. w przypadku obrazu mogą to być operacji rotacji, odwrócenia, zmiany jasności itp., które powinny poszerzyć możliwości klasyfikacji sieci.

2. Ćwiczenie

Ćwiczenie polega na wytrenowaniu niewielkiej konwolucyjnej sieci neuronowej do klasyfikacji cyfr ze zbioru MNIST przy pomocy biblioteki Tensorflow w języku Python. Testowany będzie również wpływ różnych wpływ augmentacji danych czy zastosowania warstwy Dropout na skuteczność wytrenowanego modelu, a otrzymane wyniki będą zwizualizowane dzięki bibliotece matplotlib.

Do treningu wykorzystana zostanie darmowa infrastruktura Google Colab, ale w przypadku posiadania przyzwoitej karty graficznej możliwy jest również trening na lokalnym komputerze / laptopie.

Aby przystąpić do wykonania ćwiczenia należy wejść na stronę https://colab.research.google.com/ , oraz zalogować się przez konto gmail, a następnie wgrać plik „isd_cnn_mnist.pynb”.

(5)

Opis najważniejszych funkcji

Nazwa funkcji Opis

get_net Definicja modelu sieci neuronowej.

plot_training_history Tworzenie wykresu trening (funkcja kosztu oraz precyzja dla zbioru treningowego i walidacyjnego).

test_model Funkcja testująca wytrenowany model na zbiorze testowym. Argumentem jest nazwa modelu.

visualise_examples Wizualizacja predykcji sieci.

train Funkcja do treningu sieci neuronowej. Argumentem do funkcji jest nazwa pod jaką ma zostać zapisany model.

Komentarze:

- W Pythonie do oddzielania bloków kodu służą wcięcia (preferowane są 4 spacje, https://stackoverflow.com/questions/13884499/what-is-python-whitespace-and-how-does-it-work) - Po wytrenowaniu modelu powinien on być widoczny po wpisaniu komendy os.listdir(). Nie potrafię zagwarantować niestety, że będzie on dostępny po zamknięciu okna przeglądarki.

- W przypadku zawieszenia działania Google Colab można kliknąć Runtime / restart runtime. - W przypadku błędów w kodzie zostają one wyświetlone na końcu bloku kodu, dlatego należy zwracać po każdym wykonaniu bloku kodu czy nie pojawił się błąd.

- W przypadku gdy dany blok kodu zostanie zmieniony, aby zmiana miała skutek należy kliknąć RunCell (np. jeśli zmienimy liczbę epok w funkcji train to najpierw należy kliknąć RunCell na funkcji train a dopiero później uruchomić samą funkcję)

- ze względu na ograniczony czas trwania ćwiczenia (i zasoby obliczeniowe) modele liczba epok treningowych zostanie delikatnie ograniczona. W szczególności dotyczy to ćwiczenia nr 3 gdzie będziemy stosować tylko kilka epok do oceny przydatności danych zmian w architekturze (zamiast pełnego treningu)

Przebieg ćwiczenia

W ćwiczeniu tym trenowana będzie sieć konwolucyjna do klasyfikacji cyfr ze zbioru MNIST. W pierwszym zadaniu wytrenowana zostanie standardowa sieć. W zadaniu nr3 Twoim celem będzie zmiana parametrów sieci / treningu i obserwowanie ich wpływu na precyzję działania algorytmu.

1a) Trening sieci. Ćwiczenie zaczniemy od treningu podstawowego modelu do rozpoznawania cyfr. Najpierw jednak zdefiniujemy rozmiar zbioru walidacyjnego. Tak jak zostało to opisane w punkcie 1.2 tego we wprowadzeniu w czasie treningu używamy zbioru treningowego, walidacyjnego oraz testowego. Ustaw wartość flagi VALIDATION_SIZE na wybranę przez

(6)

Ciebie wartość z zakresu [0.1, 0.3] (nie ma tutaj „właściwej” odpowiedzi) i uruchom trening. W tym celu należy po kolei uruchomić wszystkie bloki kodu w Google Colab, a uruchomienie ostatniego bloku spowoduje rozpoczęcie treningu. Trening zostanie uruchomiony na 12 epok co zajmie niecałe 10 minut w przypadku Google Colab, na dobrej karcie graficznej ten czasy byłby kilka razy mniejszy. Model zostanie zapisany „w chmurze” pod nazwą ustaloną przez zmienną model_name.

W czasie treningu wyświetlane są wartości accuracy (precyzja sieci na zbiorze treningowym) oraz val_accuracy (precyzja sieci na zbiorze testowym) - zapisz wartości otrzymane dla ostatniej epoki treningu do tabeli. Zapisz otrzymany wykres, pokazujący jak zmieniała się skuteczność sieci oraz wartość funkcji kosztu dla kolejnych epok.

1b) Test wytrenowanego modelu. Uruchom funkcję test_model podając nazwę wytrenowanego modelu w poprzednim ćwiczeniu. Zapisz uzyskaną skuteczność na zbiorze testowym do tabeli. 1c) Wizualizacja predykcji sieci na zbiorze testowym. W celu wizualizacji predykcji sieci uruchom funkcję visualise_examples po raz kolejny podając jako argument nazwę wytrenowanego modelu.

2. Wizualizacja błędnych predykcji sieci. W poprzednim zadaniu wyświetlone zostały losowo wybrane predykcje sieci. Przydatne jest też przeanalizowanie błędnych predykcji algorytmu. W tym celu przeanalizuj i zmodyfikuj funkcję visualise_examples, tak żeby wyświetlała tylko błędne przypadki działania algorytmu. W tym celu należy dodać jeden warunek IF oraz operator continue (https://docs.python.org/3/tutorial/controlflow.html) w funkcji visualise_examples w oznaczonym miejscu „TODO”.

3. Testowanie różnych wariantów algorytmu. W tym ćwiczeniu testowane będą różne warianty konfiguracji architektury modelu / augmentacji danych i ich wpływ na rezultaty sieci. Do augmentacji danych wykorzystana zostanie klasa ImageDataGenerator (https://keras.io/preprocessing/image/) z biblioteki Keras – dokonuje ona augmentację danych w czasie treningu. W tym ćwiczeniu będziemy testować wpływ następujących technik na wyniki sieci: 1. Augmentacja danych: w tym celu możesz zmienić dowolne wartości dla obiektu ImageDataGenerator. W szczególności ustaw ustaw odpowiednie Twoim zdaniem wartości rotation_range, zoom_range, po przeczytaniu w dokumentacji za co odpowiadają te pola.

2. Regularyzacja Dropout. Możesz też odkomentować w funkcje get_net linię model.add(Dropout(…)) i uruchomić trening sieci. W argumencie do funkcji podaje się jaka część neuronów jest zerowanych podczas treningu sieci, standardowo liczba ta jest z zakresu (0, 0.5].

3. Różne rozmiary warstw sieci. Możesz zmienić liczbę filtrów w architekturze sieci (feature_vector_size oraz number_of_filters).

4. Różne warianty algorytmu optymalizacji. Zaznajom się ze stroną w dokumentacji https://keras.io/optimizers/ i możesz zmienić algorytm optymalizacji. Różnice między algorytmami optymalizacji są często znaczące.

Ze względu na ograniczony czas ćwiczenia przeprowadź krótkie treningu (4 epoki) dla około pięciu różnych wariantów. Zmień nazwę trenowanego modelu aby nie nadpisać modelu z ćwiczenia nr 1. Zapisz otrzymane wyniki w tabeli podając precyzję sieci oraz zastosowany wariant (krótki opis dokonanych zmian w stosunku do oryginalnego modelu). Dodatkowo zapisz całkowitą liczbę

(7)

parametrów sieci dla danego algorytmu korzystając z funkcji model.summary() ((https://keras.io/models/about-keras-models/)).

W szczególności interesujące może być stworzenie modelu, który będzie charakteryzować się dużą precyzją przy niewielkiej liczbie parametrów.

4a. Wybrany model - pełen trening.

Uruchom pełen trening (12 epok) dla wybranej architektury z poprzedniego ćwiczenia, porównaj wyniki z wynikami z ćwiczenia nr 1. Jako zadanie dodatkowe porównaj błędne detekcje sieci z zadania pierwszego z tymi dla nowo otrzymanego sieci. W tym celu należy zapisać ids błędnie sklasyfikowanych obrazów dla algorytmu z ćwiczenia nr 1, i wyświetlić predykcję dla tych samych obrazów (ids) dla nowo otrzymanego modelu.

Dodatkowe źródła (dla zainteresowanych).

1. Bardzo ciekawy jest artykuł [8], gdzie okazuje się, że sieci neuronowe są w stanie zapamiętać zbiór treningowy nawet gdy etykiety są dobrane losowo! Możesz powtórzyć eksperyment z tego artykułu odkomentowując linię:

#if RANDOM_TRAINING: Randomly shuffle examples # random.shuffle(y_train)

2. W artykule [7] wprowadzono pojęcie przykładów mylących „adversarial examples”. Drobne, niewidoczne dla ludzkiego oka zmiany w obrazie wejściowym powodują błędne działanie sieci. Jest to bardzo widowiska technika, która pokazuje, że sieci neuronowe widzą świat w diametralnie inny sposób niż ludzki mózg. Bibliotekę CleverHans: https://github.com/tensorflow/cleverhans oraz wiele innych pozwala na dowolne otworzenie tzw. adversarial examples.

3. Opracowanie

Do opracowania należy wykorzystać przygotowany szablon (znajduje się on również w paczce z kodem w formacie .docx).

1. Zmienna Wartość VALIDATION_SIZE Train accuracy Validation accuracy Test accuracy Wykres treningu.

(8)

Czy myślisz, że trening został zakończony w odpowiednim momencie czy powinien trwać dłużej / krócej?

2. Błędne predykcje sieci.

Czy można wyciągnąć jakieś wnioski na podstawie przykładowych błędnych detekcji?

3.

Zwięzły opis wariantu sieci Train accuracy val_acc Test acc Number of

parameter s

Opisz wnioski na podstawie eksperymentów, które ulepszenia zdają się poprawiać wyniki?

4. Opis modelu.

Train accuracy Val_acc Test acc

Porównaj wyniki z modelem z ćwiczenia pierwszego, czy zanotowałeś poprawę?

Jeśli Ci się udało to porównaj przykłady błędnych detekcji ćwiczenia pierwszego dla nowego modelu.

Nazwa warstwy sieci neuronowej

Liczba parametrów % całkowitej liczby

parametrów

(9)

4. Literatura

[1] A. Krizhevsky et. al., ImageNet Classification with Deep Convolutional Neural Networks, 2012,

https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

[2] Y. LeCun, et. al., Gradient-based learning applied to document recognition, 1998, http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

[3] Kurs Stanford CS231n: Convolutional Neural Networks for Visual

Recognitionhttps://www.youtube.com/watch?v=vT1JzLTH4G4&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=2&t=0s

http://cs231n.github.io/convolutional-networks/#conv

[4] https://en.wikipedia.org/wiki/MNIST_database

[5] https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229 [6] N. Srivastava et. al., Dropout: A Simple Way to Prevent Neural Networks from

Overfitting, 2014 - http://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf [7] C. Szegedy, Intriguing properties of neural networks. 2013, https://arxiv.org/abs/1312.6199. [8] Chiyuan Zhang et. al., Understanding deep learning requires rethinking generalization, 2016. https://arxiv.org/abs/1611.03530

Cytaty

Powiązane dokumenty

Przy starcie uczenia z wartości losowych prawdopodobieństwo utknięcia procesu w minimum lokalnym jest większe niż w przypadku sieci. sigmoidalnych, ze względu na silną

• może być połączona razem z systemem eksperckim i wtedy dostarcza wiedzy do bazy danych systemu eksperckiego... • Kiedy SSN uczy się aproksymować pewną funkcję, musi

• może być połączona razem z systemem eksperckim i wtedy dostarcza wiedzy do bazy danych systemu eksperckiego... • Kiedy SSN uczy się aproksymować pewną funkcję, musi

Powtarzamy kroki 1-4 tak długo dopóki wartość wyjścia wyznaczana przez sieć różni się od wzorca, którego sieć ma się nauczyć.... Warunek końca uczenia

Systemy uczące się (machine learning, ML) oraz sztuczne sieci neuronowe (artificial neural networks, ANN) są ważnymi elementami CI.... Problemy

(2014) Multi-digit Number Recognition from Street ViewImagery using Deep Convolutional Neural Networks.. Głębokość

• dla wygenerowanych danych dwuwymiarowych dwóch klas z rozkładów normal- nych zaznacz na wykresie dane treningowe, klasyfikator sieciami neuronowymi, dla różnej liczby neuronów

Gdy mamy warstwę ukrytą problem jest taki, że nie znamy prawidłowej wartości na wyjściu neuronów z warstwy ukrytej, więc nie wiemy jak wyliczyć modyfikacje wag.. Algorytm