Не удается записать скалярную сводку Tensorflow в журнал событий

Я пытаюсь научиться писать код тензорного потока самостоятельно, но я застрял с этой очень простой проблемой: во время обучения я не могу записать скалярную сводку в файл событий, который необходим для Tensorboard. Вот мой код:

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)
  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))
  if i % 50 == 0:
    writer.add_summary(summary=loss_value, global_step=i)
    print(str(i)+" step: "+str(loss_value))
    writer.flush()
writer.close()

ошибка, которую я получаю:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-732ee0fb1e1c> in <module>()
     27   _, loss_value = sess.run((train, loss))
     28   if i % 50 == 0:
---> 29     writer.add_summary(summary=loss_value, global_step=i)
     30     print(str(i)+" step: "+str(loss_value))
     31     writer.flush()

/usr/local/lib/python3.6/dist- 
packages/tensorflow/python/summary/writer/writer.py in add_summary(self, 
 summary, global_step)
    123     # to save space - we just store the metadata on the first value 
with a
    124     # specific tag.
--> 125     for value in summary.value:
    126       if not value.metadata:
    127         continue

AttributeError: 'numpy.float32' object has no attribute 'value'

Пожалуйста, помогите мне исправить мой код, потому что я прочитал много вопросов по этой теме, но никогда не сталкивался с этой конкретной проблемой. Спасибо


person ptamas90    schedule 05.05.2018    source источник


Ответы (2)


Скалярная сводка или любые сводки в целом собираются с помощью сводных операций. Другой способ подумать об этом - обернуть элемент, который вы хотите обобщить, с помощью summary op, а не записывать элемент напрямую. Эта упаковка создаст «тензор, содержащий сводный protobuf», который является приемлемым форматом 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()
person Y. Luo    schedule 05.05.2018
comment
спасибо, я думаю, я тоже пробовал это, но в неправильном порядке. прямо сейчас я думаю, что решение было комбинацией этого ответа и предыдущего ответа о заказе. это работает как шарм - person ptamas90; 05.05.2018
comment
@ ptamas90 Рад, что у вас все получилось. Я только что обновил свой ответ полным кодом для тех, кто в будущем задаст этот вопрос. - person Y. Luo; 06.05.2018

Вы должны полностью создать свой график (потери и оптимизатор являются частью статического графика), затем вы должны создать сеанс и, наконец, вы можете создать писатель. Соблюдайте правильный порядок, тогда все заработает.

 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)
 with tf.name_scope("TRAIN"):
 loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred)
 optimizer = tf.train.GradientDescentOptimizer(0.01)
 train = optimizer.minimize(loss)
 init = tf.global_variables_initializer()
 with tf.Session() as sess:
      writer = tf.summary.FileWriter(WORKDIR + "/tmp/5", graph=sess.graph)
      sess.run(init)
      for i in range(1000):
         _, loss_value = sess.run((train, loss))
         if i % 50 == 0:
         writer.add_summary(summary=loss_value, global_step=i)
         print(str(i)+" step: "+str(loss_value))
         writer.flush()
       writer.close()
person nairouz mrabah    schedule 05.05.2018
comment
Я пробовал этот способ, используя оператор with для создания сеанса прямо перед циклом обучения, как вы предложили, но он возвращает ту же ошибку, что и выше :( - person ptamas90; 05.05.2018
comment
@ ptamas90 Правильный порядок - лучший и рекомендуемый метод, хотя здесь он и не требуется. И это не настоящая причина ошибки. Надеюсь, мой ответ ниже поможет. - person Y. Luo; 05.05.2018