Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

Cvičení 8 - Perceptron, neuronové sítě

Test: https://goo.gl/forms/1aLyuR5zDgYypfFR2

  1. Co je to perceptron?
    1. Jak se v něm vybavuje odpověď? Co je jeho odpovědí?
    2. Jak se perceptron učí?
    3. K čemu se dá použít?
  2. Co je to vícevrstvá perceptronová síť?
    1. Jak se volí počty neuronů v jednotlivých vrstvách?
    2. Jak probíhá učení vícevrstvé sítě pomocí algoritmu Backpropagation?

Perceptron

Vyzkoušíme chování perceptronu na datech ctvrtkruh.csv.

  1. 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]))

  1. Na datech natrénujte “Perceptron”.

library(neuralnet)
n <- neuralnet(class ~ a+b, d, hidden=0) 

plot(n)
summary(n)

  1. Jakou funkcí perceptron data rozděluje? Interpretujte parametry modelu.
  2. 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))

  1. 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ů.

  1. 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.
  2. Jaké úspěšnosti síť dosahuje?
  3. Jaké parametry jste použili? Kolik neuronů ve vnitřní vrstvě jste použili?
  4. Vizualizujte chování modelu.
  5. 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 digits-train.csv naleznete 10×100 naskenovaných ručně psaných číslic (100 exemplářů každé z číslic 0-9), viz .

Vaším úkolem bude číslice klasifikovat.

  1. 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 13×13 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

  1. 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)

  1. Není síť přeučená? Jaké přesnosti dosáhne model na testovací množině digits-test.csv?
  2. 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í.

courses/a6m33dvz/cviceni/08-nnet.txt · Last modified: 2017/11/23 13:55 by anyzjiri