{{indexmenu_n>8}}
Obsah této stránky bude přístupný od 23. 11. 2017.
Test: https://goo.gl/forms/1aLyuR5zDgYypfFR2
**TEST 07**
- (0.5 b) Nakreslete schéma perceptronu. Napiště vztah pro jeho výstupní funkci $f(\mathbf{x})$.
- (0.5 b) Popiště proces učení perceptronu pomocí gradientního algoritmu zpětné propagace chyby.
- (0.5 b) Jaké zásadní omezení má jednoduchý perceptronový algoritmus a jak je možné ho obejít?
====== Cvičení 8 - Perceptron, neuronové sítě ======
- Co je to perceptron?
- Jak se v něm vybavuje odpověď? Co je jeho odpovědí?
- Jak se perceptron učí?
- K čemu se dá použít?
- Co je to vícevrstvá perceptronová síť?
- Jak se volí počty neuronů v jednotlivých vrstvách?
- Jak probíhá učení vícevrstvé sítě pomocí algoritmu Backpropagation?
===== Perceptron =====
Vyzkoušíme chování perceptronu na datech {{courses:a6m33dvz:cviceni:ctvrtkruh.csv|}}.
- Data načtěte a prohlednete
d <- read.csv(file='ctvrtkruh.csv')
summary(d)
with(d, plot(a, b, col=c('red','blue')[class+1]))
- Na datech natrénujte ''"Perceptron"''.
library(neuralnet)
n <- neuralnet(class ~ a+b, d, hidden=0)
plot(n)
summary(n)
- Jakou funkcí perceptron data rozděluje? Interpretujte parametry modelu.
- Vizualizujte chování modelu. Jak dobře popisuje model data? Kde se model mýlí?
# predikce
pred <- as.numeric(n$net.result > 0.5)
table(d$class, pred)
round(prop.table(table(d$class, pred)),2)
# vizualizace:
with(d, plot(a, b, col=c('red','blue')[class+1]))
# weights <- n$weights[[1]][[1]]
# abline(a=-weights[1]/weights[3], b=-weights[2]/weights[3],col='green',lwd=3)
with(d[d$class!=pred,], points(a, b, pch=19))
- Jak závisí kvalita modelu na jeho parametrech?
===== Perceptron podruhé =====
Pokusíme se model z předchozího kroku vylepšit. Zkusme použít trik, tzv. "**vyrovnání příznakového prostoru**". Do dat dogenerujte atributy //a2 = a^2//, //b2 = b^2// a //ab = a*b// a znovu proveďte předešlé cvičení.
d$a2 <- d$a^2
d$b2 <- d$b^2
d$ab <- d$a*d$b
n2 <- neuralnet(class ~ a+b+a2+b2+ab, d, hidden=0)
pred2 <- as.numeric(compute(n2,d[,-3])$net.result > 0.5)
with(d, plot(a, b, col=c('red','blue')[class+1]))
with(d[d$class!=pred2,], points(a, b, pch=19))
table(d$class!=pred2)
===== Vícevrstvá perceptronová síť =====
Předešlá data se nám podařilo klasifikovat jednoduchým perceptronem, ovšem za použití triku. Nyní se pokusíme postupovat jinak (použijeme jiný trik). Místo jediného neuronu využijeme celou síť neuronů.
- V předchozím zapojení vyměňte perceptron za neuronovou síť se skrytými neurony (např. ''nnet(class~a+b, d, size=???, skip=FALSE)'') a pokuste se opět klasifikovat stejná data.
- Jaké úspěšnosti síť dosahuje?
- Jaké parametry jste použili? Kolik neuronů ve vnitřní vrstvě jste použili?
- Vizualizujte chování modelu.
- Jak závisí kvalita modelu na jeho parametrech?
===== Vícevrstvá perceptronová síť: klasifikace ručně psaných číslic =====
Nyní se pokusíme neuronovou síť použít pro klasifikaci do více tříd.
V souboru {{courses:a6m33dvz:cviceni:digits-train.csv|}} naleznete 10x100 naskenovaných ručně psaných číslic (100 exemplářů každé z číslic 0-9), viz {{courses:a6m33dvz:cviceni:digits.png|}}.
Vaším úkolem bude číslice klasifikovat.
- Data načtěte. V prvním sloupci je uložena informace, o jakou číslici se jedná, v dalších pak sekvenčně uložená matice 13x13 pixelů (odstínů šedi).
# nacteni z CSV
d.train <- read.csv('digits-train.csv')
# kolik mame dat?
dim(d.train)
# vypsani jmen prvnich 10ti sloupcu
colnames(d.train)[1:10]
# jmeno prvniho sloupce zmenime na 'class' pro snazsi (intuitivnejsi) praci:
colnames(d.train)[1] <- 'class'
# a typ dat ve sloupci zmenime na 'factor' (bude se to hodit pri konstrukci
# neuronove site, protoze funkce 'nnet' ocekava, ze odezva bude typu 'factor')
d.train$class <- as.factor(d.train$class)
Kód k vykreslení:
# Funkce k vykresleni jedne cislice.
# parametry:
# d - data frame
# idx - index cislice
plotDigit<-function(d,idx) {
# transformace radku z datove matice na matici 13x13
m <- matrix(as.numeric(d[idx,-1]), 13, 13)
# prevraceni matice "vzhuru nohama" a transpozice tak, aby
# funkce 'image' vykreslila to, co chceme:
m <- t(m[nrow(m):1,])
image(m,col=gray.colors(10), xaxt='n', yaxt='n')
}
# budeme kreslit v rastru 2x5 obrazku
opar <- par(mfrow=c(2,5)) # uschovame si soucasne rozlozeni obrazku, tj. 1x1)
# vykreslime jednoho reprezentanta od kazde cislice:
for (idx in 100*(1:10)) plotDigit(d.train,idx)
par(opar) # obnovime puvodni nastaveni obrazku, tj. 1x1
- Na datech natrénujte neuronovou síť. Jaké úspěšnosti dosahuje?
d.train <- cbind(d.train,model.matrix(~d.train$class-1))
names(d.train)[171:180] <- paste0('class',0:9)
form <- as.formula(paste(paste(names(d.train)[171:179],' +',collapse=''),'class9 ~ V2',paste(' +',names(d.train)[3:170],collapse='')))
n <- neuralnet(form, d.train, hidden=20)
# vypsani vah:
summary(n)
# predikce na trenovaci mnozine:
pred <- as.factor(apply(n$net.result[[1]],1,which.max))
# tabulka popisujici uspesnost klasifikace:
tbl.train <- table(d.train$class,pred)
tbl.train
# uspesnost ciselne (podil souctu spravne klasifikovanych cislic (hodnoty na diagonale) vuci vsem cislicim):
sum(diag(tbl.train)) / sum(tbl.train)
- Není síť přeučená? Jaké přesnosti dosáhne model na testovací množině {{courses:a6m33dvz:cviceni:digits-test.csv|}}?
- Studujte závislost úspěšnosti klasifikace na počtu neuronů ve skryté vrstvě.
===== Jiné použití vícevrstvé sítě, jiné typy sítí =====
V dnešním cvičení jsme ilustrovali použití sítí v klasifikačních úlohách. Pomocí vícevrstvé sítě však lze i predikovat hodnotu spojité veličiny (regrese).
Poznamejme ještě, že typů neuronových sítí je mnohem více, a rozsah jejich použití je mnohem širší, než jen klasifikace či regrese. Hopfieldova síť se dá využít jako asociativní paměť či k řešení optimalizačních úloh, Kohonenova samoorganizující se síť zase jako metoda shlukování dat (učení bez učitele).
Další informace je možné nalézt například v knize **Mařík, Štěpánková, Lažanský: Umělá inteligence 4 v kapitole 7: Vybrané partie z neuronových sítí**.