Tensorboard直方图到matplotlib

时间:2018-01-31 17:19:26

标签: tensorflow tensorboard

我想" 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)的作用,我设法得到类似(相同趋势)的张量板图,但不是完全相同的图。

我可以对此有所了解吗?

由于

4 个答案:

答案 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?

enter image description here

答案 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逻辑绘制该数组。