[PYTHON] Réglage des paramètres Keras avec Keras Tuner

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.

conditions

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.

Installation

Vous pouvez l'installer avec pip.

pip install -U keras-tuner

image.png

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.

Échantillon simple

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.

importer

Pour utiliser "Keras Tuner", importez "Random Search".

Construire un modèle

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)

Algorithme de recherche

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". image.png

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.

Chercher

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.

Dérivation de classe

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)

Modèle intégré

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))

Autres fonctions

De plus, les fonctions suivantes sont disponibles.

Résumé

Je pense qu'il peut être utilisé lorsque vous souhaitez régler un petit paramètre avec Keras.

URL de référence

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

Recommended Posts

Réglage des paramètres Keras avec Keras Tuner
Hyper réglage des paramètres avec LightGBM Tuner
Réglage des hyper paramètres avec Grid Search à l'aide de pipeline avec keras
Reconnaissance d'image avec keras
Réglage des paramètres avec luigi (2)
Réglage des paramètres avec luigi
Tutoriel CIFAR-10 avec Keras
LSTM multivarié avec Keras
Installation de Keras (utilisée par Anaconda)
Analyse de régression multiple avec Keras
Notes AutoEncodder avec Keras
Implémentation de word2vec avec Theano + Keras
Génération de phrases avec GRU (keras)
Ajustement des paramètres LightGBM avec Optuna
Créez facilement des CNN avec Keras
Implémentation d'un GAN efficace avec keras
4. Entourez les paramètres avec un réseau neuronal!
Reconnaissance d'image avec Keras + OpenCV
MNIST (DCNN) avec Keras (backend TensorFlow)
Prédire le Titanic de Kaggle avec Keras (Kaggle ⑦)
Paramètre de fonction uniquement pour l'astérisque '*'
[TensorFlow] [Keras] Construction d'un réseau neuronal avec Keras
Implémenter Keras LSTM feed forward avec numpy
Comparez DCGAN et pix2pix avec Keras
Implémentation Score-CAM avec keras. Comparaison avec Grad-CAM
Prédiction de l'onde de péché avec keras
Divers réglages fins avec Mobilenet v2
Débutant RNN (LSTM) | Essayer avec Keras
Écrire Reversi AI avec Keras + DQN
4/22 prédiction de l'onde de péché avec keras