Cílem čtvrtého cvičení v předmětu BIN je seznámit se s neuronovými sítěmi a jejich výpočetní náročností.
Projděte si teorii představenou na přednášce BIN. Dále se seznamte s prací s neuronovými sítěmi ve frameworku Tensorflow, která je popsaná v Jupyter noteboocích popisujících
- MLP sítě: https://github.com/mrazekv/bin-lab-nn/blob/master/mlp.ipynb
- Konvoluční sítě: https://github.com/mrazekv/bin-lab-nn/blob/master/conv.ipynb
Pro spuštění máte několik možností:
- DOPORUČENO: stáhnout notebook na Google CoLab, můžete otevřít projekt přímo z Githubu (nutné zadat
mrazekv
do cesty, pak vybratbin-lab-nn
a příslušný notebook). Potom kliknete do boxu s kódem (kde můžete dělat změny) a pomocí Shift+Enter spustit daný blok. Pozor, je nutné postupovat postupně a nepřeskakovat kernely. V menu Běh -> Změnit typ běhového prostředí vyberte běh na GPU. - z repozitáře https://github.com/mrazekv/bin-lab-nn si stáhnout Python soubory. Tyto soubory můžete pustit u sebe (nutnost Python3 + Tensorflow + Keras a nejlépe aspoň základní GPU) či na serveru merlin (pozor, je potřeba spouštět příkazem
python3.8 <nazev_skriptu>
).
Implementujte trénování a testování následujících sítí pro dataset MNIST a trénování pro 10 epoch.
Implementujte následující sítě:
- MLP (fully-connected): 784-300-10
- MLP (fully-connected): 784-100-10
- MLP (fully-connected): 784-100-100-10
- MLP (fully-connected): 784-300-300-10
- Konvoluční 2 konvoluce + 120-84-10 fully connected
- Konvoluční 2 konvoluce + 120-10 fully connected
- Konvoluční 1 konvoluce + 120-84-10 fully connected (odstraňte druhou konvoluci a následnou pooling layer)
- Konvoluční 1 konvoluce + 120-10 fully connected (odstraňte druhou konvoluci a následnou pooling layer)
Vlastnosti sítí shrňte v tabulce, kde bude uveden:
- Typ sítě
- Dosažená validační přesnost (po 10 epochách)
- Počet násobení v plně propojených vrstvách
- Počet násobení v konvolučních vrstvách
- Počet trénovacích parametrů
Vytvořte X-Y (scatter) graf, kde na ose X bude celkový počet násobení (~energie) a na ose Y bude výsledná přesnost. Diskutujte výsledky, zejména otázku, které sítě byste zvažovali pro použití. Pro vykreslení využijte Python v Jupyter notebooku. Ukázka vykreslení je
import matplotlib.pyplot as plt
import pandas as pd
# Data ve formatu prikon / pocet_nasobeni
# TODO: upravte dle vlastniho uvazeni
df = pd.DataFrame([
{"type" : "mlp", "accuracy": 97.4, "MAC": 100},
{"type" : "mlp", "accuracy": 98.4, "MAC": 200},
{"type" : "conv", "accuracy": 99.4, "MAC": 200},
])
fig, ax = plt.subplots(figsize=(8, 6))
for nn_type, label, color in [("mlp", "MLP sítě", "tab:orange"), ("conv", "Konvoluční sítě", "tab:blue")]:
df_tmp = df.query("type == @nn_type")
ax.scatter(df_tmp["MAC"], df_tmp["accuracy"], color=color, label=label)
ax.set(
xlim=(0, None),
ylim=(0, 100)
# todo
)
ax.legend()
# plt.savefig("obrazek.pdf")
# plt.savefig("obrazek.png")
fig.show()
Do výpočtu počtu násobení v plně propojených vrstvách je nutné zahrnout: počet vstupních neuronů a počet neuronů ve vrstvě. Pro výpočet počtu násobení v konvolučních vrstvách je nutné zahrnout: velikost vstupního obrázku, počet kanálů ve vstupním obrázku, velikost filtru, počet výstupních kanálů.
- Tabulka přesností + vzorec výpočtů)
- Graf (včetně dodržení všech náležitostí grafu)
- Shrnutí výsledků a závěr (ústně)