Napisz sieci konwolucyjne klasyfikujące obrazki z bazy MNIST i CIFAR-10. Wymagana skuteczność na zbiorze testowym MNIST to 98.8%. Wymagana skuteczność na zbiorze testowym CIFAR-10 to 54.0%

Termin: 7 listopada za 1,00 punkt
Termin: 14 listopada za 0,50 punktu

Proponowana architektura dla bazy MNIST (dozwolone są modyfikacje; w szczególności adaptując sieć do bazy CIFAR-10): Każda warstwa sieci konwolucyjnej to sekwencja następujących operacji: Oto kawałek mojego kodu do konwolucji:
import autograd.scipy.signal
convolve = autograd.scipy.signal.convolve

def apply_conv(x, shape, kernel):
    kernel = np.reshape(kernel, shape)
    conv = convolve(x, kernel, axes=([2, 3], [2, 3]), dot_axes=([1], [0]), mode='valid')
    return conv

...

apply_conv(batch, [N, 2N, 4, 4], weights.next()) # 2N filtrow wielkosci Nx4x4
Podczas normalizacji, dla każdego "koloru" (współrzędna odpowiadająca wynikom konwolucji jednego ustalonego fitra) liczymy średnią i wariancję wszystkich wartości konwolucji (czyli po wszystkich obrazkach w batchu, i wszystkich przyłożeniach ustalonego filtra do tego obrazka). Następnie odejmujemy średnią i wydzielamy przez pierwiastek z wariacji. Następnie skalujemy z powrotem do docelowej wariancji i średniej, które są parametrami wyuczanymi przez model. Oto kodzik liczący wektor wspomnianych średnich:
mean = np.mean(x, (0, 2, 3), keepdims=True)
Uwagi: