![](https://miro.medium.com/proxy/1*dmoRN3Wh7xyDQ1bDQcnToA.gif)
et kunstig nevralt nettverk (ann) er laget av mange sammenkoblede nevroner:
![](https://miro.medium.com/proxy/1*3UpdymQx-C1tBKRnfD7eOg.gif)
hver nevron tar i noen flytende punkt tall (f.eks 1.0, 0.5, -1.0) og multipliserer dem med noen andre flytende punkt tall (f. eks 0,7, 0,6, 1,4) kjent som vekter (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). Vektene fungere som en mekanisme for å fokusere på, eller ignorere, visse innganger.
![](https://miro.medium.com/max/60/1*9rKe_wAeIn5bE8oFa4xcNg.jpeg?q=20)
de vektede inngangene blir så summert sammen (f. eks. 0.7 + 0.3 + -1.4 = -0.4) sammen med en bias verdi (f. eks -0,4 + -0,1 = -0,5).
den summerte verdien (x) blir nå omdannet til en utgangsverdi (y) i henhold til nevronets aktiveringsfunksjon (y = f(x)). Noen populære aktiveringsfunksjoner er vist nedenfor:
![](https://miro.medium.com/proxy/1*RD0lIYqB5L2LrI2VTIZqGw.png)
f.eks. -0.5 → -0.05 hvis vi bruker leaky rectified linear unit (leaky relu) aktiveringsfunksjon: y = f(x) = f(-0,5) = max(0,1*-0,5, -0,5) = max(-0,05, -0,5) = -0.05
neurons utgangsverdi (f. eks. -0,05) er ofte en inngang for et annet neuron.
![](https://miro.medium.com/proxy/1*pO5X2c28F1ysJhwnmPsy3Q.gif)
![](https://miro.medium.com/proxy/1*By-gx36gxOgfXa37zZCbSw.png)
imidlertid var en av de første annene kjent som perceptronen, og den besto av av bare en enkelt neuron.
![](https://miro.medium.com/proxy/1*RHJvNYSqz_CzgTELnEASsg.png)
utgangen av perceptronens (eneste) neuron fungerer som den endelige prediksjonen.
![](https://miro.medium.com/proxy/1*4vHDsYc0IKWDdtoZ3EHOgQ.gif)
lar kode vår egen perceptron:
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)
(Merk: vi har ikke tatt med noen læringsalgoritme i vårt eksempel ovenfor — vi skal dekke læringsalgoritmer i en annen opplæring)
perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
![](https://miro.medium.com/proxy/1*8ehbXyEEMwlk8eIHy_GvDQ.png)
så hvorfor trenger vi så mange nevroner i EN ANN hvis noen vil være tilstrekkelig (som klassifiserer)?
![](https://miro.medium.com/proxy/1*Z3Msm7PINQcol5hVWgKRFg.gif)
Dessverre kan individuelle nevroner bare klassifisere lineært separerbare data.
![](https://miro.medium.com/proxy/1*5l08QfsUsrsOxcPzfDoStg.png)
men ved å kombinere nevroner sammen, kombinerer vi i hovedsak deres beslutningsgrenser. DERFOR ER EN ANN sammensatt av mange nevroner i stand til å lære komplekse, ikke-lineære beslutningsgrenser.
![](https://miro.medium.com/proxy/1*uxa4td8GJGUwWdhnl_gy1A.jpeg)
Nevroner er koblet sammen i henhold til en bestemt nettverksarkitektur. Selv om det er forskjellige arkitekturer, inneholder nesten alle lag. (NB: Nevrale Nettverk inneholder Lag
![](https://miro.medium.com/proxy/1*wQD8qKaGR_lf902l5hx18w.jpeg)
Nevrale Nettverk inneholder Lag
Det er typisk et inngangslag (som inneholder en rekke nevroner). antall inngangsfunksjoner i dataene), et utgangslag (som inneholder et antall nevroner lik antall klasser) og et skjult lag (som inneholder et hvilket som helst antall nevroner).
![](https://miro.medium.com/proxy/1*iUCUi5basOzITk7CHApSLQ.png)
det kan være mer enn ett skjult lag for å la det nevrale nettet lære mer komplekse beslutningsgrenser (noen nevrale nettverk).net med mer enn ett skjult lag regnes som et dypt nevralt nett).
Lar bygge en dyp NN å male dette bildet:
![](https://miro.medium.com/proxy/1*G7rDmEBb50clgKjunnXr4A.jpeg)
lar nedlasting i en matrise
!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)
nå lærer vår ann å male er en overvåket læringsoppgave, så vi må lage et merket treningssett (våre treningsdata vil ha innganger og forventede UTDATAETIKETTER for hver inngang). Treningsinngangene vil ha 2 verdier (x, y koordinatene til hver piksel).
Gitt enkelheten i bildet, kan vi faktisk nærme seg dette problemet på en av to måter. Et klassifikasjonsproblem (hvor nevrale nettet forutsier om en piksel tilhører den» blå «klassen eller den» grå » klassen, gitt xy-koordinatene) eller et regresjonsproblem(hvor nevrale nettet forutsier RGB-verdier for en piksel gitt koordinatene).
hvis du behandler dette som et regresjonsproblem: treningsutgangene vil ha 3 verdier (de normaliserte r,g,b-verdiene for hver piksel). – Kan bruke denne metoden for nå.
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))
nå kan lage VÅR ANN:
![](https://miro.medium.com/proxy/1*Ne7jPeR6Vrl1f9d7pLLG8Q.jpeg)
- det skal ha 2 nevroner i inngangslaget (siden det er 2 verdier å ta inn: x & y koordinater).
- Det skal ha 3 nevroner i utgangslaget (siden det er 3 verdier å lære: r, g, b).jeg vil bruke 10 skjulte lag med 100 nevroner i hvert skjult lag (noe som gjør dette til et dypt nevralt nettverk)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)
det trente nettverket kan nå forutsi de normaliserte rgb — verdiene for eventuelle koordinater (dette vil si at det ikke er nok). f. eks. x, y = 1,1).
ann.predict(])
array(])
lar BRUKE ANN å forutsi rgb verdier for hver koordinat og lar vise spådd rgb verdier for hele bildet for å se hvor godt det gjorde (kvalitativt — vi skal forlate evaluering beregninger for en annen tutorial)
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)
prøv å endre hyperparametrene for å få bedre resultater.Hvis vi i stedet for å behandle dette som et regresjonsproblem, behandler dette som et klassifiseringsproblem, vil treningsutgangene ha 2 verdier (sannsynlighetene for pikselen som tilhører hver av de to klassene: «blå» og «grå»)
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)
VI kan gjenoppbygge VÅR ANN som en binær klassifikator med 2 nevroner i inngangslaget, 2 nevroner i utgangslaget og 100 nevroner i det skjulte laget (med 10 skjulte lag)
from sklearn.neural_network import MLPClassifier
ann = MLPClassifier(hidden_layer_sizes= tuple(100 for _ in range(10)))
ann.fit(training_inputs, training_outputs)
vi kan nå bruke den trente ann å forutsi klassen som hver piksel tilhører (0: «grå» eller 1: «blå»). 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)