Не удается записать скалярную сводку Tensorflow в журнал событий - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь научиться самостоятельно писать код тензорного потока, но я застрял в этой очень простой проблеме: Во время обучения я не могу записать скалярную сводку в файл событий, который необходим для 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'

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Скалярная сводка или любые сводки в целом собираются сводными операциями . Еще один способ подумать об этом - заключить элемент, который вы хотите обобщить, в сводную операцию, а не записывать элемент напрямую. Эта упаковка создаст «Тензор, содержащий сводный протобуф» , который является приемлемым форматом 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()
0 голосов
/ 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()
...