Как записать данные изображения на тензорную доску, не открывая новые категории - PullRequest
1 голос
/ 13 февраля 2020

Я написал обратный вызов Keras / Tensorflow, который записывает матрицу путаницы на вкладку «Изображения» в Tensorboard. Это работало нормально в TF 2.1. К сожалению, мне пришлось конвертировать его в TF 1.14, так как другие пакеты зависят от этой версии.

Все работает нормально (более или менее), за исключением отчетов Tensorboard.

Проблема

Как вы можете видеть на скриншоте ниже, есть много категорий («теги» каналы? Я не уверен насчет терминологии) вместо одной.

снимок экрана: несколько категорий для изображений

По-видимому, коррелируя с этой проблемой, обучающие скаляры, такие как "val_loss", только отображают первый пункт данных, а затем ничего. См. Второй снимок экрана

снимок экрана: скаляры, показывающие одну точку данных

Кроме того, Tensorboard печатает следующую ошибку:
File <path/to/event-file> updated even though the current file is <path/to/new-event-file>

Итак Я полагаю, что как-то мои TF FileWriters не согласны с тем, где писать.

Относительно обратного вызова матрицы путаницы: Функция записи выглядит следующим образом:

def _figure_to_summary(self, fig, step):

    # attach a new canvas if not exists
    if fig.canvas is None:
        matplotlib.backends.backend_agg.FigureCanvasAgg(fig)

    fig.canvas.draw()

    w, h = fig.canvas.get_width_height()

    img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
    img = img.reshape((1, h, w, 3))

    with K.get_session().as_default():
        tensor = tf.constant(img)
        image = tf.summary.image(self.title, tensor).eval()
        self._summary_writer.add_summary(image, global_step=step)
        self._summary_writer.flush()

С фигурой, являющейся фигурой matplot Путаницы Matrix и step as int, что должно позволить Tensorboard добавить маленький слайдер поверх изображения, чтобы показать историю матрицы.

Модель обучается следующим образом:

run_id = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
tb_path = os.path.join("tensor/", run_id)

tb_reporter = TensorBoard(tb_path)
summ_wr = FileWriter(tb_path)

conf_matr = ConfusionMatrix(va, TARGET_CLASSES.keys(), summ_wr, normalize=True)
cb_list = [tb_reporter, conf_matr]
model.fit(tr, epochs=500, validation_data=va, callbacks=cb_list)

Где summ_wr становится self._summary_writer обратного вызова.

То, что я пытался

Я только попытался изменить способ написания резюме. Попытка tf.merge_all (), открытие, закрытие и повторное открытие FileWriter в различных комбинациях, но ничего не изменилось. Когда я деактивирую пользовательский обратный вызов, обратный вызов Tensorboard работает как положено.

Мои вопросы

Как мне каждый раз записывать данные изображения в одну и ту же категорию?

Получит ли изображение полосу прокрутки?

Как исправить проблема в том, что обратный вызов Keras Tensorboard не отображает свои данные?

Я предполагаю, что все проблемы связаны, и решение одного приводит к решению всех из них, но я совершенно ошеломлен, как это сделать.

Я благодарен за любые предложения:)

Редактировать: Я только что нашел этот вопрос: Краткое изложение изображения Tensorboard Это, кажется, решить проблему, к сожалению, ответа не так много контекста, поэтому я не знаю, как интегрировать решение в код.

1 Ответ

0 голосов
/ 13 февраля 2020

Решение, которое я нашел, состоит из двух частей.

Первое: я украл FileWriter из Tensorboard Callback у Кераса. Tensorboard.writer содержит FileWriter после вызова set_model.

Second: Summary должен быть создан через конструктор и ему должно быть передано ключевое слово tag. Это объединяет изображения в одну группу, и авторы не мешают друг другу.

Я нашел вторую часть решения здесь: TensorBoard: Как писать изображения, чтобы получить ползунок шагов?

...