我想" dump"张量板直方图并通过matplotlib绘制它们。我会有更多科学论文吸引人的情节。
我设法使用tf.train.summary_iterator
破解了摘要文件并转储了我想要转储的直方图(tensorflow.core.framework.summary_pb2.HistogramProto
对象)。
通过这样做并实现java脚本代码对数据(https://github.com/tensorflow/tensorboard/blob/c2fe054231fe77f3a5b05dbc519f713d2e738d1c/tensorboard/plugins/histogram/tf_histogram_dashboard/histogramCore.ts#L104)的作用,我设法得到类似(相同趋势)的张量板图,但不是完全相同的图。
我可以对此有所了解吗?
由于
答案 0 :(得分:2)
最好的解决方案是加载所有事件并重建所有直方图(作为@khuesmann的答案),但不使用EventAccumulator
而是使用EventFileLoader
。这将为您提供每个墙面时间和步长的直方图,就像Tensorboard图一样。可以扩展它以按时间步长和墙上时间返回动作列表。
别忘了检查您将使用哪个标签。
from tensorboard.backend.event_processing.event_file_loader import EventFileLoader
# Just in case, PATH_OF_FILE is the path of the file, not the folder
loader = EventFileLoader(PATH_Of_FILE)
# Where to store values
wtimes,steps,actions = [],[],[]
for event in loader.Load():
wtime = event.wall_time
step = event.step
if len(event.summary.value) > 0:
summary = event.summary.value[0]
if summary.tag == HISTOGRAM_TAG:
wtimes += [wtime]*int(summary.histo.num)
steps += [step] *int(summary.histo.num)
for num,val in zip(summary.histo.bucket,summary.histo.bucket_limit):
actions += [val] *int(num)
请记住,张量流将动作近似并将动作视为连续变量,因此,即使您具有离散动作(例如0,1,3),最终动作也将变为0.2、0.4、0.9、1.4 ...在那种情况下,值会做到这一点。
答案 1 :(得分:1)
一个好的解决方案是@khuesmann的解决方案,但这只允许您检索累积的直方图,而不是每步的直方图-这实际上是在张量板上显示的。
如果您想要分布图,到目前为止,我所了解的是Tensorboard通常会压缩直方图以减少用于存储数据的内存-想象一下存储2百万个直方图超过400万步,内存可以快速增加。通过执行以下操作可以访问这些压缩直方图:
from tensorboard.backend.event_processing.event_accumulator import EventAccumulator
n2n = EventAccumulator(PATH)
n2n.Reload()
# Check the tags under histograms and choose the one you want
n2n.Tags()
# This will give you the list used by tensorboard
# of the compress histograms by timestep and wall time
n2n.CompressedHistograms(HISTOGRAM_TAG)
唯一的问题是将直方图压缩到五个百分位数(在Basic points中分别为0、668、1587、3085、5000、6915、8413、9332、10000),对应于(-Inf,- 1.5,-1,-0.5、0、0.5、1、1.5,Inf)。检查代码here。
我没有读太多,但是重建张量板显示的时间直方图并不难。如果我找到解决方法,请在此处发布。
答案 2 :(得分:0)
为什么不从您想要的张量图中下载原始数据(如CSV或JSON),导入和使用matplotlib?请参阅:Can I export a tensorflow summary to CSV?
答案 3 :(得分:0)
为了使用matplotlib绘制张量板直方图,我正在执行以下操作:
a {
position: relative;
text-decoration:none;
padding-left: 20px;
}
a:hover {
text-decoration:underline;
}
a i {
position: absolute;
left: 0;
}
event_acc = EventAccumulator(path, size_guidance={
'histograms': STEP_COUNT,
})
event_acc.Reload()
tags = event_acc.Tags()
result = {}
for hist in tags['histograms']:
histograms = event_acc.Histograms(hist)
result[hist] = np.array([np.repeat(np.array(h.histogram_value.bucket_limit), np.array(h.histogram_value.bucket).astype(np.int)) for h in histograms])
return result
给我值,h.histogram_value.bucket_limit
给我值。因此,当我相应地重复这些值(h.histogram_value.bucket
)时,我得到了大量的预期大小。现在可以使用默认的matplotlib逻辑绘制该数组。