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):
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 Nx4x4Podczas 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: