Zaprojektuj i wytrenuj prosty model sieci neuronowej klasyfikujący obrazki ze zbioru MNIST z 92% skutecznością na zbiorze testowym. Zaprezentuj działanie swojego modelu przygotowując kilka statystyk/wizualizacji.

Termin oddania:
do 18 października (czwartek) za 1,00 punkt
do 25 października za 0,75 punktu

Model powinien być trenowany na pierwszych 55k obrazkach z pliku 'train-images-idx3-ubyte.gz'. Ostatnie 5k obrazków z tego pliku ma służyć jako zbiór walidacyjny. Proszę sprawdzać skuteczność trenowanego modelu po każdej epoce na zbiorze walidacyjnym i jednokrotnie po zakończeniu trenowania na zbiorze testowym to jest na 10k obrazkach z pliku 't10k-images-idx3-ubyte.gz'.

Model powinien mieć następujące hiperparametry, których znaczenie było omówione na wykładzie (podane wartości działają dla mojego modelu):
* init_scale = 0.05
* learning_rate = 0.1
* batch_size = 128
* num_of_epochs = 10

Dodatkowy komentarz:
* Model powinien mieć 784 x 10 = 7840 wag w macierzy W. Przyjmując obrazek img (który widzimy jako wektor 784 wartości z przedziału [0,1]) model klasyfikuje obrazek wyliczając softmax(img * W).
* Wagi powinny być inicjalizowane losowo w sposób jednostajny na przedziale (-init_scale,init_scale).
* W idealnym świecie model chciałby przyjąć wagi minimalizujące softmax(IMG * W) * (LABELS), gdzie IMG to tablica wszystkich obrazków ze zbioru danych Jednak ten problem minimalizacyjny jest nie do ogarnięcia. Dlatego poprawiamy wagi modelu iteracyjnie przy pomocy Stochastic Gradient Descent.
* gradient obliczamy samodzielnie (przepisujemy wzór z wykładu).
* definiujemy funkcję kosztu: f(IMG_BATCH, W, LABELS_BATCH) = -sum( log(softmax(IMG_BATCH * W)) * LABELS_BATCH ) / batch_size
* Unikamy liczenia softmaxa a później jego logarytmowania (niestabilne numerycznie). Zamiast tego proszę jedynie policzyć logsumexp (możemy tę funkcję wziąć z jakiejś biblioteki).

** w pierwszych liniach kodu zamieszczamy wyczerpujące oświadczenie o samodzielności wykonania zadania
** wraz z modelem proszę przygotować kilka statystyk własnego pomysłu, dla przykładu: instancje cyfr dla których model jest najpewniejszy swej odpowiedzi; obrazki na których model się myli (wraz z wykresem predykcji), itp.