RSVP para seu evento TensorFlow Everywhere hoje mesmo!
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Introdução ao sintonizador Keras

Ver no TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar caderno

Visão geral

O Keras Tuner é uma biblioteca que ajuda a escolher o conjunto ideal de hiperparâmetros para seu programa TensorFlow. O processo de seleção do conjunto certo de hiperparâmetros para seu aplicativo de aprendizado de máquina (ML) é chamado de ajuste de hiperparâmetros ou hiper- sintonia .

Hiperparâmetros são as variáveis ​​que governam o processo de treinamento e a topologia de um modelo de ML. Essas variáveis ​​permanecem constantes ao longo do processo de treinamento e afetam diretamente o desempenho do seu programa de ML. Os hiperparâmetros são de dois tipos:

  1. Hiperparâmetros do modelo que influenciam a seleção do modelo, como o número e a largura das camadas ocultas
  2. Hiperparâmetros do algoritmo que influenciam a velocidade e a qualidade do algoritmo de aprendizagem, como a taxa de aprendizagem para Stochastic Gradient Descent (SGD) e o número de vizinhos mais próximos para um classificador de k mais próximos vizinhos

Neste tutorial, você usará o sintonizador Keras para realizar o hyperajuste de um aplicativo de classificação de imagem.

Estabelecer

import tensorflow as tf
from tensorflow import keras

Instale e importe o sintonizador Keras.

pip install -q -U keras-tuner
import kerastuner as kt

Baixe e prepare o conjunto de dados

Neste tutorial, você usará o Keras Tuner para encontrar os melhores hiperparâmetros para um modelo de aprendizado de máquina que classifica imagens de roupas do conjunto de dados Fashion MNIST .

Carregue os dados.

(img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

# Normalize pixel values between 0 and 1
img_train = img_train.astype('float32') / 255.0
img_test = img_test.astype('float32') / 255.0

Defina o modelo

Ao construir um modelo para hiper-sintonia, você também define o espaço de pesquisa do hiperparâmetro, além da arquitetura do modelo. O modelo que você configurou para a hiper-sintonia é chamado de hipermodelo .

Você pode definir um hipermodelo por meio de duas abordagens:

  • Usando uma função de construtor de modelo
  • Subclassificando a classe HyperModel da API Keras Tuner

Você também pode usar duas classes HyperModel predefinidas - HyperXception e HyperResNet para aplicativos de visão computacional.

Neste tutorial, você usa uma função de construtor de modelo para definir o modelo de classificação de imagem. A função de construtor de modelo retorna um modelo compilado e usa hiperparâmetros que você define sequencialmente para ajustar o modelo.

def model_builder(hp):
  model = keras.Sequential()
  model.add(keras.layers.Flatten(input_shape=(28, 28)))

  # Tune the number of units in the first Dense layer
  # Choose an optimal value between 32-512
  hp_units = hp.Int('units', min_value=32, max_value=512, step=32)
  model.add(keras.layers.Dense(units=hp_units, activation='relu'))
  model.add(keras.layers.Dense(10))

  # Tune the learning rate for the optimizer
  # Choose an optimal value from 0.01, 0.001, or 0.0001
  hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

  model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),
                loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])

  return model

Instancie o sintonizador e execute a hiper-sintonia

Instancie o sintonizador para realizar a sintonia elevada. O sintonizador Keras tem quatro sintonizadores disponíveis - RandomSearch , Hyperband , BayesianOptimization e Sklearn . Neste tutorial, você usa o sintonizador Hyperband .

Para instanciar o sintonizador Hyperband, você deve especificar o hipermodelo, o objective para otimizar e o número máximo de épocas para treinar ( max_epochs ).

tuner = kt.Hyperband(model_builder,
                     objective='val_accuracy',
                     max_epochs=10,
                     factor=3,
                     directory='my_dir',
                     project_name='intro_to_kt')

O algoritmo de ajuste de Hyperband usa alocação adaptativa de recursos e parada antecipada para convergir rapidamente em um modelo de alto desempenho. Isso é feito usando uma chave de estilo campeonato esportivo. O algoritmo treina um grande número de modelos por algumas épocas e leva adiante apenas a metade de melhor desempenho dos modelos para a próxima rodada. A hiperbanda determina o número de modelos a serem treinados em um colchete calculando 1 + factor log ( max_epochs ) e arredondando-o para o número inteiro mais próximo.

Crie um retorno de chamada para interromper o treinamento logo após atingir um determinado valor para a perda de validação.

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)

Execute a pesquisa de hiperparâmetros. Os argumentos para o método de pesquisa são iguais aos usados ​​para tf.keras.model.fit , além do retorno de chamada acima.

tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early])

# Get the optimal hyperparameters
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]

print(f"""
The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is {best_hps.get('units')} and the optimal learning rate for the optimizer
is {best_hps.get('learning_rate')}.
""")
Trial 30 Complete [00h 00m 28s]
val_accuracy: 0.8944166898727417

Best val_accuracy So Far: 0.8944166898727417
Total elapsed time: 00h 06m 04s
INFO:tensorflow:Oracle triggered exit

The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is 512 and the optimal learning rate for the optimizer
is 0.001.


Treine o modelo

Encontre o número ideal de épocas para treinar o modelo com os hiperparâmetros obtidos na pesquisa.

# Build the model with the optimal hyperparameters and train it on the data for 50 epochs
model = tuner.hypermodel.build(best_hps)
history = model.fit(img_train, label_train, epochs=50, validation_split=0.2)

val_acc_per_epoch = history.history['val_accuracy']
best_epoch = val_acc_per_epoch.index(max(val_acc_per_epoch)) + 1
print('Best epoch: %d' % (best_epoch,))
Epoch 1/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.6147 - accuracy: 0.7839 - val_loss: 0.4014 - val_accuracy: 0.8539
Epoch 2/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3753 - accuracy: 0.8655 - val_loss: 0.3886 - val_accuracy: 0.8607
Epoch 3/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3298 - accuracy: 0.8782 - val_loss: 0.3729 - val_accuracy: 0.8648
Epoch 4/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3069 - accuracy: 0.8860 - val_loss: 0.3373 - val_accuracy: 0.8801
Epoch 5/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2812 - accuracy: 0.8933 - val_loss: 0.3202 - val_accuracy: 0.8818
Epoch 6/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2664 - accuracy: 0.8997 - val_loss: 0.3141 - val_accuracy: 0.8860
Epoch 7/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2533 - accuracy: 0.9065 - val_loss: 0.3128 - val_accuracy: 0.8892
Epoch 8/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2371 - accuracy: 0.9128 - val_loss: 0.3160 - val_accuracy: 0.8869
Epoch 9/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2314 - accuracy: 0.9126 - val_loss: 0.3332 - val_accuracy: 0.8851
Epoch 10/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2191 - accuracy: 0.9193 - val_loss: 0.3214 - val_accuracy: 0.8888
Epoch 11/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2098 - accuracy: 0.9196 - val_loss: 0.3183 - val_accuracy: 0.8910
Epoch 12/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2031 - accuracy: 0.9228 - val_loss: 0.3313 - val_accuracy: 0.8890
Epoch 13/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1941 - accuracy: 0.9270 - val_loss: 0.3168 - val_accuracy: 0.8978
Epoch 14/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1863 - accuracy: 0.9287 - val_loss: 0.3478 - val_accuracy: 0.8848
Epoch 15/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1802 - accuracy: 0.9330 - val_loss: 0.3293 - val_accuracy: 0.8917
Epoch 16/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1731 - accuracy: 0.9347 - val_loss: 0.3107 - val_accuracy: 0.8964
Epoch 17/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1677 - accuracy: 0.9380 - val_loss: 0.3352 - val_accuracy: 0.8948
Epoch 18/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1641 - accuracy: 0.9391 - val_loss: 0.3322 - val_accuracy: 0.8956
Epoch 19/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1557 - accuracy: 0.9412 - val_loss: 0.3569 - val_accuracy: 0.8872
Epoch 20/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1563 - accuracy: 0.9416 - val_loss: 0.3801 - val_accuracy: 0.8880
Epoch 21/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1521 - accuracy: 0.9416 - val_loss: 0.3584 - val_accuracy: 0.8926
Epoch 22/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1456 - accuracy: 0.9456 - val_loss: 0.3616 - val_accuracy: 0.8913
Epoch 23/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1372 - accuracy: 0.9503 - val_loss: 0.3891 - val_accuracy: 0.8910
Epoch 24/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1355 - accuracy: 0.9502 - val_loss: 0.3693 - val_accuracy: 0.8928
Epoch 25/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1313 - accuracy: 0.9505 - val_loss: 0.3668 - val_accuracy: 0.8902
Epoch 26/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1304 - accuracy: 0.9509 - val_loss: 0.3967 - val_accuracy: 0.8947
Epoch 27/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1230 - accuracy: 0.9526 - val_loss: 0.3865 - val_accuracy: 0.8936
Epoch 28/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1193 - accuracy: 0.9553 - val_loss: 0.3736 - val_accuracy: 0.8949
Epoch 29/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1181 - accuracy: 0.9545 - val_loss: 0.3967 - val_accuracy: 0.8893
Epoch 30/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1102 - accuracy: 0.9597 - val_loss: 0.4002 - val_accuracy: 0.8932
Epoch 31/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1067 - accuracy: 0.9591 - val_loss: 0.4335 - val_accuracy: 0.8901
Epoch 32/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1090 - accuracy: 0.9573 - val_loss: 0.4269 - val_accuracy: 0.8873
Epoch 33/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1030 - accuracy: 0.9614 - val_loss: 0.4296 - val_accuracy: 0.8967
Epoch 34/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1009 - accuracy: 0.9628 - val_loss: 0.4441 - val_accuracy: 0.8929
Epoch 35/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1014 - accuracy: 0.9613 - val_loss: 0.4328 - val_accuracy: 0.8938
Epoch 36/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0919 - accuracy: 0.9663 - val_loss: 0.4594 - val_accuracy: 0.8921
Epoch 37/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0943 - accuracy: 0.9622 - val_loss: 0.4475 - val_accuracy: 0.8932
Epoch 38/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0934 - accuracy: 0.9644 - val_loss: 0.4752 - val_accuracy: 0.8881
Epoch 39/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0916 - accuracy: 0.9654 - val_loss: 0.4608 - val_accuracy: 0.8952
Epoch 40/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0895 - accuracy: 0.9660 - val_loss: 0.4657 - val_accuracy: 0.8931
Epoch 41/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0847 - accuracy: 0.9682 - val_loss: 0.4825 - val_accuracy: 0.8963
Epoch 42/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0863 - accuracy: 0.9674 - val_loss: 0.4713 - val_accuracy: 0.8969
Epoch 43/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0752 - accuracy: 0.9719 - val_loss: 0.5424 - val_accuracy: 0.8921
Epoch 44/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0835 - accuracy: 0.9681 - val_loss: 0.5176 - val_accuracy: 0.8925
Epoch 45/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0820 - accuracy: 0.9689 - val_loss: 0.5032 - val_accuracy: 0.8967
Epoch 46/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0744 - accuracy: 0.9711 - val_loss: 0.5074 - val_accuracy: 0.8966
Epoch 47/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0749 - accuracy: 0.9716 - val_loss: 0.5197 - val_accuracy: 0.8945
Epoch 48/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0716 - accuracy: 0.9721 - val_loss: 0.5163 - val_accuracy: 0.8939
Epoch 49/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0760 - accuracy: 0.9726 - val_loss: 0.5215 - val_accuracy: 0.8957
Epoch 50/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0728 - accuracy: 0.9728 - val_loss: 0.5511 - val_accuracy: 0.8934
Best epoch: 13

Reative o hipermodelo e treine-o com o número ideal de épocas de cima.

hypermodel = tuner.hypermodel.build(best_hps)

# Retrain the model
hypermodel.fit(img_test, label_test, epochs=best_epoch)
Epoch 1/13
313/313 [==============================] - 1s 2ms/step - loss: 0.9074 - accuracy: 0.6859
Epoch 2/13
313/313 [==============================] - 1s 2ms/step - loss: 0.5113 - accuracy: 0.8173
Epoch 3/13
313/313 [==============================] - 1s 2ms/step - loss: 0.4458 - accuracy: 0.8333
Epoch 4/13
313/313 [==============================] - 1s 2ms/step - loss: 0.3891 - accuracy: 0.8620
Epoch 5/13
313/313 [==============================] - 1s 2ms/step - loss: 0.3666 - accuracy: 0.8620
Epoch 6/13
313/313 [==============================] - 1s 2ms/step - loss: 0.3559 - accuracy: 0.8717
Epoch 7/13
313/313 [==============================] - 1s 2ms/step - loss: 0.3366 - accuracy: 0.8733
Epoch 8/13
313/313 [==============================] - 1s 2ms/step - loss: 0.3138 - accuracy: 0.8820
Epoch 9/13
313/313 [==============================] - 1s 2ms/step - loss: 0.2926 - accuracy: 0.8904
Epoch 10/13
313/313 [==============================] - 1s 2ms/step - loss: 0.2771 - accuracy: 0.8947
Epoch 11/13
313/313 [==============================] - 1s 2ms/step - loss: 0.2601 - accuracy: 0.9022
Epoch 12/13
313/313 [==============================] - 1s 2ms/step - loss: 0.2391 - accuracy: 0.9140
Epoch 13/13
313/313 [==============================] - 1s 2ms/step - loss: 0.2434 - accuracy: 0.9069

<tensorflow.python.keras.callbacks.History at 0x7fcc08667be0>

Para finalizar este tutorial, avalie o hipermodelo nos dados de teste.

eval_result = hypermodel.evaluate(img_test, label_test)
print("[test loss, test accuracy]:", eval_result)
313/313 [==============================] - 1s 2ms/step - loss: 0.2313 - accuracy: 0.9147
[test loss, test accuracy]: [0.23128622770309448, 0.9146999716758728]

O diretório my_dir/intro_to_kt contém logs detalhados e pontos de verificação para cada teste (configuração do modelo) executado durante a pesquisa do hiperparâmetro. Se você executar novamente a pesquisa de hiperparâmetros, o Keras Tuner usará o estado existente desses registros para retomar a pesquisa. Para desativar esse comportamento, passe um argumento overwrite=True adicional ao instanciar o sintonizador.

Resumo

Neste tutorial, você aprendeu como usar o sintonizador Keras para ajustar hiperparâmetros para um modelo. Para saber mais sobre o sintonizador Keras, verifique estes recursos adicionais:

Verifique também o painel HParams no TensorBoard para ajustar interativamente os hiperparâmetros do modelo.