无法将 Tensorflow 标量摘要写入事件日志

Can't write Tensorflow scalar summary to event log

我正在尝试学习如何自己编写 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'

请帮助我更正我的代码,因为我已经阅读了很多关于该主题的问题,但从未遇到过这个具体问题。 谢谢

你应该完全创建你的图(损失和优化器是静态图的一部分),然后你应该创建会话,最后,你可以创建一个编写器。 保持正确的顺序,然后它会起作用。

 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()

summary operations. Another way to think about this is to wrap the element you want to summary by summary op rather than record the element directly. This wrapping will create "a Tensor containsing a Summary protobuf", which is the acceptable format of add_summary收集标量摘要或任何一般摘要。

详细而言,您将通过以下方式创建摘要操作:

loss_summ = tf.summary.scalar('loss', loss)

然后 运行 这个操作得到 tensor/value:

_, loss_value, loss_summ_val = sess.run((train, loss, loss_summ))

最后,将返回的 tensor/value 而不是您实际的 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()