Tutorial zu künstlichen neuronalen Netzen mit TensorFlow ANN-Beispielen
Was ist ein künstliches neuronales Netzwerk?
An Künstliche neuronale Netz (ANN) ist ein von biologischen neuronalen Netzen inspiriertes Computersystem zur Schaffung künstlicher Gehirne auf der Grundlage der Ansammlung miteinander verbundener Einheiten, die als künstliche Neuronen bezeichnet werden. Es ist darauf ausgelegt, Informationen als Mensch zu analysieren und zu verarbeiten. Künstliche neuronale Netze verfügen über Selbstlernfähigkeiten, um bessere Ergebnisse zu erzielen, wenn mehr Daten verfügbar sind.

Ein künstliches neuronales Netzwerk (KNN) besteht aus vier Hauptobjekten:
- Schichten: Das gesamte Lernen findet in den Schichten statt. Es gibt 3 Ebenen: 1) Eingabe, 2) Versteckt und 3) Ausgabe
- Merkmal und Beschriftung: Eingabedaten in das Netzwerk (Features) und Ausgabe aus dem Netzwerk (Labels)
- Verlustfunktion: Metrik zur Schätzung der Leistung der Lernphase
- Optimierer: Verbessern Sie das Lernen, indem Sie das Wissen im Netzwerk aktualisieren
Ein neuronales Netzwerk nimmt die Eingabedaten auf und überträgt sie in ein Ensemble von Schichten. Das Netzwerk muss seine Leistung mit einer Verlustfunktion bewerten. Die Verlustfunktion gibt dem Netzwerk eine Vorstellung davon, welchen Weg es einschlagen muss, bevor es das Wissen beherrscht. Das Netzwerk muss sein Wissen mithilfe eines Optimierers verbessern.
Wenn Sie sich die Abbildung oben ansehen, werden Sie den zugrunde liegenden Mechanismus verstehen.
Das Programm nimmt einige Eingabewerte und verschiebt sie in zwei vollständig verbundene Schichten. Stellen Sie sich vor, Sie haben ein mathematisches Problem. Als Erstes lesen Sie das entsprechende Kapitel, um das Problem zu lösen. Sie wenden Ihr neues Wissen an, um das Problem zu lösen. Es besteht eine hohe Wahrscheinlichkeit, dass Sie nicht sehr gut abschneiden. Dasselbe gilt auch für ein Netzwerk. Wenn es die Daten zum ersten Mal sieht und eine Vorhersage trifft, werden diese nicht perfekt mit den tatsächlichen Daten übereinstimmen.
Um sein Wissen zu verbessern, nutzt das Netzwerk einen Optimierer. In unserer Analogie kann man sich einen Optimierer so vorstellen, dass er das Kapitel noch einmal liest. Durch erneutes Lesen gewinnen Sie neue Erkenntnisse/Lektionen. Ebenso nutzt das Netzwerk den Optimierer, aktualisiert sein Wissen und testet sein neues Wissen, um zu prüfen, wie viel es noch lernen muss. Das Programm wiederholt diesen Schritt, bis der Fehler so gering wie möglich ist.
In unserer Analogie zu einem Matheproblem bedeutet dies, dass Sie das Lehrbuchkapitel viele Male lesen, bis Sie den Kursinhalt vollständig verstanden haben. Wenn Sie auch nach mehrmaligem Lesen immer noch Fehler machen, bedeutet dies, dass Sie mit dem aktuellen Material die Wissenskapazität erreicht haben. Sie müssen ein anderes Lehrbuch verwenden oder eine andere Methode testen, um Ihre Punktzahl zu verbessern. Bei einem neuronalen Netzwerk ist es derselbe Prozess. Wenn der Fehler weit von 100 % entfernt ist, die Kurve jedoch flach ist, bedeutet dies, dass es mit der aktuellen Architektur nichts anderes lernen kann. Das Netzwerk muss besser optimiert werden, um das Wissen zu verbessern.
Neurales Netzwerk Architektur
Das künstliche neuronale Netzwerk ArchiDie Struktur besteht aus folgenden Komponenten:
- Schichten
- Aktivierungsfunktion
- Verlustfunktion
- Optimierer
Schichten
Auf einer Ebene findet das gesamte Lernen statt. Innerhalb einer Schicht gibt es unendlich viele Gewichte (Neuronen). Ein typisches neuronales Netzwerk wird häufig von dicht verbundenen Schichten (auch vollständig verbundene Schichten genannt) verarbeitet. Das bedeutet, dass alle Eingänge mit dem Ausgang verbunden sind.
Ein typisches neuronales Netzwerk benötigt einen Eingabevektor und einen Skalar, der die Beschriftungen enthält. Der komfortabelste Aufbau ist eine binäre Klassifizierung mit nur zwei Klassen: 0 und 1.
Das Netzwerk nimmt eine Eingabe entgegen, sendet sie an alle angeschlossenen Knoten und berechnet das Signal mit einem Aktivierung Funktion.

Die obige Abbildung zeigt diese Idee. Die erste Schicht enthält die Eingabewerte, während die zweite Schicht, die sogenannte verborgene Schicht, die gewichteten Eingaben von der vorherigen Schicht empfängt
- Der erste Knoten sind die Eingabewerte
- Das Neuron wird in den Eingabeteil und die Aktivierungsfunktion zerlegt. Der linke Teil empfängt alle Eingaben der vorherigen Ebene. Der rechte Teil ist die Summe der Eingabedurchgänge in eine Aktivierungsfunktion.
- Ausgabewert, der aus den verborgenen Schichten berechnet und zur Erstellung einer Vorhersage verwendet wird. Für die Klassifizierung entspricht sie der Anzahl der Klassen. Für die Regression wird nur ein Wert vorhergesagt.
Aktivierungsfunktion
Die Aktivierungsfunktion eines Knotens definiert die Ausgabe bei einer Reihe von Eingaben. Sie benötigen eine Aktivierungsfunktion, damit das Netzwerk nichtlineare Muster lernen kann. Eine übliche Aktivierungsfunktion ist a Relu, gleichgerichtete Lineareinheit. Die Funktion gibt für alle negativen Werte eine Null aus.
Die anderen Aktivierungsfunktionen sind:
- Stückweise linear
- Sigma
- Tanh
- Leaky Relu
Die entscheidende Entscheidung beim Aufbau eines neuronalen Netzwerks ist:
- Wie viele Schichten im neuronalen Netzwerk
- Wie viele versteckte Einheiten für jede Ebene
Ein neuronales Netzwerk mit vielen Schichten und versteckten Einheiten kann eine komplexe Darstellung der Daten erlernen, aber die Berechnung des Netzwerks wird dadurch sehr aufwändig.
Verlustfunktion
Nachdem Sie die verborgenen Schichten und die Aktivierungsfunktion definiert haben, müssen Sie die Verlustfunktion und den Optimierer angeben.
Für die binäre Klassifizierung ist es üblich, eine binäre Kreuzentropieverlustfunktion zu verwenden. Bei der linearen Regression verwenden Sie den mittleren quadratischen Fehler.
Die Verlustfunktion ist eine wichtige Metrik zur Schätzung der Leistung des Optimierers. Während des Trainings wird diese Metrik minimiert. Sie müssen diese Menge je nach Art des Problems, mit dem Sie es zu tun haben, sorgfältig auswählen.
Optimierer
Die Verlustfunktion ist ein Maß für die Leistung des Modells. Der Optimierer hilft dabei, die Gewichte des Netzwerks zu verbessern, um den Verlust zu verringern. Es stehen verschiedene Optimierer zur Verfügung, der gebräuchlichste ist jedoch der Stochastic Gradient Descent.
Die herkömmlichen Optimierer sind:
- Momentum Optimierung,
- Nesterov beschleunigter Gradient,
- AdaGrad,
- Adam-Optimierung
Einschränkungen des neuronalen Netzwerks
Im Folgenden sind die Einschränkungen des neuronalen Netzwerks aufgeführt:
Überanpassung
Ein häufiges Problem bei komplexen neuronalen Netzen sind die Schwierigkeiten bei der Verallgemeinerung unbekannter Daten. Ein neuronales Netz mit vielen Gewichten kann bestimmte Details im Trainingssatz sehr gut identifizieren, führt aber häufig zu Überanpassung. Wenn die Daten innerhalb von Gruppen unausgewogen sind (d. h. in einigen Gruppen nicht genügend Daten verfügbar sind), lernt das Netz während des Trainings sehr gut, ist jedoch nicht in der Lage, ein solches Muster auf noch nie zuvor gesehene Daten zu verallgemeinern.
Beim maschinellen Lernen gibt es einen Kompromiss zwischen Optimierung und Generalisierung.
Um ein Modell zu optimieren, müssen die besten Parameter gefunden werden, die den Verlust des Trainingssatzes minimieren.
Die Generalisierung gibt jedoch Aufschluss darüber, wie sich das Modell bei unsichtbaren Daten verhält.
Um zu verhindern, dass das Modell bestimmte Details oder unerwünschte Muster der Trainingsdaten erfasst, können Sie verschiedene Techniken verwenden. Die beste Methode ist ein ausgewogener Datensatz mit ausreichend Datenmenge. Die Kunst, Überanpassung zu reduzieren, heißt Regulierung. Sehen wir uns einige herkömmliche Techniken an.
Netzwerkgröße
Ein neuronales Netzwerk mit zu vielen Schichten und versteckten Einheiten gilt als hochkomplex. Eine einfache Möglichkeit, die Komplexität des Modells zu reduzieren, besteht darin, seine Größe zu reduzieren. Es gibt keine bewährte Methode, um die Anzahl der Schichten zu definieren. Sie müssen mit einer kleinen Anzahl von Schichten beginnen und deren Größe erhöhen, bis Sie feststellen, dass das Modell überangepasst ist.
Gewichtsregulierung
Eine Standardtechnik zur Verhinderung einer Überanpassung besteht darin, den Gewichten des Netzwerks Einschränkungen hinzuzufügen. Die Einschränkung zwingt die Größe des Netzwerks dazu, nur kleine Werte anzunehmen. Die Einschränkung wird zur Verlustfunktion des Fehlers hinzugefügt. Es gibt zwei Arten der Regularisierung:
L1: Lasso: Die Kosten sind proportional zum Absolutwert der Gewichtskoeffizienten
L2: Ridge: Die Kosten sind proportional zum Quadrat des Werts der Gewichtungskoeffizienten
Aussteiger
Dropout ist eine seltsame, aber nützliche Technik. Ein Netzwerk mit Dropout bedeutet, dass einige Gewichte zufällig auf Null gesetzt werden. Stellen Sie sich vor, Sie haben ein Array von Gewichten [0.1, 1.7, 0.7, -0.9]. Wenn das neuronale Netzwerk einen Dropout aufweist, wird er zu [0.1, 0, 0, -0.9] mit einer zufälligen Verteilung von 0. Der Parameter, der den Dropout steuert, ist die Dropout-Rate. Die Rate definiert, wie viele Gewichtungen auf Null gesetzt werden. Eine Rate zwischen 0.2 und 0.5 ist üblich.
Beispiel eines neuronalen Netzwerks in TensorFlow
Sehen wir uns ein Beispiel eines künstlichen neuronalen Netzwerks in Aktion an, um zu zeigen, wie ein neuronales Netzwerk bei einem typischen Klassifizierungsproblem funktioniert. Es gibt zwei Eingaben, x1 und x2 mit einem zufälligen Wert. Die Ausgabe ist eine binäre Klasse. Das Ziel besteht darin, das Etikett basierend auf den beiden Merkmalen zu klassifizieren. Um diese Aufgabe auszuführen, wird die Architektur des neuronalen Netzwerks wie folgt definiert:
- Zwei versteckte Schichten
- Die erste Schicht besteht aus vier vollständig verbundenen Neuronen
- Die zweite Schicht besteht aus zwei vollständig verbundenen Neuronen
- Die Aktivierungsfunktion ist ein Relu
- Fügen Sie eine L2-Regularisierung mit einer Lernrate von 0.003 hinzu
Das Netzwerk optimiert die Gewichtung über 180 Epochen mit einer Stapelgröße von 10. Im folgenden ANN-Beispielvideo können Sie sehen, wie sich die Gewichte entwickeln und wie das Netzwerk die Klassifizierungszuordnung verbessert.
Zunächst weist das Netzwerk allen Gewichten Zufallswerte zu.
- Mit den Zufallsgewichten, also ohne Optimierung, beträgt der Ausgabeverlust 0.453. Das Bild unten stellt das Netzwerk in verschiedenen Farben dar.
- Im Allgemeinen stellt die orange Farbe negative Werte dar, während die blauen Farben positive Werte anzeigen.
- Die Datenpunkte haben die gleiche Darstellung; Die blauen sind die positiven Etiketten und die orangefarbenen die negativen Etiketten.
Innerhalb der zweiten verborgenen Schicht werden die Linien entsprechend dem Vorzeichen der Gewichte gefärbt. Die orangefarbenen Linien weisen negative Gewichte zu und die blauen positive Gewichte
Wie Sie sehen, macht das Netzwerk bei der Ausgabezuordnung ziemlich viele Fehler. Sehen wir uns an, wie sich das Netzwerk nach der Optimierung verhält.
Das Bild des ANN-Beispiels unten zeigt die Ergebnisse des optimierten Netzwerks. Zunächst fällt auf, dass das Netzwerk erfolgreich gelernt hat, den Datenpunkt zu klassifizieren. Sie können es auf dem Bild vorher sehen; Die anfängliche Gewichtung betrug -0.43, während nach der Optimierung eine Gewichtung von -0.95 resultiert.
Die Idee kann für Netzwerke mit mehr verborgenen Schichten und Neuronen verallgemeinert werden. Sie können darin herumspielen Link.
So trainieren Sie ein neuronales Netzwerk mit TensorFlow
Hier ist der schrittweise Prozess zum Trainieren eines neuronalen Netzwerks mit TensorFlow ANN mithilfe des API-Schätzers DNNClassifier.
Wir werden den MNIST-Datensatz verwenden, um Ihr erstes neuronales Netzwerk zu trainieren. Training eines neuronalen Netzwerks mit TensorFlow ist nicht sehr kompliziert. Der Vorverarbeitungsschritt sieht genauso aus wie in den vorherigen Tutorials. Sie gehen wie folgt vor:
- Schritt 1: Importieren Sie die Daten
- Schritt 2: Transformieren Sie die Daten
- Schritt 3: Konstruieren Sie den Tensor
- Schritt 4: Erstellen Sie das Modell
- Schritt 5: Trainieren und bewerten Sie das Modell
- Schritt 6: Verbessern Sie das Modell
Schritt 1) Importieren Sie die Daten
Zunächst müssen Sie die erforderliche Bibliothek importieren. Sie können den MNIST-Datensatz mit scikit learn importieren, wie im Beispiel des TensorFlow Neural Network unten gezeigt.
Der MNIST-Datensatz ist der häufig verwendete Datensatz zum Testen neuer Techniken oder Algorithmen. Dieser Datensatz ist eine Sammlung von 28 x 28 Pixel großen Bildern mit einer handgeschriebenen Ziffer von 0 bis 9. Derzeit beträgt der niedrigste Fehler beim Test 0.27 Prozent mit einem Komitee aus 7 Convolutional Neural Networks.
import numpy as np import tensorflow as tf np.random.seed(1337)
Unter dieser Adresse können Sie scikit learn vorübergehend herunterladen. Kopieren Sie den Datensatz und fügen Sie ihn in einen geeigneten Ordner ein. Um die Daten in Python zu importieren, können Sie fetch_mldata von scikit learn verwenden. Fügen Sie den Dateipfad in fetch_mldata ein, um die Daten abzurufen.
from sklearn.datasets import fetch_mldata mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original') print(mnist.data.shape) print(mnist.target.shape)
Anschließend importieren Sie die Daten und erhalten die Form beider Datensätze.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Schritt 2) Transformieren Sie die Daten
Im vorherigen Tutorial haben Sie gelernt, dass Sie die Daten transformieren müssen, um die Auswirkung von Ausreißern zu begrenzen. In diesem Tutorial zu neuronalen Netzen transformieren Sie die Daten mithilfe des Min-Max-Skalierers. Die Formel lautet:
(X-min_x)/(max_x - min_x)
Scikit erfährt, dass es dafür bereits eine Funktion gibt: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Schritt 3) Konstruieren Sie den Tensor
Sie sind jetzt mit der Methode zum Erstellen eines Tensors in Tensorflow vertraut. Sie können den Zugsatz in eine numerische Spalte konvertieren.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Schritt 4) Erstellen Sie das Modell
Die Architektur des neuronalen Netzwerks enthält zwei versteckte Schichten mit 2 Einheiten für die erste Schicht und 300 Einheiten für die zweite. Wir verwenden diese Werte auf Grundlage unserer eigenen Erfahrung. Sie können diese Werte anpassen und sehen, wie sich dies auf die Genauigkeit des Netzwerks auswirkt.
Zum Erstellen des Modells verwenden Sie den Schätzer DNNClassifier. Sie können die Anzahl der Ebenen zu den feature_columns-Argumenten hinzufügen. Sie müssen die Anzahl der Klassen auf 10 festlegen, da der Trainingssatz zehn Klassen enthält. Sie sind bereits mit der Syntax des Schätzerobjekts vertraut. Die Argumente Features Columns, Number of Classes und model_dir sind genau die gleichen wie im vorherigen Tutorial. Das neue Argument „hidden_unit“ steuert die Anzahl der Schichten und die Anzahl der Knoten, die mit dem neuronalen Netzwerk verbunden werden sollen. Im folgenden Code gibt es zwei verborgene Ebenen, wobei eine erste 300 Knoten verbindet und die zweite 100 Knoten.
Um den Schätzer zu erstellen, verwenden Sie tf.estimator.DNNClassifier mit den folgenden Parametern:
- feature_columns: Definieren Sie die im Netzwerk zu verwendenden Spalten
- versteckte_Einheiten: Definieren Sie die Anzahl der versteckten Neuronen
- n_classes: Definieren Sie die Anzahl der vorherzusagenden Klassen
- model_dir: Definieren Sie den Pfad von TensorBoard
estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')
Schritt 5) Trainieren und bewerten Sie das Modell
Sie können die Numpy-Methode verwenden, um das Modell zu trainieren und auszuwerten
# Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=50, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=1000) eval_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, shuffle=False, batch_size=X_test_scaled.shape[0], num_epochs=1) estimator.evaluate(eval_input,steps=None)
Ausgang:
{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}
Die aktuelle Architektur führt zu einer Genauigkeit im Auswertungssatz von 96 Prozent.
Schritt 6) Verbessern Sie das Modell
Sie können versuchen, das Modell zu verbessern, indem Sie Regularisierungsparameter hinzufügen.
Wir verwenden einen Adam-Optimierer mit einer Dropout-Rate von 0.3, L1 von X und L2 von y. Im TensorFlow Neural Network können Sie den Optimierer mit dem Objekt „train“ steuern, gefolgt vom Namen des Optimierers. TensorFlow ist eine integrierte API für den Proximal AdaGrad-Optimierer.
Um dem tiefen neuronalen Netzwerk eine Regularisierung hinzuzufügen, können Sie tf.train.ProximalAdagradOptimizer mit dem folgenden Parameter verwenden
- Lernrate: learning_rate
- L1-Regularisierung: l1_regularization_strength
- L2-Regularisierung: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], dropout=0.3, n_classes = 10, optimizer=tf.train.ProximalAdagradOptimizer( learning_rate=0.01, l1_regularization_strength=0.01, l2_regularization_strength=0.01 ), model_dir = '/train/DNN1') estimator_imp.train(input_fn = train_input,steps=1000) estimator_imp.evaluate(eval_input,steps=None)
Ausgang:
{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}
Die zur Reduzierung der Überanpassung gewählten Werte verbesserten die Modellgenauigkeit nicht. Ihr erstes Modell hatte eine Genauigkeit von 96 %, während das Modell mit L2-Regularisierer eine Genauigkeit von 95 % hat. Sie können es mit verschiedenen Werten versuchen und sehen, wie sich dies auf die Genauigkeit auswirkt.
Zusammenfassung
In diesem Tutorial erfahren Sie, wie Sie ein neuronales Netzwerk aufbauen. Ein neuronales Netzwerk erfordert:
- Anzahl der ausgeblendeten Ebenen
- Anzahl der vollständig verbundenen Knoten
- Aktivierungsfunktion
- Optimierer
- Anzahl der Klassen
In TensorFlow ANN können Sie ein neuronales Netzwerk für Klassifizierungsprobleme trainieren mit:
- tf.estimator.DNNClassifier
Der Schätzer muss Folgendes angeben:
- feature_columns=feature_columns,
- versteckte_Einheiten=[300, 100]
- n_classes=10
- Modellverzeichnis
Sie können das Modell verbessern, indem Sie verschiedene Optimierer verwenden. In diesem Tutorial haben Sie gelernt, wie Sie den Adam Grad-Optimierer mit einer Lernrate verwenden und eine Steuerung hinzufügen, um eine Überanpassung zu verhindern.