![](https://miro.medium.com/proxy/1*dmoRN3Wh7xyDQ1bDQcnToA.gif)
keinotekoinen neuroverkko (Ann) muodostuu monista toisiinsa liittyneistä neuroneista:
![](https://miro.medium.com/proxy/1*3UpdymQx-C1tBKRnfD7eOg.gif)
jokainen hermosolu ottaa joitakin liukulukuja (esim.1, 0, 0, 5, -1.0) ja kertoo ne joillakin muilla liukulukuluvuilla (esim. 0.7, 0.6, 1.4), joita kutsutaan painoiksi (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). Painot toimivat mekanismina, jolla voidaan keskittyä tiettyihin syötteisiin tai jättää ne huomiotta.
![](https://miro.medium.com/max/60/1*9rKe_wAeIn5bE8oFa4xcNg.jpeg?q=20)
painotetut tulot sitten summataan yhteen (esim. 0.7 + 0.3 + -1.4 = -0.4) yhdessä bias-arvon kanssa (esim.-0.4 + -0.1 = -0.5).
summattu arvo (x) muuttuu nyt lähtöarvoksi (y) neuronin aktivointifunktion (y = f(x)) mukaan. Alla on esitetty muutamia suosittuja aktivointifunktioita:
![](https://miro.medium.com/proxy/1*RD0lIYqB5L2LrI2VTIZqGw.png)
esim.-0.5 → -0.05 jos käytämme vuotavaa korjattua lineaarista yksikköä (leaky Relu) aktivointifunktio: y = f(x) = F(-0.5) = max(0.1*-0.5, -0.5) = Max(-0.05, -0.5) = -0.05
neuronin ulostuloarvo (esimerkiksi -0,05) on usein toisen hermosolun tulo.
![](https://miro.medium.com/proxy/1*pO5X2c28F1ysJhwnmPsy3Q.gif)
![](https://miro.medium.com/proxy/1*By-gx36gxOgfXa37zZCbSw.png)
kuitenkin yksi ensimmäisistä ans tunnettiin nimellä Perceptron ja se koostui vain yksi neuroni.
![](https://miro.medium.com/proxy/1*RHJvNYSqz_CzgTELnEASsg.png)
perceptronin (vain) neuronin ulostulo toimii lopullisena ennusteena.
![](https://miro.medium.com/proxy/1*4vHDsYc0IKWDdtoZ3EHOgQ.gif)
antaa koodata omaa perceptronia:
import numpy as npclass Neuron:
def __init__(self, n_inputs, bias = 0., weights = None):
self.b = bias
if weights: self.ws = np.array(weights)
else: self.ws = np.random.rand(n_inputs)
def __call__(self, xs):
return self._f(xs @ self.ws + self.b)
def _f(self, x):
return max(x*.1, x)
(Huom.Emme ole sisällyttäneet mitään oppimisalgoritmia yllä olevaan esimerkkiimme — käsittelemme oppimisalgoritmeja toisessa tutoriaalissa)
perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
![](https://miro.medium.com/proxy/1*8ehbXyEEMwlk8eIHy_GvDQ.png)
![](https://miro.medium.com/proxy/1*8ehbXyEEMwlk8eIHy_GvDQ.png)
joten miksi tarvitsemme annissa niin monta neuronia, jos yksikin riittää (luokittelijana)?
![](https://miro.medium.com/proxy/1*Z3Msm7PINQcol5hVWgKRFg.gif)
valitettavasti yksittäiset neuronit pystyvät luokittelemaan vain lineaarisesti eroteltavaa dataa.
![](https://miro.medium.com/proxy/1*5l08QfsUsrsOxcPzfDoStg.png)
kuitenkin yhdistämällä neuronit yhteen yhdistämme oleellisesti niiden päätösrajat. Siksi monista neuroneista koostuva ANN pystyy oppimaan monimutkaisia, epälineaarisia päätöksenteon rajoja.
![](https://miro.medium.com/proxy/1*uxa4td8GJGUwWdhnl_gy1A.jpeg)
neuronit ovat yhteydessä toisiinsa tietyn verkkoarkkitehtuurin mukaisesti. Vaikka arkkitehtuureja on erilaisia, lähes kaikki niistä sisältävät kerroksia. (HUOM.: Saman kerroksen neuronit eivät yhdisty toisiinsa)
![](https://miro.medium.com/proxy/1*wQD8qKaGR_lf902l5hx18w.jpeg)
on tyypillisesti tulokerros (sisältää useita neuroneja yhtä suuri kuin tietojen syöttöominaisuuksien määrä), lähtökerros (joka sisältää neuronien määrän yhtä monta luokkaa) ja piilotettu kerros (joka sisältää minkä tahansa määrän neuroneja).
![](https://miro.medium.com/proxy/1*iUCUi5basOzITk7CHApSLQ.png)
voi olla useampia piilokerroksia, joiden avulla neuroverkko oppii monimutkaisempia päätöksentekorajoja (mikä tahansa neuraalinen verkkoa, jossa on useampi kuin yksi piilokerros, pidetään syvänä neuroverkkona).
Lets build a deep NN to paint this picture:
![](https://miro.medium.com/proxy/1*G7rDmEBb50clgKjunnXr4A.jpeg)
lets download kuva ja sen pikselien lataaminen taulukkoon
!curl -O https://pmcvariety.files.wordpress.com/2018/04/twitter-logo.jpg?w=100&h=100&crop=1from PIL import Image
image = Image.open('twitter-logo.jpg?w=100')import numpy as np
image_array = np.asarray(image)
nyt Annin opettaminen maalaamaan on valvottu oppimistehtävä, joten meidän on luotava merkityt koulutussarjat (koulutustietoissamme on Tulo-ja odotusetiketit jokaiselle syötölle). Harjoitustuloilla on 2 arvoa (kunkin pikselin x -, y-koordinaatit).
kuvan yksinkertaisuuden vuoksi tätä ongelmaa voisi oikeastaan lähestyä jommallakummalla kahdella tavalla. Luokitteluongelma (jossa neuroverkko ennustaa kuuluuko pikseli ”siniseen” vai ”harmaaseen” luokkaan XY-koordinaattiensa perusteella) tai regressio-ongelma (jossa neuroverkko ennustaa pikselin RGB-arvot sen koordinaattien perusteella).
Jos tätä käsitellään regressio-ongelmana: harjoitustuloksilla on 3 arvoa (normalisoidut R -, g-ja b-arvot kullekin pikselille). – Käytetään tätä menetelmää toistaiseksi.
training_inputs,training_outputs = ,
for row,rgbs in enumerate(image_array):
for column,rgb in enumerate(rgbs):
training_inputs.append((row,column))
r,g,b = rgb
training_outputs.append((r/255,g/255,b/255))
nyt lets create our ANN:
![](https://miro.medium.com/proxy/1*Ne7jPeR6Vrl1f9d7pLLG8Q.jpeg)
- siinä pitäisi olla 2 hermosolua tulokerroksessa (koska on olemassa 2 arvoa otettavaksi: x&Y-koordinaatit).
- siinä pitäisi olla 3 hermosolua lähtökerroksessa (koska opittavia arvoja on 3: R, g, b).
- piilotettujen kerrosten lukumäärä ja neuronien lukumäärä kussakin piilotetussa kerroksessa on kaksi hyperparametriä kokeiltavaksi (sekä niiden aikakausien lukumäärä, joita varten sitä koulutamme, aktivointifunktio jne.) — käytän 10 piilotettua kerrosta,joissa on 100 neuronia kussakin piilotetussa kerroksessa (tehden tästä syvän neuroverkkoa)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)
koulutettu verkko voi nyt ennustaa normalisoidut rgb-arvot mille tahansa koordinaatille (esim. x, y = 1,1).
ann.predict(])
array(])
antaa Annin avulla ennustaa rgb — arvot jokaiselle koordinaatistolle ja näyttää ennustetut rgb-arvot koko kuvalle nähdäkseen, miten hyvin se pärjäsi (laadullisesti-jätämme arviointimittarit toiselle tutoriaalille)
predicted_outputs = ann.predict(training_inputs)predicted_image_array = np.zeros_like(image_array)
i = 0
for row,rgbs in enumerate(predicted_image_array):
for column in range(len(rgbs)):
r,g,b = predicted_outputs
predicted_image_array =
i += 1
Image.fromarray(predicted_image_array)
![](https://miro.medium.com/proxy/1*tBY-HqwDe6ys6Xs4sSAZ4w.png)
yritä vaihtaa hyperparametrit saadaksesi parempia tuloksia.
Jos tätä ei käsitellä regressio-ongelmana vaan luokitteluongelmana, harjoitustuloksilla on 2 arvoa (pikselin todennäköisyydet kuuluvat kumpaankin luokkaan: ”sininen” ja ”harmaa”)
training_inputs,training_outputs = ,
for row,rgbs in enumerate(image_array):
for column,rgb in enumerate(rgbs):
training_inputs.append((row,column))
if sum(rgb) <= 600:
label = (0,1) #blue class
else:
label = (1,0) #grey class
training_outputs.append(label)
voimme rakentaa annimme binääriluokittajaksi, jossa on 2 neuronia tulokerroksessa, 2 neuronia lähtökerroksessa ja 100 neuronia piilokerroksessa (10 piilotettua kerrosta)
from sklearn.neural_network import MLPClassifier
ann = MLPClassifier(hidden_layer_sizes= tuple(100 for _ in range(10)))
ann.fit(training_inputs, training_outputs)
koulutetun annin avulla voidaan nyt ennustaa, mihin luokkaan kukin pikseli kuuluu (0: ”harmaa” tai 1: ”Sininen”). The argmax function is used to find which class has the highest probability
np.argmax(ann.predict(]))
(this indicates the pixel with xy-coordinates 1,1 is most likely from class 0: ”grey”)
predicted_outputs = ann.predict(training_inputs)predicted_image_array = np.zeros_like(image_array)
i = 0
for row,rgbs in enumerate(predicted_image_array):
for column in range(len(rgbs)):
prediction = np.argmax(predicted_outputs)
if prediction == 0:
predicted_image_array =
else:
predicted_image_array =
i += 1
Image.fromarray(predicted_image_array)
![](https://miro.medium.com/proxy/1*bG0WXrYqMGyr4rq_sd7x0w.png)
![](https://miro.medium.com/proxy/1*qOfNQfo5UgqwzAYSGVTGHw.png)