Tiefes Lernen: Feed Forward Neural Networks (FFNNs)

Ein neuronales Deep—Feed-Forward-Netzwerk (FFNN) – auch bekannt als Mehrschichtiges Perzeptron (MLP)

Ein künstliches neuronales Netzwerk (ANN) besteht aus vielen miteinander verbundenen Neuronen:

Ein einzelnes Neuron aus einem künstlichen neuronalen Netzwerk (ANN)

Jedes Neuron nimmt einige Gleitkommazahlen (z. B. 1,0, 0,5, -1.0) und multipliziert sie mit einigen anderen Gleitkommazahlen (z. B. 0,7, 0,6, 1,4), die als Gewichte bezeichnet werden (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). Die Gewichte fungieren als Mechanismus, um bestimmte Eingaben zu fokussieren oder zu ignorieren.

Gewichte fungieren als weiche Tore, um einige Funktionen (0) zu ignorieren und sich auf andere zu konzentrieren (+1) oder sie sogar zu hemmen (-1 )

Die gewichteten Eingaben werden dann summiert (z. 0.7 + 0.3 + -1.4 = -0.4) zusammen mit einem Bias-Wert (z.B. -0,4 + -0,1 = -0,5).

Der summierte Wert (x) wird nun entsprechend der Aktivierungsfunktion des Neurons (y = f(x)) in einen Ausgangswert (y) transformiert. Einige beliebte aktivierung funktionen sind unten dargestellt:

EINE kleine auswahl von Beliebte Aktivierung Funktionen

zB-0,5 →-0,05 wenn wir verwenden die Undichte Behoben Lineareinheit (Undichte ReLU) aktivierung funktion: y = f (x) = f (-0,5) = max (0,1 *-0,5,-0,5) = max (-0,05,-0,5) =-0.05

Der Ausgangswert des Neurons (z. B. -0,05) ist oft ein Eingang für ein anderes Neuron.

Der Ausgangswert eines Neurons wird häufig als Eingabe an andere Neuronen im Künstlichen Neuronalen Netzwerk (ANN)
Das Perzeptron, eines der ersten neuronalen Netze, besteht aus nur einem einzigen Neuron

Eines der ersten ANNs war jedoch als Perzeptron bekannt und bestand nur aus einem einzigen Neuron.

Das Perzeptron

Die Ausgabe des (einzigen) Neurons des Perzeptrons dient als endgültige Vorhersage.

Jedes Neuron ist ein linearer binärer Klassifikator für sich (z. B. ein Ausgabewert >= 0 gibt die blaue Klasse an, während ein Ausgabewert < 0 zeigt die rote Klasse an)

Wir kodieren unser eigenes Perzeptron:

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)

(Hinweis: Wir haben keinen Lernalgorithmus in unser obiges Beispiel aufgenommen — wir werden Lernalgorithmen in einem anderen Tutorial behandeln)

perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
Beachten Sie, dass Sie durch Anpassen der Werte für Gewichte und Bias die Entscheidungsgrenze des Neurons anpassen können. (Anmerkung: Ein Neuron lernt, indem es seine Gewichte und Verzerrungswerte aktualisiert, um den Fehler seiner Entscheidungen zu reduzieren).

Warum brauchen wir also so viele Neuronen in einem ANN, wenn eines ausreicht (als Klassifikator)?

Einschränkungen: Das Neuron ist ein binärer Klassifikator, da es nur lernen kann, zwischen zwei Klassen zu unterscheiden (z. B. blau und rot) max. Das Neuron ist ein linearer Klassifikator, da seine Entscheidungsgrenze einer geraden Linie für 2D-Daten (oder einer flachen Ebene für 3D-Daten usw.) entspricht.

Leider können einzelne Neuronen nur linear trennbare Daten klassifizieren.

Durch die Kombination von Neuronen kombinieren wir jedoch im Wesentlichen ihre Entscheidungsgrenzen. Daher ist ein aus vielen Neuronen zusammengesetztes ANN in der Lage, komplexe, nichtlineare Entscheidungsgrenzen zu lernen.

Durch die Kombination von Neuronen können neuronale Netze komplexere, nichtlineare Entscheidungsgrenzen erlernen

Neuronen sind gemäß einer bestimmten Netzwerkarchitektur miteinander verbunden. Obwohl es verschiedene Architekturen gibt, enthalten fast alle Schichten. (NB: Neuronen in der gleichen Schicht verbinden sich nicht miteinander)

Neuronale Netze enthalten Schichten

Es gibt typischerweise eine Eingangsschicht (die eine Anzahl von Neuronen enthält, die der Anzahl von Eingabemerkmalen in der die Daten), eine Ausgabeschicht (die eine Anzahl von Neuronen enthält, die der Anzahl der Klassen entspricht) und eine verborgene Schicht (die eine beliebige Anzahl von Neuronen enthält).

Tiefe neuronale Netze enthalten mehrere versteckte Schichten

Es kann mehr als eine versteckte Schicht geben, damit das neuronale Netz komplexere Entscheidungsgrenzen lernen kann (Jedes neuronale Netz mit mehr als einer versteckten Schicht ist als ein tiefes neuronales Netz betrachtet).

Lass uns ein tiefes NN bauen, um dieses Bild zu malen:

Ein Beispielbild, das unser KIND malen lernen wird (Es wird lernen, bestimmte Farben bestimmten Bereichen des Bildes zuzuordnen)

Laden Sie das Bild herunter und laden Sie seine Pixel in ein 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)

Jetzt ist es eine überwachte Lernaufgabe, unseren Kindern das Malen beizubringen, daher müssen wir einen beschrifteten Trainingssatz erstellen (Unsere Trainingsdaten haben Eingaben und erwartete Ausgabebezeichnungen für jede Eingabe). Die Trainingseingaben haben 2 Werte (die x-, y-Koordinaten jedes Pixels).

Angesichts der Einfachheit des Bildes könnten wir dieses Problem auf zwei Arten angehen. Ein Klassifizierungsproblem (bei dem das neuronale Netz anhand seiner xy-Koordinaten vorhersagt, ob ein Pixel zur „blauen“ oder zur „grauen“ Klasse gehört) oder ein Regressionsproblem (bei dem das neuronale Netz RGB-Werte für ein Pixel anhand seiner Koordinaten vorhersagt).

Wenn Sie dies als Regressionsproblem behandeln: Die Trainingsausgaben haben 3 Werte (die normalisierten r-, g-, b-Werte für jedes Pixel). – Verwenden wir diese Methode vorerst.

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

Jetzt können wir unsere ANN erstellen:

Ein vollständig verbundenes Feed-Forward-neuronales Netzwerk (FFNN) — auch bekannt als mehrschichtiges Perzeptron (MLP)
  • Es sollte 2 Neuronen in der Eingabeschicht haben (da 2 Werte zu berücksichtigen sind: x & y-Koordinaten).
  • Es sollte 3 Neuronen in der Ausgabeschicht haben (da es 3 Werte zu lernen gibt: r, g, b).
  • Die Anzahl der versteckten Schichten und die Anzahl der Neuronen in jeder versteckten Schicht sind zwei Hyperparameter, mit denen man experimentieren kann (sowie die Anzahl der Epochen, für die wir es trainieren werden, die Aktivierungsfunktion usw.) — ich werde 10 versteckte Schichten mit 100 Neuronen in jeder versteckten Schicht verwenden (was dies zu einem tiefen neuronalen Netzwerk macht)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)

Das trainierte Netzwerk kann jetzt die normalisierten RGB-Werte für z. B. x, y = 1,1).

ann.predict(])

array(])

Mit dem ANN können Sie die RGB—Werte für jede Koordinate vorhersagen und die vorhergesagten RGB-Werte für das gesamte Bild anzeigen, um zu sehen, wie gut es funktioniert hat (qualitativ – wir werden Bewertungsmetriken für ein anderes Tutorial belassen)

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)
Das Gemälde unserer ANN (vorhergesagte Pixelfarben)

Versuchen Sie, die Hyperparameter zu ändern, um bessere Ergebnisse zu erzielen.

Wenn wir dies nicht als Regressionsproblem behandeln, sondern als Klassifizierungsproblem, haben die Trainingsausgaben 2 Werte (die Wahrscheinlichkeiten des Pixels, das zu jeder der beiden Klassen gehört: „blau“ und „grau“)

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)

Wir können unser ANN als binären Klassifikator mit 2 Neuronen in der Eingabeschicht, 2 Neuronen in der Ausgabeschicht und 100 Neuronen in der versteckten Schicht (mit 10 versteckten Schichten)

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

Wir können jetzt die trainierte KLASSE verwenden, um die Klasse vorherzusagen, zu der jedes Pixel gehört (0: „grau“ oder 1: „blau“). 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.