Technologische Neuigkeiten, Bewertungen und Tipps!

Hören Sie auf, die Rastersuche zu verwenden! Das komplette praktische Tutorial zu Keras… – Auf dem Weg zur KI

Hinweis: Der folgende Artikel hilft Ihnen dabei: Hören Sie auf, die Rastersuche zu verwenden! Das komplette praktische Tutorial zu Keras… – Auf dem Weg zur KI

Ursprünglich veröffentlicht auf Towards AI, dem weltweit führenden Nachrichten- und Medienunternehmen für KI und Technologie. Wenn Sie ein KI-bezogenes Produkt oder eine KI-bezogene Dienstleistung entwickeln, laden wir Sie ein, darüber nachzudenken, KI-Sponsor zu werden. Bei Towards AI helfen wir bei der Skalierung von KI- und Technologie-Startups. Wir helfen Ihnen dabei, Ihre Technologie der breiten Masse zugänglich zu machen.

Hören Sie auf, die Rastersuche zu verwenden! Das komplette praktische Tutorial zum Keras Tuner.

Praktisches Keras Tuner-Tutorial für die automatische Hyperparameter-Abstimmung tiefer neuronaler Netze. Ein AutoML-Tutorial.

Inhalt:

  1. Einführung
  2. Lade Daten
  3. Grundlagen von Keras-Tuner
  4. Alles zusammenfügen (Code-Erklärung)
  5. Führen Sie die Hyperparametersuche aus
  6. Extrahieren und trainieren Sie das beste Modell
  7. Bonus: Einige Tipps und Tricks
  8. Abschließende Gedanken

Einführung

In diesem Artikel erfahren Sie nicht nur, wie Sie KerasTuner verwenden, sondern auch einiges davon Tricks, die in anderen Tutorials nicht enthalten sindB. das separate Optimieren der Parameter in jeder Ebene oder das Optimieren der Lernrate in Verbindung mit dem Optimierer, was aufgrund einiger Einschränkungen und mehr nicht einfach ist. Und das alles während der Arbeit mit einem 37-Klassen-Computer-Vision-Datensatz in Gebärdensprache.

Selbst Experten bleiben oft in Versuch-und-Irrtum-Verfahren gefangen, bis sie eine gute Hyperparameterkombination für ihre neuronalen Netze finden. Keras-Tuner ist ein Tool, das Ihnen hilft, Ihr neuronales Netzwerk zu optimieren und einen nahezu optimalen Hyperparametersatz zu finden. Hinter den Kulissen werden erweiterte Such- und Optimierungsmethoden wie HyperBand Search und Bayesian Optimization eingesetzt. Sie müssen nur den Suchraum definieren und Keras-Tuner übernimmt den mühsamen Tuning-Prozess!

Ein ausführliches Praxisbeispiel

Wir werden uns schnell an die Übung machen!

Lade Daten

Nehmen wir an, wir möchten ein CNN anhand eines Bildklassifizierungsdatensatzes trainieren. Wir zeigen, wie Sie KerasTuner nutzen können, um unser neuronales Netzwerk einfach zu optimieren.

Installieren Sie zunächst die Keras-Tuner-Bibliothek mit pip und importieren Sie die erforderlichen Bibliotheken. Wenn Sie keine Ausgabe von pip wünschen, verwenden Sie das Flag -q für eine stille Installation.

!pip install keras-tuner –upgrade import keras_tunerfrom tensorflow import kerasfrom keras import backend as Kfrom tensorflow.keras import effects, lossimport numpy as npimport matplotlib.pyplot as pltimport os

Als nächstes müssen wir einige Daten laden, mit denen wir arbeiten können. Ich habe mich für die Verwendung des American Sign Language (ASL)-Datensatzes entschieden, der auf Kaggle unter der CCO-Lizenz verfügbar ist. Es enthält 400×400 RGB-Bilder von Gebärdengesten, die die amerikanische Gebärdensprache darstellen. Es gibt insgesamt 37 Klassen mit 70 Bildern für jede Klasse. Wir werden ein CNN-Modell trainieren, um diese Gesten zu klassifizieren.

Da der Datensatz bereits in Ordnern basierend auf Klassen strukturiert ist, lässt sich der Datensatz am einfachsten mit dem Dienstprogramm keras.utils.image_dataset_from_directory laden. Geben Sie den übergeordneten Verzeichnispfad mit dem Verzeichnisparameter an und verwenden Sie labels=’inferred’, um die Beschriftungen basierend auf dem Ordnernamen automatisch zu laden. Mit label_mode=’categorical’ werden Etiketten als One-Hot-Vektoren geladen. Wenn Sie möchten, dass das Mischen reproduzierbar ist, können Sie einen Startwert festlegen. Andernfalls verwenden Sie die Startwertoption überhaupt nicht.

BATCH_SIZE = 64train_data = keras.utils.image_dataset_from_directory(directory=”../input/asl-dataset/asl_dataset”,labels= ‘inferred’,label_mode=’categorical’,color_mode=’rgb’,batch_size=BATCH_SIZE,seed=777 ,shuffle=True,image_size=(400, 400) )

Verwenden Sie nun die folgende Funktion, um das Element tf.data.dataset in train-val-test-Teilmengen aufzuteilen. Ich verwende für diesen Datensatz eine Aufteilungsregel von 0,7–0,15–0,15.

Das Laden des Datensatzes ist abgeschlossen. Kommen wir zum spannenden Teil!

Grundlagen von Keras Tuner

Bevor wir uns dem komplizierteren Code zuwenden, müssen wir den Arbeitsablauf von Keras-Tuner verstehen.

  1. Wir definieren eine build()-Funktion, die ein Argument akzeptiert PS (keras_tuner.Hyperparameter-Objekt). Im Inneren definieren wir unsere Modellarchitektur und den Hyperparameter-Suchraum.
  2. Um einen Suchraum zu definieren, PS Objekt bietet 4 Methoden. hp.Choice(), hp.Int(), hp.Float() und hp.Boolean(). Die hp.Choice()-Methode ist die allgemeinste und akzeptiert eine Liste von str-, int-, float- oder booleschen Werten, aber alle müssen denselben Typ haben. Die anderen Methoden sind selbsterklärend. Hier sind einige intuitive Beispiele

# Definieren der Anzahl der Neuronen in einer vollständig verbundenen Schichtunits = hp.Choice(name=”Neurons”, Werte=[150, 200]) # die Anzahl der Neuronen dynamisch mit der hp.Int-Methode definierenunits = hp.Int(name=”neurons”, min=100, max=200, step=10) # die Dropout-Rate definierendropout = hp.Int(name=” Dropout”, min=0,0, max=0,3, Schritt=0,05) # Wahr/Falsch-Werte automatisch zuweisen.shuffle = hp.Boolean(“shuffle”, default=False)

3. Initialisieren Sie einen Tuner, der für die Suche im Hyperparameterraum verantwortlich ist. Keras-Tuner bietet drei verschiedene Suchstrategien: RandomSearch, Bayesian Optimization und HyperBand. Für alle Tuner müssen wir ein HyperModel, eine zu optimierende Metrik, ein Rechenbudget und optional ein Verzeichnis zum Speichern der Ergebnisse angeben. Weitere Einzelheiten zu den Argumenten, die jeder Tuner akzeptiert, finden Sie in der entsprechenden Dokumentation. Unten sehen Sie ein Beispiel eines HyperBand-Tuners.

tuner = keras_tuner.Hyperband(hypermodel=MyHyperModel(),objective = “val_accuracy”, #optimize val accmax_epochs=50, #for every Candidate modeloverwrite=True, #overwrite previous resultsdirectory=’hyperband_search_dir’, #Saving dirproject_name=’sign_lingual_cnn’)

4. Durchführen der Suche. Dieser Befehl startet die Suche. Sie müssen die Trainings- und Validierungsdaten bereitstellen, die zum Trainieren und Bewerten der gesuchten Modelle verwendet werden.

tuner.search(x=train_data, max_trials=50, # Maximale Anzahl auszuprobierender Kandidatenvalidation_data=val_data,batch_size=BATCH_SIZE)

Alles zusammenfügen

Es gibt viele Möglichkeiten, all das zu kombinieren. Die unten vorgestellte Methode bietet viel Flexibilität.

Zuerst definieren wir eine HyperModel-Klasse, die von keras_tuner.HyperModel erbt, und definieren die Build- und Fit-Methoden.

Mit der Build-Methode entwickeln wir unsere Architektur und nutzen die PS Argument zum Einrichten des Hyperparameter-Suchraums. Wir stellen unser Modell auch zusammen und senden es zurück.

Die fit-Methode akzeptiert das hp-Argument, das zu trainierende Modell, die Trainingsdaten x und übergibt außerdem *args und **kwargs, die an die model.fit()-Methode von Kera übergeben werden. Die **kwargs sollten immer an model.fit() übergeben werden, da sie die Rückrufe zum Speichern des Modells und die optionalen Tensorboard-Plugins enthalten.

Durch die Definition einer fit()-Methode in unserer HyperModel-Klasse erhalten Sie die Flexibilität, Parameter auch während des Trainingsprozesses zu suchen, nicht nur während der Erstellung.

Die oben genannten Netzwerke und Parameter dienen nur zu Ausstellungszwecken. Sie können das Netzwerk und den Suchraum jederzeit nach Ihren Wünschen anpassen und so anpassen, wie es für Ihre Anwendung besser geeignet ist.

Lassen Sie uns näher darauf eingehen:

In den Zeilen 3–5 beginnen wir mit dem Aufbau des Keras-Modells und fügen eine Größenänderungsebene hinzu. In den Zeilen 7–8 verwenden wir hp.Boolean, um zu bewerten, ob es am besten ist, eine Normalisierungsebene hinzuzufügen oder nicht, während wir in Zeile 10 verschiedene mögliche Werte für die Dropout-Rate definieren.

Zeilen 12–17 sind etwas komplizierter. Wir geben dynamisch an, wie viele Faltungsschichten unser Modell haben soll Gleichzeitig wird für jede Ebene ein anderer Hyperparameterraum definiert. Im Wesentlichen legen wir die Anzahl der Conv-Ebenen auf 7–8 fest und suchen für jede Ebene unabhängig nach der optimalen Anzahl an Filtern, der Kernelgröße und der Aktivierungsfunktion. Wir tun dies, indem wir für jede Iteration in der Schleife ein anderes Namensargument verwenden, indem wir den Index i in den Zeichenfolgen name=f“kernel_{i}“ verwenden. Das gibt uns viel Flexibilität und erlaubt uns, den Suchraum immens zu erweitern. Seien Sie jedoch vorsichtig, da die möglichen Kombinationen extrem groß werden können und viel Rechenleistung erforderlich sein wird.

Durch die Angabe des Namens der einstellbaren Variablen mit name=f“kernel_{i}“ innerhalb einer Schleife können Sie für jeden Parameter auf jeder Ebene einen anderen Suchraum definieren.

In den Zeilen 18–22 fügen wir Dropout- und Batch-Normalisierungsebenen innerhalb des Conv-Blocks hinzu (oder auch nicht). Dasselbe machen wir im Zeitraum 28–31, jedoch für die vollständig verbundenen Schichten.

In den Zeilen 24–27 fügen wir eine Abflachungsebene hinzu, gefolgt von einer durchsuchbaren Anzahl vollständig verbundener Ebenen mit jeweils unterschiedlichen Parametern zur Optimierung, ähnlich wie in den Zeilen 12–17.

In den Zeilen 36–39 kompilieren wir unser Modell, aber die Wahl des zu verwendenden Optimierers und Verlusts ist wiederum ein durchsuchbarer Hyperparameter. Eine Einschränkung des Keras-Tuners besteht darin, dass er keine anderen Variablen als int, float, str oder boolean akzeptiert. Daher können wir in der Choice-Methode keine keras.optimizer-Objekte übergeben. Dies beschränkt unsere Hyperparameter-Suche auf Optimierer und Verlustfunktionen, denen Keras einen String-Alias ​​gegeben hat, z. B. keras.optimizers.Adam() -> ‘adam’ .

Aufgrund der oben genannten Einschränkung ist es nicht einfach, wie Sie die Lernrate optimieren können. In den Zeilen 41–43 tun wir genau das auf eine „hackige“ Art und Weise.

Mit dem folgenden Code können Sie die Hyperparameter des Optimierers, wie z. B. die Lernrate, ändern, selbst wenn Sie verschiedene Optimierer optimieren, was der Keras-Tuner nicht auf einfache Weise bietet.

aus dem Keras-Import-Backend als Klearning-Rate = hp.Choice(‘lr’, [0.03, 0.01, 0.003])K.set_value(model.optimizer.learning_rate, learning_rate)

In den Zeilen 48–53 definieren wir die Methode fit(self, hp, model,x, *args, **kwargs) unserer Hypermodel-Klasse. Wie Sie vielleicht beobachten, definieren wir hp als Argument. Dadurch können wir Hyperparameterwerte auch während des Trainingsprozesses optimieren. Als Beispiel habe ich das Mischen der Trainingsdaten vor jeder Epoche verwendet. Stellen Sie sicher, dass Sie **kwargs als Argument hinzufügen, da es die Rückrufe zum Speichern des Modells während der Suche (und die optionalen Tensorboard-Plugins) enthält.

Stellen Sie sicher, dass alles ordnungsgemäß funktioniert, indem Sie die folgenden Zeilen testweise ausführen

classes = 37hp = keras_tuner.HyperParameters()hypermodel = MyHyperModel()model = hypermodel.build(hp,classes)hypermodel.fit(hp, model, np.random.rand(BATCH_SIZE, 400, 400,3), np.random .rand(BATCH_SIZE, Klassen))

Ausführen der Hyperparametersuche

Vorausgesetzt, dass alles ordnungsgemäß funktioniert, ist es an der Zeit, die Suche zu initialisieren. Im folgenden Code verwende ich die Bayes’sche Optimierungsstrategie. Es handelt sich um eine der besten Suchmethoden, die in AutoML verwendet werden.

Übergeben Sie ein Hypermodellobjekt, setzen Sie das Ziel auf die Metrik, die Sie optimieren möchten (z. B. „val_accuracy“, „train_loss“), und definieren Sie ein Rechenbudget mit dem Argument max_trials und einem Pfad zum Speichern der Modelle.

tuner = keras_tuner.BayesianOptimization(hypermodel=MyHyperModel(),objective = “val_accuracy”,max_trials =10, #max Kandidaten zum Testenoverwrite=True,directory=’BO_search_dir’,project_name=’sign_lingual_cnn’)

Um die Suche zu starten, führen Sie den folgenden Befehl aus und schon kann es losgehen. Keras-Tuner kümmert sich während Ihrer Kaffeepause um den Rest.

# epochs definiert, für wie viele Epochen jedes Kandidatenmodell# trainiert wird. Je mehr, desto besser, aber langsamer.tuner.search(x=train_data, epochs=10,validation_data=val_data)

Sobald Sie Ihren Kaffee ausgetrunken haben oder die Suche abgeschlossen ist, können Sie mit tuner.results_summary(1) auf die Suchergebnisse zugreifen. Sie können sehen, welcher Wert für jeden Hyperparameter ausgewählt wurde und auch die Validierungsbewertung, die das beste Modell während seines Trainings erreicht hat.

Führen Sie die folgenden Zeilen aus, um das beste Kandidatenmodell automatisch zu extrahieren und zu erstellen. Wenn Sie nicht nur das erste, sondern mehrere Modelle mit der besten Leistung extrahieren möchten, ändern Sie die Zahl in tuner.get_best_hyperparameters(5).

# Holen Sie sich die Top 2 hyperparameters.best_hps = tuner.get_best_hyperparameters(1)# Erstellen Sie das Modell mit den besten hp.h_model = MyHyperModel()model = h_model.build(best_hps[0])

Im weiteren Verlauf müssen wir dieses Modell für den gesamten Datensatz und für mehrere Epochen trainieren. Sie können auch Callback-Funktionen übergeben wie Frühzeitiges Stoppen, Speichern des besten Modells und Lernratenplaner.

Sobald Ihr Modell trainiert ist, zeichnen Sie die Lerndiagramme zur Überprüfung auf und werten Sie den Testdatensatz aus. Wenn Sie zufrieden sind, speichern Sie das Modell, um es später für die Bereitstellung zu verwenden

model.load_weights(‘Net_weights.h5’)model.evaluate(test_data)model.save(‘Best_model’)

Bonus: Einige Tipps und Tricks

  1. Wenn Ihr Datensatz sehr groß ist und die Suche viel zu lange dauert, können Sie während der Suche nur eine kleine Teilmenge zum Training verwenden, beispielsweise 30 %. Dies führt normalerweise in einem Bruchteil der Zeit zu ähnlichen Ergebnissen. Dann können Sie das beste Modell auf das gesamte Set umschulen.
  2. Um den Prozess während der Suche zu beschleunigen, können Sie die Anzahl der Epochen reduzieren, für die jeder Kandidat trainiert wird. Dies könnte jedoch die Präzision der Suchoptimierung beeinträchtigen, da Kandidaten, die tendenziell zu Beginn eine bessere Leistung erbringen, auch dann weiterkommen, wenn ihre Leistung später gesättigt ist. Versuchen Sie, den optimalen Kompromiss zwischen Zeit und Präzision der Ergebnisse zu finden.
  3. Ein mögliches Problem, das während der Suche auftreten könnte, besteht darin, dass Ihnen der Speicherplatz ausgeht. Bei der Suche speichert der Tuner automatisch alle Modelle im Projektverzeichnis, verworfene Modelle werden jedoch nicht dynamisch gelöscht. Dadurch wird der Festplattenspeicher schnell belastet und es kann zu einem Absturz kommen, insbesondere wenn Sie den Code auf Kaggle oder Google Colab ausführen. Dies ist ein gemeldetes Problem [1][2], und Entwickler haben es als Erweiterung im Keras Tuners-Repository markiert. Wenn Sie die Fehlermeldung „Nicht genügend Speicherplatz“ erhalten, sollten Sie entweder den Suchraum begrenzen oder Ihre Suche in mehrere kleinere Suchvorgänge aufteilen. Stellen Sie abschließend sicher, dass Sie „schlechte“ Modelle nach jeder Suche verwerfen, wenn Sie in einer lokalen Umgebung arbeiten.

Abschließende Gedanken

In diesem Tutorial haben wir die Verwendung des Keras Tuner-Tools untersucht. Mit diesem Tool können wir unsere Netzwerkarchitekturen (Anzahl der Schichten, Anzahl der Neuronen usw.), aber auch deren Hyperparameter (z. B. Aktivierungsfunktionen, Optimierer, Verlust usw.) optimieren.

Die im KerasTuner implementierten Suchstrategien ermöglichen eine extrem schnellere und einfachere Feinabstimmung im Vergleich zu manuellen oder Rastersuchmethoden. Durch den Einsatz von Suchmethoden wie der Bayes’schen Optimierung oder der HyperBand-Suche sparen Sie nicht nur Zeit, sondern erhalten in den meisten Fällen auch ein viel besseres Modell, als Sie ohne sie finden könnten.

Verweise

[1] Keras Tuner-Dokumentation, https://keras-team.github.io/keras-tuner/

[2] Jasper Snoek, Hugo Larochelle, Ryan P. Adams,https://arxiv.org/abs/1206.2944

[3] L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, A. Talwalkar, https://arxiv.org/abs/1603.06560

Meine Links: Mittel |LinkedIn | GitHub


Hören Sie auf, die Rastersuche zu verwenden! Das komplette praktische Tutorial zum Keras Tuner. wurde ursprünglich in Towards AI auf Medium veröffentlicht, wo die Leute das Gespräch fortsetzen, indem sie diese Geschichte hervorheben und darauf reagieren.

Veröffentlicht über Towards AI

Table of Contents