djupinlärning: Mata framåt neurala nätverk (FFNNs)

ett djupt flöde framåt neuralt nätverk (FFNN) — aka multi-Layered Perceptron (MLP)

ett artificiellt neuralt nätverk (ann) är tillverkat av många sammankopplade neuroner:

en enda neuron från ett artificiellt neuralt nätverk (Ann)

varje neuron tar in några flyttal (t.ex. 1.0, 0.5, -1.0) och multiplicerar dem med några andra flyttal (t. ex. 0,7, 0,6, 1,4) kända som vikter (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). Vikterna fungerar som en mekanism för att fokusera på eller ignorera vissa ingångar.

vikter fungerar som mjuka grindar för att ignorera vissa funktioner (0) och fokusera på andra (+1) eller till och med hämma dem (-1)

de viktade ingångarna summeras sedan tillsammans (t. ex. 0.7 + 0.3 + -1.4 = -0.4) tillsammans med ett biasvärde (t.ex. -0.4 + -0.1 = -0.5).

det summerade värdet (x) omvandlas nu till ett utgångsvärde (y) enligt neurons aktiveringsfunktion(y = f (x)). Några populära aktiveringsfunktioner visas nedan:

ett litet urval av populära Aktiveringsfunktioner

t.ex. -0.5 om vi använder den läckande rektifierade linjära enheten (läckande Relu) aktiveringsfunktion: y = F(X) = F(-0.5) = max(0.1*-0.5, -0.5) = Max(-0.05, -0.5) = -0.05

neuronens utgångsvärde (t.ex. -0.05) är ofta en ingång för en annan neuron.

en neurons utgångsvärde matas ofta in som en ingång till andra neuroner i det artificiella neurala nätverket (ANN)
perceptronen, ett av de första neurala nätverken, är gjord av bara en enda neuron

en av de första anns var dock känd som perceptronen och den bestod av av endast en enda neuron.

perceptronen

utgången från perceptronens (enda) neuron fungerar som den slutliga förutsägelsen.

varje Neuron är en linjär binär klassificerare helt på egen hand (t. ex. ett utgångsvärde >= 0 indikerar den blå klassen, medan ett utgångsvärde < 0 indikerar den röda klassen)

låter koda 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)

(Obs: vi har inte inkluderat någon inlärningsalgoritm i vårt exempel ovan — vi ska täcka inlärningsalgoritmer i en annan handledning)

perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
Lägg märke till att genom att justera värdena på vikterna och förspänningen kan du justera neuronens beslutsgräns. (OBS: en neuron lär sig genom att uppdatera sina vikter och förspänningsvärden för att minska felet i sina beslut).

så varför behöver vi så många neuroner i en ANN om någon kommer att räcka (som klassificerare)?

begränsningar: neuronen är en binär klassificerare eftersom den bara kan lära sig att skilja mellan två klasser (t.ex. blå och röd) max. Neuronen är en linjär klassificerare eftersom dess beslutsgräns approximerar till en rak linje för 2D-data (eller ett plattplan för 3D-data, etc)

tyvärr kan enskilda neuroner bara klassificera linjärt separerbara data.

men genom att kombinera neuroner tillsammans kombinerar vi i huvudsak deras beslutsgränser. Därför kan en ANN som består av många neuroner lära sig komplexa, icke-linjära beslutsgränser.

genom att kombinera neuroner kan neurala nätverk lära sig mer komplexa, icke-linjära Beslutsgränser

neuroner är kopplade ihop enligt en specifik nätverksarkitektur. Även om det finns olika arkitekturer, innehåller nästan alla lager. (OBS: Neuroner i samma lager ansluter inte till varandra)

neurala nätverk innehåller lager

det finns vanligtvis ett ingångslager (innehållande ett antal neuroner ett utgångsskikt (innehållande ett antal neuroner lika med antalet klasser) och ett dolt lager (innehållande valfritt antal neuroner).

djupa neurala nätverk innehåller flera dolda lager

nät med mer än ett dolt lager anses vara ett djupt neuralt nät).

Låt oss bygga en djup NN för att måla den här bilden:

en exempelbild som vår ANN kommer att lära sig att måla (det kommer att lära sig att associera vissa färger till vissa regioner i bilden)

låter ladda ner bilden och ladda sina pixlar i en array

!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)

nu lär vi vår Ann att måla är en övervakad inlärningsuppgift, så vi måste skapa en märkt träningsuppsättning (våra träningsdata kommer att ha ingångar och förväntade utgångsetiketter för varje ingång). Träningsingångarna kommer att ha 2 värden (X,y-koordinaterna för varje pixel).

Med tanke på bildens enkelhet kan vi faktiskt närma oss detta problem på ett av två sätt. Ett klassificeringsproblem (där neurala nätet förutsäger om en pixel tillhör den” blå ”klassen eller den” grå ” klassen, med tanke på dess XY-koordinater) eller ett regressionsproblem (där neurala nätet förutsäger RGB-värden för en pixel med tanke på dess koordinater).

om du behandlar detta som ett regressionsproblem: träningsutgångarna kommer att ha 3 värden (de normaliserade R,g,b-värdena för varje pixel). – Låt oss använda den här metoden för nu.

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

Nu kan vi skapa vår ANN:

ett helt anslutet feed-forward neuralt nätverk (FFNN)-aka en flerskiktad perceptron (MLP)
  • det ska ha 2 neuroner i ingångsskiktet (eftersom det finns 2 värden att ta in: x & Y — koordinater).
  • Det ska ha 3 neuroner i utgångsskiktet (eftersom det finns 3 värden att lära sig: r, g, b).
  • antalet dolda lager och antalet neuroner i varje dolt lager är två hyperparametrar att experimentera med (liksom antalet epoker vi kommer att träna det för, aktiveringsfunktionen etc) — jag använder 10 dolda lager med 100 neuroner i varje dolt lager (vilket gör detta till ett djupt neuralt nätverk)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)

det utbildade nätverket kan nu förutsäga de normaliserade rgb-värdena för alla koordinater (t.ex. x, y = 1,1).

ann.predict(])

array(])

låter använda ANN för att förutsäga rgb — värdena för varje koordinat och låter visa de förutsagda rgb-värdena för hela bilden för att se hur bra det gjorde (kvalitativt-vi ska lämna utvärderingsmätningar för en annan handledning)

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)
vår anns målning (förutsagda pixelfärger)

försök ändra hyperparametrarna för att få bättre resultat.

om vi istället för att behandla detta som ett regressionsproblem behandlar vi detta som ett klassificeringsproblem, då kommer träningsutgångarna att ha 2 värden (sannolikheten för pixeln som tillhör var och en av de två klasserna: ”blå” och ”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 bygga om vår ANN som en binär klassificerare med 2 neuroner i ingångsskiktet, 2 neuroner i utgångsskiktet och 100 neuroner i det dolda lagret (med 10 dolda lager)

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 nu använda den utbildade ann för att förutsäga klassen som varje pixel tillhör (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)
The predicted class for each pixel
The expected class for each pixel

Lämna ett svar

Din e-postadress kommer inte publiceras.