Распределения и гистограммы TensorBoard с Keras и fit_generator

Я использую Keras для обучения CNN с помощью функции fit_generator.

Кажется, что известная проблема, что TensorBoard не показывает гистограммы и дистрибутивы в этой настройке.

Кто-нибудь выяснил, как заставить его работать?

Ответ 1

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

Хорошей новостью является то, что это не сложно, и вы можете использовать код обратного вызова TensorBoard в Keras в качестве ссылки: https://github.com/fchollet/keras/blob/master/keras/callbacks.py#L537

По сути, напишите функцию, например write_summaries(model) и вызывайте ее всякий раз, когда вы хотите написать свои резюме (например, сразу после вашего fit_generator())

Внутри ваши write_summaries(model) использования функции tf.summary, histogram_summary и других итоговых функций для регистрации данных вы хотите видеть на tensorboard.

Если вы точно не знаете, как это сделать, посмотрите официальный учебник: https://www.tensorflow.org/get_started/summaries_and_tensorboard и этот замечательный пример MNIST со сводками: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py

Ответ 2

Я полагаю, что объяснение bartgras заменено более поздними версиями Keras (я использую Keras 2.2.2). Чтобы получить гистограммы в Tensorboard, все, что я сделал, было следующим (где bg - класс обработки данных, который предоставляет генератор для gb.training_batch(); gb.validation_batch() однако, НЕ является генератором):

NAME = "Foo_{}".format(datetime.now().isoformat(timespec='seconds')).replace(':', '-')

tensorboard = keras.callbacks.TensorBoard(
    log_dir="logs/{}".format(NAME),
    histogram_freq=1,
    write_images=True)

callbacks = [
    tensorboard
]

history = model.fit_generator(
    bg.training_batch(),
    validation_data=bg.validation_batch(),
    epochs=EPOCHS,
    steps_per_epoch=bg.steps_per_epoch,
    validation_steps=bg.validation_steps,
    verbose=1,
    shuffle=False,
    callbacks=callbacks)