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.
Die folgenden Module sind erforderlich, um Keras Tuner zu betreiben.
Das verwendete Keras ist auch tf.keras.
Sie können es mit pip installieren.
pip install -U keras-tuner
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.
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.
Um "Keras Tuner" zu verwenden, importieren Sie "Random Search".
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)
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.
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.
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.
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)
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))
Darüber hinaus stehen folgende Funktionen zur Verfügung.
Ich denke, es kann verwendet werden, wenn Sie einen kleinen Parameter mit Keras einstellen möchten.
https://tksmml.hatenablog.com/entry/2020/02/01/093000
Recommended Posts