mély tanulás: Feed Forward neurális hálózatok (FFNNS)

a Deep Feed Forward neurális hálózat (FFNN) — más néven többrétegű Perceptron (MLP)

egy mesterséges neurális hálózat (Ann) sok összekapcsolt neuronból áll:

egyetlen Neuron egy mesterséges neurális Hálózatból (Ann)

minden Neuron felvesz néhány lebegőpontos számot (például 1,0, 0,5, -1.0) és megszorozza őket más lebegőpontos számokkal (pl. 0,7, 0,6, 1,4), amelyeket súlyoknak neveznek (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). A súlyok mechanizmusként működnek, hogy összpontosítsanak, vagy figyelmen kívül hagyják, bizonyos bemenetek.

a súlyok puha kapukként működnek, hogy figyelmen kívül hagyjanak néhány funkciót (0) és összpontosítson másokra (+1), vagy akár gátolja őket (-1)

a súlyozott bemenetek ezután összeadódnak (pl. 0.7 + 0.3 + -1.4 = -0.4) egy torzítási értékkel együtt (például -0,4 + -0,1 = -0,5).

az összegzett érték (x) most átalakul kimeneti értékké (y) a neuron aktiválási funkciójának megfelelően (y = f(x)). Néhány népszerű aktiválási funkció az alábbiakban látható:

a népszerű aktiválási funkciók kis választéka

pl. -0,5 -0,05 ha a szivárgó korrigált lineáris egységet (szivárgó Relu) aktiváló funkciót használjuk: y = f(x) = f(-0,5) = max(0,1*-0,5, -0,5) = Max(-0,05, -0,5) = -0.05

A neuron kimeneti értéke (például -0,05) gyakran egy másik neuron bemenete.

egy Neuron kimeneti értéke gyakran a mesterséges ideghálózat (ANN) más neuronjainak bemeneteként táplálkozik
a perceptron, az egyik első neurális hálózat, csak egyetlen neuronból áll

azonban az egyik első Ann-t Perceptron néven ismerték, és csak egyetlen Neuron.

a Perceptron

a perceptron (csak) neuronjának kimenete szolgál végső előrejelzésként.

minden Neuron önmagában lineáris bináris osztályozó (pl. egy kimeneti érték >= 0 jelzi a kék osztályt, míg egy kimeneti érték < 0 jelzi a piros osztály)

lehetővé teszi a kód saját 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)

(megjegyzés: a fenti példában nem tartalmaztunk tanulási algoritmust — a tanulási algoritmusokat egy másik oktatóanyagban fogjuk lefedni)

perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
vegye figyelembe, hogy a súlyok és az elfogultság értékeinek beállításával beállíthatja az idegsejt döntési határát. (Megjegyzés: egy neuron úgy tanul, hogy frissíti súlyait és elfogultsági értékeit, hogy csökkentse döntéseinek hibáit).

akkor miért van szükségünk annyi neuronra egy ANN-ben, ha bármelyik elegendő (osztályozóként)?

korlátozások: a neuron bináris osztályozó, mivel csak két osztály (pl. kék és piros) megkülönböztetésére képes. A neuron lineáris osztályozó, mert döntési határa megközelíti a 2D adatok egyenes vonalát (vagy a 3D adatok sík síkját stb.)

sajnos az egyes idegsejtek csak lineárisan elválasztható adatokat képesek osztályozni.

az idegsejtek kombinálásával azonban lényegében egyesítjük döntési határaikat. Ezért egy sok neuronból álló ANN képes megtanulni összetett, nemlineáris döntési határokat.

a neuronok kombinálása lehetővé teszi a neurális hálózatok számára, hogy összetettebb, nemlineáris döntési határokat tanuljanak

a neuronok egy adott hálózati architektúra szerint kapcsolódnak egymáshoz. Bár vannak különböző architektúrák, szinte mindegyik tartalmaz rétegeket. (NB: Az azonos rétegben lévő neuronok nem kapcsolódnak egymáshoz)

a neurális hálózatok rétegeket tartalmaznak

általában van egy bemeneti réteg (amely számos idegsejtet tartalmaz) egy kimeneti réteg (amely az osztályok számával megegyező számú neuront tartalmaz) és egy rejtett réteg (amely tetszőleges számú neuront tartalmaz).

a mély neurális hálózatok több rejtett réteget tartalmaznak

egynél több rejtett réteg is lehet, amely lehetővé teszi az idegháló számára, hogy összetettebb döntési határokat tanuljon meg (bármilyen neurális hálózat az egynél több rejtett réteggel rendelkező hálót mély neurális hálónak tekintik).

lehetővé teszi, hogy építsenek egy mély NN festeni ezt a képet:

egy példa kép, hogy a ANN tanulni fog festeni (ez lesz a tanulás társítani bizonyos színek bizonyos régiókban a kép)

Lets download

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

most az Ann-nek a festésre való tanítása felügyelt tanulási feladat, ezért létre kell hoznunk egy címkézett képzési készletet (a képzési adatainkban minden bemenethez lesznek bemenetek és várható kimeneti címkék). A képzési bemeneteknek 2 értéke lesz (az egyes pixelek x,y koordinátái).

a kép egyszerűsége miatt ezt a problémát kétféle módon lehet megközelíteni. Osztályozási probléma (ahol az idegháló megjósolja, hogy egy pixel a “kék” vagy a “szürke” osztályba tartozik-e, tekintettel annak XY koordinátái) vagy regressziós probléma (ahol az idegháló megjósolja a pixel RGB értékeit a koordinátái alapján).

Ha ezt regressziós problémaként kezeljük: a képzési kimeneteknek 3 értéke lesz (a normalizált r,g,b értékek minden Pixelhez). – Lehetővé teszi, hogy használja ezt a módszert most.

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

most hozzuk létre ANN:

egy teljesen csatlakoztatott feed-forward neurális hálózat (FFNN)-más néven egy többrétegű perceptron (MLP)
  • a bemeneti rétegben 2 neuronnak kell lennie (mivel 2 értéket kell bevennie: x & y koordináták).
  • a kimeneti rétegben 3 neuronnak kell lennie (mivel 3 értéket kell megtanulni: r, g, b).
  • a rejtett rétegek száma és az egyes rejtett rétegek neuronjainak száma két hiperparaméter, amelyekkel kísérletezni lehet (valamint a korszakok számát, amelyekre kiképezzük,az aktiválási funkciót stb.) — 10 rejtett réteget fogok használni, minden rejtett rétegben 100 neuronnal (ez egy mély neurális hálózat)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)

a képzett hálózat most már megjósolhatja a normalizált rgb értékeket bármely koordinátához (a rejtett rétegek száma pl. x, y = 1,1).

ann.predict(])

array(])

segítségével az ANN megjósolni az rgb értékek minden koordináta és lehetővé teszi, hogy megjelenítse a megjósolt rgb értékek a teljes képet, hogy milyen jól sikerült (minőségileg — hagyjuk értékelési mutatók egy másik bemutató)

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)
Ann festményünk (előre jelzett Pixel színek)

próbálja meg megváltoztatni a hiperparamétereket a jobb eredmények érdekében.

Ha ahelyett, hogy ezt regressziós problémaként kezelnénk, osztályozási problémaként kezeljük, akkor a képzési kimeneteknek 2 értéke lesz (a két osztályhoz tartozó pixel valószínűségei: “kék” és “szürke”)

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)

az ANN-t bináris osztályozóként újjáépíthetjük 2 neuronnal a bemeneti rétegben, 2 neuronnal a kimeneti rétegben és 100 neuronnal a rejtett rétegben (10 rejtett réteggel)

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

most már tudjuk használni a képzett Ann megjósolni az osztály, amely minden pixel tartozik (0: “szürke” vagy 1: “Kék”). 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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.