{{indexmenu_n>8}} Obsah této stránky bude přístupný od 23. 11. 2017. ====== Cvičení 8 - Perceptron, neuronové sítě ====== Test: https://goo.gl/forms/1aLyuR5zDgYypfFR2 - 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í**.