问题描述
在 TF 中创建自定义标量摘要有几个 SO 答案(这里和这里),但我找不到关于创建自定义 直方图 摘要的任何内容.文档似乎非常缺乏自定义摘要.我有一个 numpy 数组,我想总结一下 - 关于如何做的任何想法?
There are a couple of SO answers on creating a custom scalar summary in TF (here and here), but I can't find anything on creating a custom histogram summary. The documentation seems to be very lacking for custom summaries. I have a numpy array of that I'd like to make a summary of - any ideas on how?
(tf.Summary.Value 有一个我尝试使用的 histo 字段,但它需要一个 tensorflow::HistogramProto;也没有关于该类的文档,所以我不知道如何制作它.我'我尝试在下面创建一个最小的失败示例).
(tf.Summary.Value has a histo field that I tried using, but it requires a tensorflow::HistogramProto; there's no documentation on that class either, so I'm at a loss on how to make it. I've tried creating a minimal failing example below).
import tensorflow as tf
import numpy as np
sess = tf.Session()
means_placeholder = tf.placeholder(tf.float32)
tf.summary.histogram('means', means_placeholder)
summaries = tf.summary.merge_all()
writer = tf.summary.FileWriter('./summaries')
means = np.random.random(10)
writer.add_summary(tf.Summary(value=[tf.Summary.Value(tag='means', histo=means)]))
推荐答案
这段代码有效:
import tensorflow as tf
import numpy as np
def log_histogram(writer, tag, values, step, bins=1000):
# Convert to a numpy array
values = np.array(values)
# 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
# Thus, 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)
writer.flush()
sess = tf.Session()
placeholder = tf.placeholder(tf.float32)
tf.summary.histogram('N(0,1)', placeholder)
summaries = tf.summary.merge_all()
writer = tf.summary.FileWriter('./summaries')
mu, sigma = 0, 0.1 # mean and standard deviation
s = np.random.normal(mu, 1, 10000)
log_histogram(writer, 'N(0,1)', s, 1, bins=100)
来源.
这篇关于创建自定义 Tensorflow 直方图摘要的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!