[PYTHON] Optimieren von Keras-Parametern mit Keras Tuner

Hyperparameter-Tuning-Module wie Optuna kommen heraus, aber ich möchte das kürzlich eingeführte Hyper-Tuning-Modul für Keras Keras Tuner ausprobieren. ..

Grundsätzlich handelt es sich um eine japanische Übersetzung von hier.

Bedingungen

Die folgenden Module sind erforderlich, um Keras Tuner zu betreiben.

Das verwendete Keras ist auch tf.keras.

Installation

Sie können es mit pip installieren.

pip install -U keras-tuner

image.png

Wenn Sie übrigens AutoKeras installiert haben, ist Keras Tuner bereits installiert. (Auto Keras verwendet Keras Tuner zur Parametereinstellung.)

Es ist auch möglich, von der Quelle zu installieren.

Einfache Probe

Nehmen wir zunächst ein einfaches Beispiel als Beispiel, um zu sehen, wie es verwendet wird.

from tensorflow import keras
from tensorflow.keras import layers

from kerastuner.tuners import RandomSearch

(x, y), (val_x, val_y) = keras.datasets.mnist.load_data()
x = x.astype('float32') / 255.
val_x = val_x.astype('float32') / 255.

x = x[:10000]
y = y[:10000]

def build_model(hp):
    model = keras.Sequential()
    model.add(layers.Flatten(input_shape=(28, 28)))
    for i in range(hp.Int('num_layers', 2, 20)):
        model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),
                               activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    model.compile(
        optimizer=keras.optimizers.Adam(
            hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])
    return model

tuner = RandomSearch(
    build_model,
    objective='val_accuracy',
    max_trials=5,
    executions_per_trial=3,
    directory='test_dir',
    project_name='helloworld')

tuner.search_space_summary()

tuner.search(x=x,
             y=y,
             epochs=3,
             validation_data=(val_x, val_y))

tuner.results_summary()

Der verwendete Datensatz ist der bekannte MNIST.

importieren

Um "Keras Tuner" zu verwenden, importieren Sie "Random Search".

Ein Modell bauen

Bereiten Sie zunächst eine Funktion zum Erstellen eines Modells vor. Bereiten Sie die Hyperparametervariable "hp" als Argument vor.

In diesem Beispiel gibt es zwei Möglichkeiten, den Wert anzupassen.

--Wertebereich --hp.Int (Name, Start, Ende, Häkchen)

Suchalgorithmus

Wir erstellen eine Instanz, die eine Zufallssuche (RandomSearch) als Suchalgorithmus ausführt. Sie können auch Hyperband (https://arxiv.org/pdf/1603.06560.pdf) (Hyperband) angeben.

Beispiel


from kerastuner.tuners import Hyperband

tuner = Hyperband(
    hypermodel,
    objective='val_accuracy',
    max_epochs=40,
    directory='my_dir',
    project_name='helloworld')

Hier legen Sie zusätzlich zum Festlegen der Funktion zum Erstellen des Modells die Anzahl der Versuche (max_trials) und die Anzahl der Modelle pro Versuch (executions_per_trial) fest. Die Ergebnisse werden im Verzeichnis "test_dir / helloworld" gespeichert. image.png

Zeigen Sie den Inhalt des Suchraums mit search_space_summary () an.

[Search space summary]
 |-Default search space size: 4
 > num_layers (Int)
 |-default: None
 |-max_value: 20
 |-min_value: 2
 |-sampling: None
 |-step: 1
 > units_0 (Int)
 |-default: None
 |-max_value: 512
 |-min_value: 32
 |-sampling: None
 |-step: 32
 > units_1 (Int)
 |-default: None
 |-max_value: 512
 |-min_value: 32
 |-sampling: None
 |-step: 32
 > learning_rate (Choice)
 |-default: 0.01
 |-ordered: True
 |-values: [0.01, 0.001, 0.0001]

In diesem Beispiel werden die Werte für jeden Parameter angezeigt.

Suche

Suchen Sie mit search () nach dem besten Parameter. Das Argument ist das gleiche wie das sogenannte "fit ()".

Die Ergebnisse werden mit results_summary () angezeigt.

[Results summary]
 |-Results in test_dir\helloworld
 |-Showing 10 best trials
 |-Objective(name='val_accuracy', direction='max')
[Trial summary]
 |-Trial ID: 5dae177f590b1ff7f9a549cda6ae9567
 |-Score: 0.9282999634742737
 |-Best step: 0
 > Hyperparameters:
 |-learning_rate: 0.0001
 |-num_layers: 10
 |-units_0: 256
 |-units_1: 352
 |-units_10: 416
 |-units_11: 448
 |-units_12: 480
 |-units_13: 128
 |-units_14: 64
 |-units_15: 32
 |-units_16: 512
 |-units_17: 256
 |-units_18: 96
 |-units_19: 64
 |-units_2: 480
 |-units_3: 320
 |-units_4: 64
 |-units_5: 512
 |-units_6: 320
 |-units_7: 512
 |-units_8: 320
 |-units_9: 64
[Trial summary]
 |-Trial ID: 496aa846dabfafb3c67270e3ce810234
 |-Score: 0.9157333374023438
 |-Best step: 0
 > Hyperparameters:
 |-learning_rate: 0.01
 |-num_layers: 3
 |-units_0: 64
 |-units_1: 416
 |-units_2: 32
[Trial summary]
 |-Trial ID: c516cbd03faf4aa32cf8182ab34eb114
 |-Score: 0.8071333765983582
 |-Best step: 0
 > Hyperparameters:
 |-learning_rate: 0.0001
 |-num_layers: 18
 |-units_0: 160
 |-units_1: 384
 |-units_10: 32
 |-units_11: 32
 |-units_12: 32
 |-units_13: 32
 |-units_14: 32
 |-units_15: 32
 |-units_16: 32
 |-units_17: 32
 |-units_2: 320
 |-units_3: 512
 |-units_4: 416
 |-units_5: 416
 |-units_6: 96
 |-units_7: 128
 |-units_8: 160
 |-units_9: 32
[Trial summary]
 |-Trial ID: 81260e9782e1bc81da957360c6322371
 |-Score: 0.7860667109489441
 |-Best step: 0
 > Hyperparameters:
 |-learning_rate: 0.01
 |-num_layers: 9
 |-units_0: 64
 |-units_1: 512
 |-units_2: 224
 |-units_3: 32
 |-units_4: 32
 |-units_5: 32
 |-units_6: 32
 |-units_7: 32
 |-units_8: 32
[Trial summary]
 |-Trial ID: eb9da62f11d1bb75b11b9d05c79ae7ec
 |-Score: 0.11349999904632568
 |-Best step: 0
 > Hyperparameters:
 |-learning_rate: 0.01
 |-num_layers: 20
 |-units_0: 224
 |-units_1: 288
 |-units_10: 32
 |-units_11: 64
 |-units_12: 448
 |-units_13: 64
 |-units_14: 512
 |-units_15: 96
 |-units_16: 256
 |-units_17: 64
 |-units_18: 32
 |-units_19: 32
 |-units_2: 352
 |-units_3: 480
 |-units_4: 128
 |-units_5: 160
 |-units_6: 224
 |-units_7: 480
 |-units_8: 224
 |-units_9: 352

In diesem Beispiel werden 5 Versuche angezeigt. (In der Reihenfolge der besten Note)

Wenn Sie es als Modell erhalten möchten

Beispiel


models = tuner.get_best_models(num_models=2)

Verwenden Sie tuner.get_best_models () wie folgt.

Herleitung der Klasse

Sie können die Modellkonstruktion auch in Klassen anstelle von Funktionen definieren. In diesem Fall wird es von der HyperModel-Klasse abgeleitet. Die einzige Funktion, die implementiert werden muss, ist build ().

from tensorflow import keras
from tensorflow.keras import layers

from kerastuner.tuners import RandomSearch
from kerastuner import HyperModel

class MyHyperModel(HyperModel):

    def __init__(self, num_classes):
        self.num_classes = num_classes

    def build(self, hp):
        model = keras.Sequential()
        for i in range(hp.Int('num_layers', 2, 20)):
            model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),
                               activation='relu'))
        model.add(layers.Dense(self.num_classes, activation='softmax'))
        model.compile(
            optimizer=keras.optimizers.Adam(
                hp.Choice('learning_rate',
                          values=[1e-2, 1e-3, 1e-4])),
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy'])
        return model

hypermodel = MyHyperModel(num_classes=10)

tuner = RandomSearch(
    hypermodel,
    objective='val_accuracy',
    max_trials=10,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             epochs=5,
             validation_data=(val_x, val_y))

Zu diesem Zeitpunkt können Sie den Standardwert für den anzupassenden Wert angeben.

Beispiel


hp.Int('units',
       min_value=32,
       max_value=512,
       step=32,
       default=128)

Eingebautes Modell

ResNet- und Xception-Modelle sind bereits verfügbar.

Beispiel


from kerastuner.applications import HyperResNet

hypermodel = HyperResNet(input_shape=(128, 128, 3), num_classes=10)

Beispiel


from kerastuner.applications import HyperXception

hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

Wenn Sie die Parameter ändern möchten, die im integrierten Modell angepasst werden sollen, bereiten Sie Hyperparameter mit den unten gezeigten Namen vor und legen Sie sie beim Erstellen einer Instanz des Suchalgorithmus fest. Setzen Sie zu diesem Zeitpunkt tune_new_entries auf False.

from kerastuner.applications import HyperXception
from kerastuner import HyperParameters
from kerastuner.tuners import Hyperband

hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

hp = HyperParameters()
hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

tuner = Hyperband(
    hypermodel,
    hyperparameters=hp,
    tune_new_entries=False,
    objective='val_accuracy',
    max_epochs=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             validation_data=(val_x, val_y))

Im Gegenteil, wenn Sie es nicht anpassen möchten, können Sie einen festen Wert festlegen. Geben Sie den Wert mit fixed () an und setzen Sie tune_new_entries = True.

Beispiel


hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

hp = HyperParameters()
hp.Fixed('learning_rate', value=1e-4)

tuner = Hyperband(
    hypermodel,
    hyperparameters=hp,
    tune_new_entries=True,
    objective='val_accuracy',
    max_epochs=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             validation_data=(val_x, val_y))

Außerdem können die Variablen "Optimierer", "Verlust" und "Metriken" direkt geändert werden.

Beispiel


hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

tuner = Hyperband(
    hypermodel,
    optimizer=keras.optimizers.Adam(1e-3),
    loss='mse',
    metrics=[keras.metrics.Precision(name='precision'),
             keras.metrics.Recall(name='recall')],
    objective='val_precision',
    max_epochs=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             validation_data=(val_x, val_y))

Andere Funktionen

Darüber hinaus stehen folgende Funktionen zur Verfügung.

Zusammenfassung

Ich denke, es kann verwendet werden, wenn Sie einen kleinen Parameter mit Keras einstellen möchten.

Referenz-URL

https://tksmml.hatenablog.com/entry/2020/02/01/093000

Recommended Posts

Optimieren von Keras-Parametern mit Keras Tuner
Hyperparameter-Tuning mit LightGBM-Tuner
Optimieren von Hyperparametern mit Grid Search mithilfe einer Pipeline mit Keras
Bilderkennung mit Keras
Parametereinstellung mit luigi (2)
Parametereinstellung mit luigi
CIFAR-10-Tutorial mit Keras
Multivariates LSTM mit Keras
Keras-Installation (von Anaconda verwendet)
Multiple Regressionsanalyse mit Keras
AutoEncodder-Notizen mit Keras
Word2vec mit Theano + Keras implementiert
Satzerzeugung mit GRU (Keras)
Anpassen der LightGBM-Parameter mit Optuna
Erstellen Sie einfach CNNs mit Keras
Effizientes GAN mit Keras implementiert
4. Kreisparameter mit einem neuronalen Netzwerk!
Bilderkennung mit Keras + OpenCV
MNIST (DCNN) mit Keras (TensorFlow-Backend)
Vorhersage der Titanic von Kaggle mit Keras (kaggle ⑦)
Funktionsparameter nur für Stern '*'
[TensorFlow] [Keras] Aufbau eines neuronalen Netzwerks mit Keras
Implementieren Sie Keras LSTM Feed Forward mit Numpy
Vergleichen Sie DCGAN und pix2pix mit Keras
Score-CAM-Implementierung mit Keras. Vergleich mit Grad-CAM
Vorhersage der Sinuswelle mit Keras
Verschiedene Feinabstimmungen mit Mobilenet v2
Anfänger RNN (LSTM) | Versuchen Sie es mit Keras
Schreiben Sie Reversi AI mit Keras + DQN
4/22 Vorhersage der Sinuswelle mit Keras