【问题标题】:Can't write Tensorflow scalar summary to event log无法将 TensorFlow 标量摘要写入事件日志
【发布时间】:2018-05-05 08:44:49
【问题描述】:

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

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

【问题讨论】:

    标签: tensorflow tensorboard filewriter summary scalar


    【解决方案1】:

    summary operations 收集标量摘要或任何一般摘要。另一种考虑这一点的方法是通过汇总操作将要汇总的元素包装起来,而不是直接记录该元素。这种包装将创建"a Tensor containsing a Summary protobuf",即the acceptable format of 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()
    

    【讨论】:

    • 谢谢,我想我也试过这个,但是顺序错误。现在我认为解决方案是这个答案和上一个关于订单的答案的组合。它的作用就像魅力
    • @ptamas90 很高兴你成功了。我刚刚用完整的代码更新了我的答案,以供将来解决此问题的其他人使用。
    【解决方案2】:

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

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

    【讨论】:

    • 我尝试使用 with 语句在您建议的训练周期之前使用这种方式创建会话,但它返回与上述相同的错误:(
    • @ptamas90 正确的顺序是最好的和推荐的做法,尽管这里不需要。也不是这里错误的真正原因。希望我下面的回答对您有所帮助。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2017-02-24
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多