Скалярная сводка или любые сводки в целом собираются сводными операциями . Еще один способ подумать об этом - заключить элемент, который вы хотите обобщить, в сводную операцию, а не записывать элемент напрямую. Эта упаковка создаст «Тензор, содержащий сводный протобуф» , который является приемлемым форматом add_summary
.
Подробно вы создадите сводную информацию по:
loss_summ = tf.summary.scalar('loss', loss)
Затем запустите этот оператор, чтобы получить тензор / значение:
_, loss_value, loss_summ_val = sess.run((train, loss, loss_summ))
Наконец, добавьте возвращенный тензор / значение, а не фактический loss_value
к итогу:
writer.add_summary(summary=loss_summ_val, global_step=i)
При минимально необходимых изменениях будет работать следующий код. Однако, как подсказал «nairouz mrabah» в другом ответе, структура кода могла бы быть улучшена.
import tensorflow as tf
import numpy as np
WORKDIR = "/content/log"
x = tf.constant([[1], [2], [3], [4]], dtype=tf.float32)
y_true = tf.constant([[0], [-1], [-2], [-3]], dtype=tf.float32)
linear_model = tf.layers.Dense(units=1)
y_pred = linear_model(x)
sess = tf.Session()
init = tf.global_variables_initializer()
with tf.name_scope("TRAIN"):
loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred)
loss_summ = tf.summary.scalar('loss', loss)
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
writer = tf.summary.FileWriter(WORKDIR + "/tmp/5", graph=sess.graph)
sess.run(init)
for i in range(1000):
# _, loss_value = sess.run((train, loss))
_, loss_value, loss_summ_val = sess.run((train, loss, loss_summ))
if i % 50 == 0:
# writer.add_summary(summary=loss_value, global_step=i)
writer.add_summary(summary=loss_summ_val, global_step=i)
print(str(i)+" step: "+str(loss_value))
writer.flush()
writer.close()