Verhindern Sie eine Überanpassung und steigern Sie die Genauigkeit Ihres maschinellen Lernmodells, indem Sie die Datenerweiterungsmethoden von TensorFlow implementieren.
Datenerweiterung ist der Prozess der Anwendung verschiedener Transformationen auf die Trainingsdaten. Es trägt dazu bei, die Vielfalt des Datensatzes zu erhöhen und eine Überanpassung zu verhindern. Eine Überanpassung tritt meistens auf, wenn Sie nur begrenzte Daten zum Trainieren Ihres Modells haben.
Hier erfahren Sie, wie Sie das Datenerweiterungsmodul von TensorFlow verwenden, um Ihren Datensatz zu diversifizieren. Dadurch wird eine Überanpassung verhindert, indem neue Datenpunkte generiert werden, die sich geringfügig von den ursprünglichen Daten unterscheiden.
Der Beispieldatensatz, den Sie verwenden werden
Sie verwenden das Katzen- und Hunde-Dataset von Kaggle. Dieser Datensatz enthält ungefähr 3.000 Bilder von Katzen und Hunden. Diese Bilder werden in Trainings-, Test- und Validierungssätze aufgeteilt.
Das Label 1.0 steht für einen Hund, während das Label 0.0 für eine Katze steht.
Der vollständige Quellcode, der Datenerweiterungstechniken implementiert, und der, der dies nicht tut, sind in a verfügbar GitHub-Repository.
Installieren und Importieren von TensorFlow
Um durchzukommen, sollten Sie a Grundverständnis von Python. Außerdem sollten Sie über Grundkenntnisse im maschinellen Lernen verfügen. Wenn Sie eine Auffrischung benötigen, sollten Sie einige befolgen Tutorials zum maschinellen Lernen.
Offen Google Colab. Ändern Sie den Laufzeittyp in GPU. Führen Sie dann den folgenden magischen Befehl in der ersten Codezelle aus, um TensorFlow in Ihrer Umgebung zu installieren.
!pip installiere Tensorflow
Importieren Sie TensorFlow und seine relevanten Module und Klassen.
importieren Tensorfluss als tf
aus tensorflow.keras.preprocessing.image importieren Bilddatengenerator
aus tensorflow.keras.models importieren Sequentiell
aus tensorflow.keras.layers importieren Conv2D, MaxPooling2D, Flatten, Dense, Dropout
Der tensorflow.keras.preprocessing.image ermöglicht es Ihnen, eine Datenerweiterung an Ihrem Datensatz durchzuführen.
Erstellen von Instanzen der ImageDataGenerator-Klasse
Erstellen Sie eine Instanz der Bilddatengenerator Klasse für die Zugdaten. Sie verwenden dieses Objekt zur Vorverarbeitung der Trainingsdaten. Es wird während des Modelltrainings in Echtzeit Stapel von erweiterten Bilddaten generieren.
Bei der Aufgabe zu klassifizieren, ob ein Bild eine Katze oder ein Hund ist, können Sie die Techniken Spiegeln, Zufallsbreite, Zufallshöhe, Zufallshelligkeit und Zoomen verwenden. Diese Techniken werden neue Daten generieren, die Variationen der ursprünglichen Daten enthalten, die reale Szenarien darstellen.
# den Bilddatengenerator für das Training definieren
train_datagen = Bilddatengenerator (rescale=1./255,
horizontal_flip=WAHR,
width_shift_range=0.2,
height_shift_range=0.2,
Helligkeitsbereich=[0.2,1.0],
zoom_range=0.2)
Erstellen Sie eine weitere Instanz der Bilddatengenerator Klasse für die Testdaten. Sie benötigen die neu skalieren Parameter. Die Pixelwerte der Testbilder werden so normalisiert, dass sie dem während des Trainings verwendeten Format entsprechen.
# den Bilddatengenerator zum Testen definieren
test_datagen = Bilddatengenerator (rescale=1./255)
Erstellen Sie eine letzte Instanz der Bilddatengenerator Klasse für die Validierungsdaten. Skalieren Sie die Validierungsdaten auf die gleiche Weise wie die Testdaten.
# den Bilddatengenerator für die Validierung definieren
validation_datagen = Bilddatengenerator (rescale=1./255)
Sie müssen die anderen Erweiterungstechniken nicht auf die Test- und Validierungsdaten anwenden. Dies liegt daran, dass das Modell die Test- und Validierungsdaten nur zu Bewertungszwecken verwendet. Sie sollten die ursprüngliche Datenverteilung widerspiegeln.
Laden Ihrer Daten
Ein... kreieren DirectoryIterator Objekt aus dem Schulungsverzeichnis. Es werden Stapel von erweiterten Bildern generiert. Geben Sie dann das Verzeichnis an, in dem die Trainingsdaten gespeichert sind. Ändern Sie die Größe der Bilder auf eine feste Größe von 64x64 Pixel. Geben Sie die Anzahl der Bilder an, die jeder Stapel verwenden soll. Geben Sie zuletzt die Art des Etiketts an binär (d. h. Katze oder Hund).
# Definition des Trainingsverzeichnisses
train_data = train_datagen.flow_from_directory (Verzeichnis=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
Zielgröße=(64, 64),
batch_size=32,
class_mode='binär')
Ein anderes erstellen DirectoryIterator Objekt aus dem Testing-Verzeichnis. Stellen Sie die Parameter auf die gleichen Werte wie die der Trainingsdaten ein.
# Definieren des Testverzeichnisses
test_data = test_datagen.flow_from_directory (Verzeichnis='/content/drive/MyDrive/cats_and_dogs_filtered/test',
Zielgröße=(64, 64),
batch_size=32,
class_mode='binär')
Erstellen Sie ein Finale DirectoryIterator Objekt aus dem Validierungsverzeichnis. Die Parameter bleiben dieselben wie die der Trainings- und Testdaten.
# Definition des Validierungsverzeichnisses
validation_data = validation_datagen.flow_from_directory (Verzeichnis='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
Zielgröße=(64, 64),
batch_size=32,
class_mode='binär')
Die Verzeichnis-Iteratoren erweitern die Validierungs- und Testdatensätze nicht.
Definieren Ihres Modells
Definieren Sie die Architektur Ihres neuronalen Netzwerks. Benutze einen Faltungsneuronales Netzwerk (CNN). CNNs wurden entwickelt, um Muster und Merkmale in Bildern zu erkennen.
Modell = Sequentiell ()
# Faltungsschicht mit 32 Filtern der Größe 3x3
model.add (Conv2D(32, (3, 3), Aktivierung='relu', input_shape=(64, 64, 3)))# max Pooling-Layer mit Poolgröße 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))# Faltungsschicht mit 64 Filtern der Größe 3x3
model.add (Conv2D(64, (3, 3), Aktivierung='relu'))# max Pooling-Layer mit Poolgröße 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))# Die Ausgabe der Faltungs- und Pooling-Schichten glätten
model.add (Flatten())# vollständig verbundener Layer mit 128 Einheiten und ReLU-Aktivierung
model.add (dicht (128, Aktivierung='relu'))# 50 % der Einheiten nach dem Zufallsprinzip auslassen, um eine Überanpassung zu verhindern
model.add (Ausfall(0.5))
# Ausgabeschicht mit Sigmoid-Aktivierung (binäre Klassifizierung)
model.add (dicht (1, Aktivierung='Sigmoid'))
Kompilieren Sie das Modell mithilfe der Binärdatei Kreuzentropie verlustfunktion. Bei binären Klassifizierungsproblemen wird It häufig verwendet. Verwenden Sie für den Optimierer die Adam-Optimierer. Es ist ein adaptiver Lernratenoptimierungsalgorithmus. Bewerten Sie abschließend das Modell hinsichtlich der Genauigkeit.
model.compile (verlust='binary_crossentropy', Optimierer='Adam', Metriken=['Genauigkeit'])
Drucken Sie eine Zusammenfassung der Architektur des Modells auf der Konsole.
model.summary()
Der folgende Screenshot zeigt die Visualisierung der Modellarchitektur.
So erhalten Sie einen Überblick, wie Ihr Modelldesign aussieht.
Trainieren Sie Ihr Modell
Trainieren Sie das Modell mit der fit() Methode. Stellen Sie die Anzahl der Schritte pro Epoche auf die Anzahl der Trainingsgebiete geteilt durch die ein Batch_Größe. Legen Sie außerdem die Validierungsdaten und die Anzahl der Validierungsschritte fest.
# Modell mit den Trainingsdaten trainieren
history = model.fit (train_data,
steps_per_epoch=train_data.n // train_data.batch_size,
Epochen =50,
validierungsdaten=validierungsdaten,
validation_steps=validation_data.n // validation_data.batch_size)
Der Bilddatengenerator class wendet die Datenaugmentation in Echtzeit auf die Trainingsdaten an. Dadurch wird der Trainingsprozess des Modells langsamer.
Bewertung Ihres Modells
Bewerten Sie die Leistung Ihres Modells anhand der Testdaten mithilfe von auswerten() Methode. Drucken Sie außerdem den Testverlust und die Genauigkeit auf der Konsole aus.
test_loss, test_acc = model.evaluate (test_data,
steps=test_data.n // test_data.batch_size)
drucken(f'Testverlust: {test_loss}')
drucken(f'Testgenauigkeit: {test_acc}')
Der folgende Screenshot zeigt die Leistung des Modells.
Das Modell funktioniert ziemlich gut bei nie gesehenen Daten.
Wenn Sie Code ausführen, der die Datenerweiterungstechniken nicht implementiert, beträgt die Modelltrainingsgenauigkeit 1. Was bedeutet, dass es überpasst. Es funktioniert auch schlecht bei Daten, die es noch nie zuvor gesehen hat. Dies liegt daran, dass es die Besonderheiten des Datensatzes lernt.
Wann ist Datenerweiterung nicht hilfreich?
- Wenn der Datensatz bereits vielfältig und groß ist: Datenerweiterung erhöht die Größe und Vielfalt eines Datensatzes. Wenn der Datensatz bereits groß und vielfältig ist, ist eine Datenerweiterung nicht sinnvoll.
- Wenn der Datensatz zu klein ist: Die Datenerweiterung kann keine neuen Merkmale erstellen, die im ursprünglichen Datensatz nicht vorhanden sind. Daher kann es einen kleinen Datensatz, dem die meisten Merkmale fehlen, die das Modell zum Lernen benötigt, nicht kompensieren.
- Wenn die Art der Datenanreicherung ungeeignet ist: Zum Beispiel ist das Drehen von Bildern möglicherweise nicht hilfreich, wenn die Ausrichtung der Objekte wichtig ist.
Was kann TensorFlow?
TensorFlow ist eine vielfältige und leistungsstarke Bibliothek. Es ist in der Lage, komplexe Deep-Learning-Modelle zu trainieren und kann auf einer Reihe von Geräten ausgeführt werden, von Smartphones bis hin zu Server-Clustern. Es hat dazu beigetragen, Edge-Computing-Geräte anzutreiben, die maschinelles Lernen nutzen.