【问题标题】:tensorboard with numpy array带有 numpy 数组的张量板
【发布时间】:2017-05-12 05:06:10
【问题描述】:

有人可以举例说明如何使用 tensorboard 可视化 numpy 数组值吗?

这里有一个相关的问题,我不太明白。 Tensorboard logging non-tensor (numpy) information (AUC)

例如, 如果我有

for i in range(100):
    foo = np.random.rand(3,2)

如何使用 tensorboard 跟踪 foo 的分布 100 次迭代?有人可以举一个代码示例吗? 谢谢。

【问题讨论】:

    标签: numpy tensorflow tensorboard


    【解决方案1】:

    对于简单值(标量),您可以使用此配方

    summary_writer = tf.train.SummaryWriter(FLAGS.logdir)
    summary = tf.Summary()
    summary.value.add(tag=tagname, simple_value=value)
    summary_writer.add_summary(summary, global_step)
    summary_writer.flush()
    

    就使用数组而言,也许你可以在一个序列中添加6个值,即

    for value in foo:
      summary.value.add(tag=tagname, simple_value=value)
    

    【讨论】:

    • 对于标量,它可以工作。对于一个数组,如果它是高维张量(通常是)for循环会很慢......
    【解决方案2】:

    另一种(最简单的)方法就是使用占位符。首先,您可以为您的 numpy 数组形状制作一个占位符。

    # Some place holders for summary
    summary_reward = tf.placeholder(tf.float32, shape=(), name="reward")
    tf.summary.scalar("reward", summary_reward)
    

    然后,只需调用 session.run 与 feed_dict 合并的摘要。

    # Summary
    summ = tf.summary.merge_all()
    ...
    s = sess.run(summ, feed_dict={summary_reward: reward})
    writer.add_summary(s, i)
    

    【讨论】:

      【解决方案3】:

      如果您在@ 987654324 this package 987654324 @它会变得直截了当,因为它可以得到:

      import numpy as np
      from tensorboardX import SummaryWriter
      writer = SummaryWriter()
      for i in range(50):
          writer.add_histogram("moving_gauss", np.random.normal(i, i, 1000), i, bins="auto")
      writer.close()
      

      将在runs目录中生成相应的直方图数据:

      【讨论】:

      • 链接损坏,重命名为987654327 @至tensorboardX span>
      • 保存到直方图是有损的。直方图将保持每个桶的计数,但不是精确值。
      • 正确,它们似乎将其硬于30个桶。在某些时候,我诉诸于包括Matplotlib图作为图像 span>
      【解决方案4】:

      找到解决方法,创建变量并将numpy数组的值分配给变量,使用tensorboard跟踪变量

      mysummary_writer = tf.train.SummaryWriter("./tmp/test/")
      a = tf.Variable(tf.zeros([3,2]), name="a")
      sum1 = tf.histogram_summary("nparray1", a)
      summary_op = tf.merge_all_summaries()
      sess = tf.Session()
      
      sess.run(tf.initialize_all_variables())
      
      for ii in range(10):
          foo = np.random.rand(3, 2)
          assign_op = a.assign(foo)
          summary, _ = sess.run([summary_op, assign_op])
          mysummary_writer.add_summary(tf.Summary.FromString(summary), global_step=ii)
          mysummary_writer.flush()
      

      【讨论】:

      • TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“变量”
      • 当时是TF 0.10,现在界面可能不一样了。
      【解决方案5】:
      sess = tf.Session()
      writer = tf.summary.FileWriter('tensorboard_test')
      var = tf.Variable(0.0,trainable=False,name='loss')
      sess.run(var.initializer)
      summary_op = tf.summary.scalar('scalar1',var)
      
      for value in array:    
          sess.run(var.assign(value))
          summary = sess.run(summary_op)
          writer.add_summary(summary,i)
      

      它可以工作,但速度很慢。

      【讨论】:

        【解决方案6】:

        你可以定义这样的函数(取自 gyglim 的要点):

        def add_histogram(writer, tag, values, step, bins=1000):
            """
            Logs the histogram of a list/vector of values.
            From: https://gist.github.com/gyglim/1f8dfb1b5c82627ae3efcfbbadb9f514
            """
        
            # Create histogram using numpy
            counts, bin_edges = np.histogram(values, bins=bins)
        
            # Fill fields of histogram proto
            hist = tf.HistogramProto()
            hist.min = float(np.min(values))
            hist.max = float(np.max(values))
            hist.num = int(np.prod(values.shape))
            hist.sum = float(np.sum(values))
            hist.sum_squares = float(np.sum(values ** 2))
        
            # Requires equal number as bins, where the first goes from -DBL_MAX to bin_edges[1]
            # See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/summary.proto#L30
            # Therefore we drop the start of the first bin
            bin_edges = bin_edges[1:]
        
            # Add bin edges and counts
            for edge in bin_edges:
                hist.bucket_limit.append(edge)
            for c in counts:
                hist.bucket.append(c)
        
            # Create and write Summary
            summary = tf.Summary(value=[tf.Summary.Value(tag=tag, histo=hist)])
            writer.add_summary(summary, step)
        

        然后像这样添加到摘要编写器中:

        add_histogram(summary_writer, "Histogram_Name", your_numpy_array, step)
        

        【讨论】:

          猜你喜欢
          • 2020-04-23
          • 2019-02-24
          • 2018-09-20
          • 1970-01-01
          • 1970-01-01
          • 2018-01-15
          • 2021-10-17
          • 2018-11-28
          • 2012-04-26
          相关资源
          最近更新 更多