Используйте TensorBoard с Keras Tuner

Я столкнулся с очевидной циклической зависимостью, пытаясь использовать данные журнала для TensorBoard во время поиска гиперпараметров, выполненного с помощью Keras. Тюнер для модели, созданной с помощью TF2. Типичная настройка для последнего требует настройки обратного вызова Tensorboard в методе search() тюнера, который обертывает метод fit() модели.

from kerastuner.tuners import RandomSearch
tuner = RandomSearch(build_model, #this method builds the model
             hyperparameters=hp, objective='val_accuracy')
tuner.search(x=train_x, y=train_y,
             validation_data=(val_x, val_y),
             callbacks=[tensorboard_cb]

На практике метод обратного вызова tensorboard_cb должен настроить каталог, в который будут записываться данные, и этот каталог должен быть уникальным для каждой пробной версии. Обычный способ сделать это, назвав каталог на основе текущей временной метки, с кодом, как показано ниже.

log_dir = time.strftime('trial_%Y_%m_%d-%H_%M_%S')
tensorboard_cb = TensorBoard(log_dir)

Это работает при обучении модели с известными гиперпараметрами. Однако при поиске по гиперпараметрам я должен определить и указать обратный вызов TensorBoard перед вызовом tuner.search(). Вот в чем проблема: tuner.search() будет вызывать build_model() несколько раз, и у каждого из этих испытаний должен быть свой собственный каталог TensorBoard. В идеале определение log_dir будет выполняться внутри build_model(), но API поиска Keras Tuner заставляет TensorBoard определяться вне этой функции.

TL;DR: TensorBoard получает данные через обратный вызов и требует один каталог журнала для каждой пробной версии, но Keras Tuner требует определения обратного вызова один раз для всего поиска, до его выполнения, а не на пробу. Как в этом случае можно определить уникальные каталоги для каждого испытания?


person wishihadabettername    schedule 11.12.2019    source источник


Ответы (1)


Тюнер keras создает подкаталог для каждого запуска (инструкция, вероятно, зависит от версии).

Думаю, важно найти правильный набор версий.

Вот как это работает у меня в jupyterlab.

предварительное условие:

  1. требования к пунктам
    keras-tuner==1.0.1
    tensorboard==2.1.1
    tensorflow==2.1.0
    Keras==2.2.4
    jupyterlab==1.1.4

(2.) jupyterlab установлен, собран и запущен [стандартные аргументы компиляции: производство: свернуть]

Вот реальный код. Сначала я определяю папку журнала и обратный вызов

# run parameter
log_dir = "logs/" + datetime.datetime.now().strftime("%m%d-%H%M")

# training meta
stop_callback = EarlyStopping(
    monitor='loss', patience=1, verbose=0, mode='auto')

hist_callback = tf.keras.callbacks.TensorBoard(
    log_dir=log_dir,
    histogram_freq=1,
    embeddings_freq=1,
    write_graph=True,
    update_freq='batch')

print("log_dir", log_dir)

Затем я определяю свою гипермодель, которую не хочу раскрывать. После этого я настроил поиск по гиперпараметрам

from kerastuner.tuners import Hyperband

hypermodel = get_my_hpyermodel()

tuner = Hyperband(
    hypermodel
    max_epochs=40,
    objective='loss',
    executions_per_trial=5,
    directory=log_dir,
    project_name='test'
)

который я затем выполняю

tuner.search(
    train_data,
    labels,
    epochs=10,
    validation_data=(val_data, val_labels),
    callbacks=[hist_callback],
    use_multiprocessing=True)

tuner.search_space_summary()

Пока блокнот с этим кодом ищет адекватные гиперпараметры, я контролирую потери в другом блокноте. Так как tensorboard V2 можно вызывать с помощью волшебной функции

Ячейка 1

import tensorboard

Ячейка 2

%load_ext tensorboard

Ячейка 3

%tensorboard --logdir 'logs/'

Sitenote: поскольку я запускаю jupyterlab в контейнере докеров, мне нужно указать соответствующий адрес и порт для tensorboard, а также перенаправить это в файл докеров.

Результат для меня не очень предсказуем... Я пока не понял, когда можно ожидать гистограммы и распределения в tensorboard. При некоторых запусках время загрузки кажется слишком чрезмерным... так что наберитесь терпения.

Под скалярами я нахожу список поворотов следующим образом

"logdir"/"model_has"/execution[iter]/[train/validation]

Например. 0101-1010/bb7981e03d05b05106d8a35923353ec46570e4b6/execution0/train 0101-1010/bb7981e03d05b05106d8a35923353ec46570e4b6/execution0/validation

person Jonas    schedule 27.03.2020