Hluboké Učení: Feed Forward Neuronové Sítě (FFNNs)

Hluboké Feed Forward Neuronové Sítě (FFNN) — aka vícevrstvý Perceptron (MLP)

Umělé Neuronové Sítě (ANN) je vyroben z mnoha vzájemně propojených neuronů.

jeden Neuron z Umělé Neuronové Sítě (ANN)

Každý neuron má čísla s plovoucí desetinnou čárkou (např. 1.0, 0.5, -1.0) a násobí je některými jinými čísly s pohyblivou řádovou čárkou (např. 0,7, 0,6, 1,4) známými jako váhy (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). Váhy fungují jako mechanismus, který se zaměřuje na určité vstupy nebo je ignoruje.

Závaží působit jako měkké brány ignorovat některé vlastnosti (0) a soustředit se na další (+1), nebo dokonce inhibovat (-1)

vážené vstupy pak se sečtou dohromady (např. 0.7 + 0.3 + -1.4 = -0.4) spolu s hodnotou zkreslení (např. -0,4 + -0,1 = -0,5).

součtová hodnota (x) je nyní transformována na výstupní hodnotu (y) podle aktivační funkce neuronu (y = f(x)). Některé populární aktivačních funkcí jsou uvedeny níže:

malý výběr Populárních Aktivace Funkce

např. -0.5 → -0.05 pokud budeme používat Děravý Opraveny Lineární Jednotky (Děravé ReLU) aktivace funkce: y = f(x) = f(-0.5) = max(0.1*-0.5, -0.5) = max(-0.05, -0.5) = -0.05

výstupní hodnota neuronu (např. -0,05) je často vstup pro jiný neuron.

Neuron je výstupní hodnota se často živí jako vstup do dalších Neuronů v Umělé Neuronové Sítě (ANN)
Perceptron, jeden z prvních Neuronové Sítě, je vyroben jen jeden Neuron

Nicméně, jeden z prvních ANNs byl známý jako perceptron a to se skládala z pouze jeden neuron.

Perceptron

výstup perceptron je (pouze) neuron se chová jako konečné předpovědi.

Každý Neuron je lineární binární klasifikátor, který na své vlastní (např. výstupní hodnota >= 0 indikuje modré třídě, zatímco výstupní hodnota < 0 označuje červená třída)

Umožňuje kód vlastní 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)

(Poznámka: jsme nejsou zahrnuty žádné algoritmus učení v našem příkladu výše jsme se pokrýt algoritmy učení v jiném tutoriálu)

perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
Všimněte si, že úpravou hodnot vah a zaujatost, můžete nastavit neuron je rozhodovací hranice. (Pozn.: neuron se učí aktualizací svých vah a hodnot zkreslení, aby se snížila chyba jeho rozhodnutí).

tak proč potřebujeme tolik neuronů v ANN, pokud některý postačí (jako klasifikátor)?

Omezení: neuron je binární klasifikátor, protože to může jen naučit rozlišovat mezi dvěma třídami (např. modrá a červená) max. Neuron je lineární klasifikátor, protože je rozhodovací hranice se blíží k přímce pro 2D data (nebo rovinu pro 3D data, atd.)

Bohužel, jednotlivé neurony jsou schopni klasifikovat lineárně separabilní data.

Nicméně, tím, že kombinuje neurony spolu, jsme v podstatě zkombinovali své rozhodnutí hranice. Proto, ANN složená z mnoha neuronů je schopna se naučit složité, nelineární rozhodovací hranice.

Kombinace Neuronů umožňuje Neuronové Sítě naučit se složitější, Nelineární Rozhodnutí, Hranice,

Neurony jsou spojeny dohromady podle konkrétní síťové architektury. Ačkoli existují různé architektury, téměř všechny obsahují vrstvy. (Pozn .: Neurony ve stejné vrstvě nepřipojujte jedna s druhou)

Neuronové Sítě obsahují Vrstvy

Tam je obvykle vstupní vrstva (obsahující počet neuronů roven počtu vstupních prvků v datové), výstupní vrstva (obsahující počet neuronů odpovídá počtu tříd) a skryté vrstvy (obsahující libovolný počet neuronů).

Hluboké neuronové sítě obsahují více skrytých vrstev

Tam může být více než jedna skrytá vrstva, aby se neuronová síť se dozvědět více komplexní rozhodovací hranice (neurální síť s více než jednou skrytou vrstvou je považován za hluboké neuronové sítě).

umožňuje vytvořit hluboký NN malovat tento obrázek:

příklad image, že naše ANN se naučit malovat (To bude učení spojit určité barvy na určité oblasti obrázku)

Umožňuje stáhnout obrázek a nahrát své pixelů do pole

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

Nyní učí naše ANN malovat je pod dohledem, učení, úkol, tak musíme vytvořit označeny školení set (Naše data školení bude mít vstupy a očekávané výstupy etikety pro každý vstup). Tréninkové vstupy budou mít 2 hodnoty (souřadnice X, y každého pixelu).

vzhledem k jednoduchosti obrazu bychom k tomuto problému mohli přistoupit jedním ze dvou způsobů. Klasifikační problém (kde neuronová síť předpovídá, zda pixel patří do třídy“ modrá „nebo“ šedá“, vzhledem k jeho souřadnicím xy) nebo regresní problém (kde neuronová síť předpovídá hodnoty RGB pro pixel vzhledem k jeho souřadnicím).

Pokud se jedná o regresní problém: tréninkové výstupy budou mít 3 hodnoty (normalizované hodnoty r, g, b pro každý pixel). – Umožňuje používat tuto metodu pro tuto chvíli.

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

Nyní umožňuje vytvořit naše ANN:

plně připojen feed-forward neural network (FFNN) — aka vícevrstvý perceptron (MLP)
  • mělo by To mít 2 neurony ve vstupní vrstvě (protože tam jsou 2 hodnoty vzít v: x & y souřadnice).
  • měl by mít 3 neurony ve výstupní vrstvě (protože existují 3 hodnoty, které se mají naučit: r, g, b).
  • počet skrytých vrstev a počet neuronů v každé skryté vrstvě jsou dvě hyperparameters experimentovat s (stejně jako počet epoch budeme trénovat to, aktivační funkce, atd.) — budu používat 10 skryté vrstvy s 100 neuronů v každé skryté vrstvě (takže to hluboké neuronové sítě)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)

vyškolený sítě mohou nyní předpovídají, normalizované hodnoty rgb pro všechny souřadnice (např. x,y = 1,1).

ann.predict(])

array(])

umožňuje použít ANN předpovědět hodnoty rgb pro každý souřadnic a umožňuje zobrazit předpokládané hodnoty rgb pro celý obraz vidět, jak dobře to udělal (kvalitativně — necháme hodnotící metriky pro další 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)
Naše ANN Obraz (předpokládaná pixel barvy)

Zkuste změnit hyperparameters získat lepší výsledky.

Pokud se místo toho jedná o regresní problém, budeme to považovat za klasifikační problém, pak výcvik výstupy bude mít 2 hodnoty (pravděpodobnosti, že pixel patřící do každé ze dvou tříd: „blue“ a „šedá“)

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)

můžeme obnovit naše ANN jako binární klasifikátor s 2 neurony ve vstupní vrstvě, 2 neurony ve výstupní vrstvě a 100 neuronů ve skryté vrstvě (s 10 skryté vrstvy)

from sklearn.neural_network import MLPClassifier
ann = MLPClassifier(hidden_layer_sizes= tuple(100 for _ in range(10)))
ann.fit(training_inputs, training_outputs)

nyní můžeme použít vyškoleni ANN předvídat třídy, která každý pixel patří (0: „šedá“ nebo 1: „modrá“). 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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.