Usprawnij swój program klasyfikujący obrazki z bazy MNIST.
Wymagana skuteczność to 98.0% na zbiorze testowym.
Zaadoptuj swoje rozwiązanie do obrazków ze zbioru CIFAR-10
i osiągnij wymaganą skuteczność 52.0%.
Termin: 25 października za 1,00 punkt
Termin: 31 października za 0,50 punktu
Wymagane usprawnienia:
-
ukryte warstwy: warstwa dostaje na wejściu x (batch wektorów) i przetwarza go drukujac na wyjściu y = dropout(relu(batch_norm( x*W+b )))
-
normalizacja batcha:
a więc dla każdej ukrytej warstwy mamy dwa dodatkowe wektory wag modelu: wartości oczekiwane i wariancje; Wtedy wektor wyjściowy y z tej warstwy normalizujemy odejmując jego średnią i wydzielając przez pierwiastek wariancji, a wynikowy wektor skalujemy z powrotem do pożądanej wartości oczekiwanej i wariancji. (Po implementacji normalizacji należy wyłączyć biasy b dla ukrytych warstw, gdyż tracą one sens.)
-
można wypróbować również uproszczenie normalizacji batcha w którym wektor wartości oczekiwanych dla warstwy zastępujemy pojedynczą wartością (wspólną dla wszystkich neuronów) i podobnie z wariancją;
przedziwnie taki wariant daje lepsze wyniki w moim modelu dla MNISTa
-
Exponential Moving Average: przy każdej aktualizacji wag aktualizujemy na boku inne wagi wg. wzoru self.other_weights = self.other_weights * ema_decay + self.weights * (1- ema_decay)
-
gradient liczymy przy pomocy grada z autograda
-
uporządkowanie kodu tak aby:
(1) wszystkie parametry których model się uczy były w jednym wektorze (ja go nazywam self.weights);
(2) rozpakowywanie tego wektora proszę zorganizować poprzez generator;
(3) konstruktor modelu powinien mieć taką funkcjonalność,
aby wywołanie model = NeuralNetworkModel([500,100], **params) tworzyło model z dwiema ukrytymi warstwami, jedną rozmiaru 500 i drugą rozmiaru 100
Parametry mojej sieci osiągającej 98.5% na MNIST:
- batch_size = 64
- learning_rate = 0.1, można go po iluś epokach obniżyć
- sizes = [500]
- dropout=0.1
- ema_decay = 0.999
Parametry mojej sieci osiągającej 54.0% na CIFAR-10:
- batch_size = 32
- learning_rate = 0.1
- sizes = [100,100]
- dropout=0.1
- ema_decay = 0.999
- epochs = 8
Uwagi:
-
Czas wykonania jednej epoki dla CIFAR-10 to ponad 2 minuty. Proszę wypróbowywać różne ustawienia. Prawdopodobnie można wybrac duże lepsze hiperparametry.
-
Proszę nie kręcić pętli po obrazkach, a zamiast tego używać metod numpy dla tablic (vide dropout, normalizacja i cała reszta).
-
OBOWIĄZKOWO: prezentacja modelu, statystyki, obrazki, wykresy, ... Proszę drukować co epokę wyniki zebrane przez epokę dla zbioru treningowego oraz wyniki dla zbioru walidacyjnego przy normalnych wagach i przy ważonych wagach (EMA).
-
W pierwszych liniach kodu proszę napisać oświadczenie o samodzielności wykonania rozwiązania.
-
Zachęcam do zadawania pytań poprzez email lub forum.