Как написать в TensorBoard в TensorFlow 2 - PullRequest
3 голосов
/ 10 июля 2019

Я довольно знаком с TensorFlow 1.x и собираюсь перейти на TensorFlow 2 для будущего проекта.У меня возникли проблемы с пониманием , как записывать скаляры в журналы TensorBoard с быстрым выполнением , используя пользовательский цикл обучения .

Описание проблемы

В tf1 вы должны создать несколько сводных операций (по одной операции для каждой вещи, которую вы хотите сохранить), которую затем объедините в одну операцию, запустите эту операцию в сеансе и затем запишите это в файл, используя объект FileWriter.Предполагая, что sess является нашим tf.Session(), пример того, как это работает, можно увидеть ниже:

# While defining our computation graph, define summary ops:
# ... some ops ...
tf.summary.scalar('scalar_1', scalar_1)
# ... some more ops ...
tf.summary.scalar('scalar_2', scalar_2)
# ... etc.

# Merge all these summaries into a single op:
merged = tf.summary.merge_all()

# Define a FileWriter (i.e. an object that writes summaries to files):
writer = tf.summary.FileWriter(log_dir, sess.graph)

# Inside the training loop run the op and write the results to a file:
for i in range(num_iters):
    summary, ... = sess.run([merged, ...], ...)
    writer.add_summary(summary, i)

Проблема в том, что сеансы больше не существуют в tf2, и я предпочел бы не отключать активное выполнениечтобы сделать эту работу.Официальная документация написана для tf1, и все ссылки, которые я могу найти, предлагают использовать обратный вызов Tensorboard keras.Однако, насколько я знаю, это работает, только если вы тренируете модель через model.fit(...), а не через пользовательский цикл обучения .

То, что я пробовал

  • Версия tf.summary функции tf1 вне сеанса.Очевидно, что любая комбинация этих функций дает сбой, так как FileWriters, merge_ops и т. Д. Даже не существуют в tf2.
  • Этот средний пост утверждает, что в некотором тензорном потоке произошла «очистка»API, включая tf.summary().Они предлагают использовать from tensorflow.python.ops.summary_ops_v2, который, кажется, не работает.Это подразумевает с использованием record_summaries_every_n_global_steps;подробнее об этом позже.
  • Серия других постов 1 , 2 , 3 , предложите использовать tf.contrib.summary и tf.contrib.FileWriter,Однако tf.contrib был удален из основного репозитория TensorFlow и процесс сборки .
  • Витрина TensorFlow v2 из официального репо , в которой снова используются сводки tf.contrib наряду с record_summaries_every_n_global_steps, упомянутым ранее.Я также не мог заставить это работать (даже без использования библиотеки contrib).

tl; dr

Мои вопросы:

  • IsЕсть ли способ правильно использовать tf.summary в TensroFlow 2?
  • Если нет, есть ли другой способ записи журналов TensorBoard в TensorFlow 2, когда используется пользовательский цикл обучения (не model.fit())?

1 Ответ

4 голосов
/ 10 июля 2019

Да, в TensorFlow v2 есть более простой и элегантный способ использования сводок.

Сначала создайте средство записи файлов, в котором будут храниться журналы (например, в каталоге с именем log_dir):

writer = tf.summary.create_file_writer(log_dir)

Везде, где вы хотите что-то записать в файл журнала (например, скаляр), используйте ваш старый добрый tf.summary.scalar в контексте, созданном автором. Предположим, вы хотите сохранить значение scalar_1 для шага i:

with writer.as_default():
    tf.summary.scalar('scalar_1', scalar_1, step=i)

Вы можете открывать столько контекстов, сколько захотите, внутри или снаружи тренировочного цикла.

Пример:

# create the file writer object
writer = tf.summary.create_file_writer(log_dir)

for i, (x, y) in enumerate(train_set):

    with tf.GradientTape() as tape:
        y_ = model(x)
        loss = loss_func(y, y_)

    grads = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))

    # write the loss value
    with writer.as_default():
        tf.summary.scalar('training loss', loss, step=i+1
...