Des modules de réglage d'hyper paramètres tels qu'Optuna sortent, mais j'aimerais essayer le module de réglage d'hyper récemment introduit pour Keras Keras Tuner. ..
Fondamentalement, il s'agit d'une traduction japonaise de ici.
Les modules suivants sont nécessaires pour faire fonctionner Keras Tuner.
--Python 3.6 et supérieur --TensorFlow 2.0 ou supérieur
Le Keras utilisé est également tf.keras.
Vous pouvez l'installer avec pip.
pip install -U keras-tuner
En passant, si vous avez AutoKeras installé, vous avez déjà installé Keras Tuner. (Auto Keras utilise Keras Tuner pour le réglage des paramètres)
Il est également possible d'installer à partir de la source.
Tout d'abord, prenons un exemple simple pour voir comment l'utiliser.
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()
L'ensemble de données utilisé est le MNIST familier.
Pour utiliser "Keras Tuner", importez "Random Search".
Tout d'abord, préparez une fonction pour créer un modèle. Préparez la variable d'hyper-paramètre "hp" comme argument.
Il existe deux façons d'ajuster la valeur dans cet exemple.
--Plage de valeurs --hp.Int (nom, début, fin, coche)
Nous créons une instance qui effectue une recherche aléatoire (RandomSearch) comme algorithme de recherche. Vous pouvez également spécifier Hyperband (https://arxiv.org/pdf/1603.06560.pdf) (Hyperband).
Exemple
from kerastuner.tuners import Hyperband
tuner = Hyperband(
hypermodel,
objective='val_accuracy',
max_epochs=40,
directory='my_dir',
project_name='helloworld')
Ici, en plus de définir la fonction de construction du modèle, définissez le nombre d'essais (max_trials) et le nombre de modèles pour chaque essai (executions_per_trial). Les résultats sont enregistrés dans le répertoire "test_dir / helloworld".
Affichez le contenu de l'espace de recherche avec search_space_summary ().
[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]
Dans cet exemple, les valeurs de chaque paramètre sont affichées.
Recherchez le meilleur paramètre avec search (). L'argument est le même que le soi-disant "fit ()".
Les résultats sont affichés avec results_summary ().
[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
Dans cet exemple, 5 essais sont affichés. (Par ordre de meilleure note)
Si vous voulez l'obtenir comme modèle
Exemple
models = tuner.get_best_models(num_models=2)
Utilisez tuner.get_best_models () comme ceci.
Vous pouvez également définir la construction du modèle dans des classes au lieu de fonctions. Dans ce cas, il sera dérivé de la classe HyperModel. La seule fonction qui doit être implémentée est 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))
À ce stade, vous pouvez spécifier la valeur par défaut de la valeur à ajuster.
Exemple
hp.Int('units',
min_value=32,
max_value=512,
step=32,
default=128)
Les modèles ResNet et Xception sont déjà disponibles.
Exemple
from kerastuner.applications import HyperResNet
hypermodel = HyperResNet(input_shape=(128, 128, 3), num_classes=10)
Exemple
from kerastuner.applications import HyperXception
hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)
Si vous souhaitez modifier les paramètres à ajuster dans le modèle intégré, préparez des hyper-paramètres avec les noms indiqués ci-dessous et définissez-les lors de la création d'une instance de l'algorithme de recherche. À ce moment-là, définissez tune_new_entries sur 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))
Au contraire, si vous ne souhaitez pas l'ajuster, vous pouvez définir une valeur fixe. Spécifiez la valeur avec fixed () et définissez tune_new_entries = True.
Exemple
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))
De plus, les variables «optimiseur», «perte» et «métrique» peuvent être modifiées directement.
Exemple
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))
De plus, les fonctions suivantes sont disponibles.
Je pense qu'il peut être utilisé lorsque vous souhaitez régler un petit paramètre avec Keras.
https://tksmml.hatenablog.com/entry/2020/02/01/093000
Recommended Posts