Deep Learning: un Avanzamento di Reti Neurali (FFNNs)

Una Profonda Avanzamento di Rete Neurale (FFNN) — aka Multi-layer Perceptron (MLP)

Una Rete Neurale Artificiale (ANN) è fatto di molti neuroni interconnessi:

Un singolo Neurone da una Rete Neurale Artificiale (ANN)

Ogni neurone prende in alcuni numeri in virgola mobile (ad esempio, 1.0, 0.5, -1.0) e li moltiplica per alcuni altri numeri in virgola mobile (ad esempio 0.7, 0.6, 1.4) noti come pesi (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). I pesi agiscono come un meccanismo per concentrarsi su, o ignorare, determinati input.

Pesi agire come morbido porte di ignorare alcune caratteristiche (0) e concentrarsi su altri (+1) o addirittura inibire loro (-1)

ponderato di ingressi quindi ottenere sommati insieme (ad es. 0.7 + 0.3 + -1.4 = -0.4) insieme a un valore di bias (ad esempio -0.4 + -0.1 = -0.5).

Il valore sommato (x) viene ora trasformato in un valore di output (y) in base alla funzione di attivazione del neurone (y = f(x)). Alcuni popolari funzioni di attivazione sono illustrati di seguito:

Una piccola selezione di Popolari Funzioni di Attivazione

ad esempio, -0.5 → -0.05 se usiamo la Perde Rettificato Unità Lineare (che Perde ReLU) attivazione della funzione: y = f(x) = f(-0.5) = max(0.1*-0.5, -0.5) = max(-0.05, -0.5) = -0.05

Il valore di output del neurone (ad esempio -0.05) è spesso un input per un altro neurone.

di Un Neurone di output valore spesso i feed come input per altri Neuroni della Rete Neurale Artificiale (ANN)
Il Perceptron, una delle prime Reti Neurali, è fatta di un solo Neurone

Tuttavia, uno dei primi Ann era conosciuto come il perceptron e consisteva solo di un singolo neurone.

Il Perceptron

L’output del (solo) neurone del perceptron funge da previsione finale.

Ogni Neurone è lineare classificatore binario su tutta la propria (ad esempio, un valore di output >= 0 indica il blu di classe, mentre un valore di output < 0 indica che la classe rossa)

Lascia codice nostri 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)

(Nota: non abbiamo incluso algoritmo di apprendimento nell’esempio di cui sopra — dobbiamo coprire algoritmi di apprendimento in un altro tutorial)

perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
da Notare che, regolando i valori dei pesi e di polarizzazione, è possibile regolare il neurone decisione di confine. (NB: un neurone impara aggiornando i suoi pesi e valori di bias per ridurre l’errore delle sue decisioni).

Quindi perché abbiamo bisogno di così tanti neuroni in un ANN se uno sarà sufficiente (come classificatore)?

Limitazioni: Il neurone è un classificatore binario poiché può solo imparare a distinguere tra due classi (ad esempio blu e rosso) max. Il neurone è un classificatore lineare perché il suo limite decisionale si approssima a una linea retta per i dati 2D (o un piano piatto per i dati 3D, ecc.)

Sfortunatamente, i singoli neuroni sono solo in grado di classificare i dati separabili linearmente.

Tuttavia, combinando i neuroni insieme, essenzialmente combiniamo i loro limiti decisionali. Pertanto, un ANN composto da molti neuroni è in grado di apprendere confini decisionali complessi e non lineari.

La combinazione di neuroni consente alle reti neurali di apprendere confini decisionali più complessi e non lineari

I neuroni sono collegati tra loro secondo una specifica architettura di rete. Sebbene ci siano architetture diverse, quasi tutte contengono livelli. (NB: Neuroni nello stesso livello non collegare uno con l’altro)

Reti Neurali contengono Livelli

non C’è in genere un livello di input (contenente un numero di neuroni pari al numero di funzioni di immissione dati), un livello di output (contenente un numero di neuroni pari al numero delle classi) e uno strato nascosto (contenente un qualsiasi numero di neuroni).

Deep neural networks contenere più livelli nascosti

Ci possono essere più di uno strato nascosto per permettere la rete neurale per saperne di più complesso decisione confini (Qualsiasi rete neurale con più di uno strato nascosto è considerato un profondo rete neurale).

Consente di creare un NN profondo per dipingere questa immagine:

Un esempio di immagine che il nostro ANN imparare a dipingere (sarà imparare ad associare determinati colori per alcune regioni dell’immagine)

Permette di scaricare l’immagine e carica i pixel in un 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)

insegnare ai nostri ANN a dipingere è un apprendimento supervisionato compito, quindi, abbiamo bisogno di creare un etichettati training set (la Nostra formazione dati di input e output previsto etichette per ogni ingresso). Gli input di allenamento avranno 2 valori (le coordinate x,y di ciascun pixel).

Data la semplicità dell’immagine, potremmo effettivamente affrontare questo problema in due modi. Un problema di classificazione (in cui la rete neurale predice se un pixel appartiene alla classe “blu” o alla classe “grigia”, date le sue coordinate xy) o un problema di regressione (in cui la rete neurale predice i valori RGB per un pixel date le sue coordinate).

Se si tratta di un problema di regressione: gli output di allenamento avranno 3 valori (i valori r,g,b normalizzati per ciascun pixel). – Consente di utilizzare questo metodo per ora.

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

Ora consente di creare il nostro ANN:

completamente connesso in rete neurale feed-forward (FFNN) — aka Un multi-layer perceptron (MLP)
  • Si dovrebbe avere 2 neuroni del livello di input (dato che ci sono 2 valori di prendere in: x & y coordinate).
  • Dovrebbe avere 3 neuroni nel livello di output (poiché ci sono 3 valori da imparare: r, g, b).
  • numero di livelli nascosti e il numero di neuroni in ogni livello nascosto sono due hyperparameters di sperimentare (così come il numero di epoche ci si allena per la funzione di attivazione, ecc) — io uso 10 livelli nascosti con 100 neuroni in ogni strato nascosto (rendendo questo un deep neural network)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)

La rete addestrata può oggi prevedere normalizzato i valori rgb per ogni coordinate (ad esempio x,y = 1,1).

ann.predict(])

array(])

consente di utilizzare l’ANN per predire i valori rgb per ogni coordinata e permette di visualizzare il predetto valori rgb per l’intera immagine per vedere quanto bene ha fatto (qualitativamente — partiremo metriche di valutazione per un altro 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)
il Nostro ANN Pittura (previsto pixel colori)

Provare a cambiare il hyperparameters per ottenere risultati migliori.

Se invece di trattare questo come un problema di regressione, abbiamo trattare questo come un problema di classificazione, quindi la formazione uscite di 2 valori (la probabilità di pixel appartenenti ad ognuna delle due classi: “blu” e “grigie”)

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)

Siamo in grado di ricostruire il nostro ANN come un classificatore binario con 2 neuroni del livello di input, 2 neuroni nello strato di output e 100 neuroni in strato nascosto (con 10 livelli nascosti)

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

E ‘ ora possibile utilizzare i formati ANN per predire la classe che ogni pixel appartiene (0: “grigio” o 1: “blu”). 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.