【问题标题】:How to display the average of multiple runs on tensorboard如何在张量板上显示多次运行的平均值
【发布时间】:2017-08-21 10:43:48
【问题描述】:

有没有办法在 tensorflow 上显示多个不同运行的平均值? 我只能在同一张图上看到它们(通过发送不同运行的路径),但我想在图上看到它们的平均值

【问题讨论】:

    标签: tensorflow tensorboard


    【解决方案1】:

    我创建了TensorBoard Reducer 来使用 PyTorch 执行此操作。无需安装 TensorFlow。

    pip install tensorboard-reducer
    tb-reducer -i 'glob_pattern/of_dirs_to_reduce*' -o output_dir -r mean,std,min,max
    
    • -i/--indirs-glob(必需):要减少的运行目录的全局模式。
    • -o/--outdir(必需):保存新事件文件的目录名称。
    • -r/--reduce-ops(可选,默认值:mean):逗号分隔的 numpy 缩减操作名称(meanstdminmax,...)。每个归约都写入一个单独的outdir,并以它的操作名称为后缀,例如如果outdir='my-new-run,平均减少将被写入my-new-run-mean

    聚合结果可以作为新的 TensorBoard 事件文件或 CSV 保存到磁盘。

    【讨论】:

      【解决方案2】:

      由于仍然没有内置功能来执行此操作,我为此发布了一个工具:

      https://github.com/Spenhouet/tensorboard-aggregator

      这个工具可以聚合多个张量板运行的最大值、最小值、平均值、中值和标准差。聚合要么保存在新的张量板摘要中,要么保存为 .csv 文件。

      【讨论】:

        【解决方案3】:

        正如@dga 提到的,这还没有实现。这是一些使用EventAccumulator 组合标量张量流摘要值的代码。这可以扩展以适应其他摘要类型。

        import os
        from collections import defaultdict
        
        import numpy as np
        import tensorflow as tf
        from tensorboard.backend.event_processing.event_accumulator import EventAccumulator
        
        
        def tabulate_events(dpath):
        
            summary_iterators = [EventAccumulator(os.path.join(dpath, dname)).Reload() for dname in os.listdir(dpath)]
        
            tags = summary_iterators[0].Tags()['scalars']
        
            for it in summary_iterators:
                assert it.Tags()['scalars'] == tags
        
            out = defaultdict(list)
        
            for tag in tags:
                for events in zip(*[acc.Scalars(tag) for acc in summary_iterators]):
                    assert len(set(e.step for e in events)) == 1
        
                    out[tag].append([e.value for e in events])
        
            return out
        
        
        def write_combined_events(dpath, d_combined, dname='combined'):
        
            fpath = os.path.join(dpath, dname)
            writer = tf.summary.FileWriter(fpath)
        
            tags, values = zip(*d_combined.items())
        
            timestep_mean = np.array(values).mean(axis=-1)
        
            for tag, means in zip(tags, timestep_mean):
                for i, mean in enumerate(means):
                    summary = tf.Summary(value=[tf.Summary.Value(tag=tag, simple_value=mean)])
                    writer.add_summary(summary, global_step=i)
        
                writer.flush()
        
        dpath = '/path/to/root/directory'
        
        d = tabulate_events(dpath)
        
        write_combined_events(dpath, d)
        

        此解决方案假定目录结构如下:

        dpath
        ├── 1
        │   └── events.out.tfevents.1518552132.Alexs-MacBook-Pro-2.local
        ├── 11
        │   └── events.out.tfevents.1518552180.Alexs-MacBook-Pro-2.local
        ├── 21
        │   └── events.out.tfevents.1518552224.Alexs-MacBook-Pro-2.local
        ├── 31
        │   └── events.out.tfevents.1518552264.Alexs-MacBook-Pro-2.local
        └── 41
            └── events.out.tfevents.1518552304.Alexs-MacBook-Pro-2.local
        

        【讨论】:

        • 这个实现有一个问题。如果迭代次数多于 tensorflow 似乎会减少一些步骤,因此在此处为 global_step 设置“i”是不正确的,并且会导致曲线不等。 global_step 需要为每个值设置正确的步数。
        【解决方案4】:

        请关注issue 376 以查看这方面的进展。这是一个活跃的功能请求,在上个月取得了一些进展,但截至目前,还没有办法做你想做的事。然而。

        【讨论】:

          猜你喜欢
          • 2019-10-10
          • 2018-02-26
          • 2021-09-17
          • 1970-01-01
          • 1970-01-01
          • 2016-06-13
          • 1970-01-01
          • 1970-01-01
          • 2021-06-25
          相关资源
          最近更新 更多