Napisz sieci konwolucyjne klasyfikujące obrazki z bazy MNIST.i CIFAR-10.

Za sprawnie działające modele wygenerowane przy pomocy autograd.numpy można otrzymać 1,5 punktu (termin: 18 stycznia). Za analogiczne sieci wygenerowane poprzez TensorFlow można otrzymać kolejne 1.5 punktu (termin: "koniec semestru", dokładną datę jeszcze ustalimy).

Poniżej prezentuję zwięźle architekturę sieci omawianej na zajęciach dla bazy MNIST. Załączam również kilka kawałków kodu uzytecznych dla wersji pisanej w numpy. Proponowana architektura dla bazy MNIST (dozwolone są małe modyfikacje; w sczegó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], weihgts.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 wairancji 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: