从tensorflow的summary中提取数据,并进行平滑操作与显示

本文介绍了如何从Tensorboard的summary中提取并分析训练过程数据。首先,通过tensorboard加载summary数据并下载scalar数据,然后使用滑动平均算法对数据进行平滑处理,最后展示平滑后的数据曲线,支持对比多个模型的性能变化。提供的Python函数实现了数据平滑与显示的功能。
摘要由CSDN通过智能技术生成

在训练神经网络时,我们通常用summary记录训练的过程信息,并用tensorboard可视化显示。

在完成训练后,有时我们需要使用保存在summary中的数据进行分析,那么如何从summary中提取需要的数据并分析显示呢?以下分两步来说明。

step1: 用tensorboard加载summary数据,用Chrome浏览器显示并下载需要的scalar数据。

1. 在命令中进入summary文件所在文件夹,并执行

tensorboard --logdir=./

得到tensorboard的可视化网址,在chrome中打开该网址

2. 在tensorboard界面左上方,勾选“show data download links”选项,如下图所示

3.找到对应的scalar数据曲线,点击下方的“run to download”,如下图所示

4: 点击弹出的灰色方框,选择要下载哪个summary的数据(如果同时加载多个summary的话,会有多个选项;如果仅仅加载了一个summary的话,会显示一个“.”号,点击即可)。此时后面的“csv json”变成了蓝色。

5: 点击“csv”或“json”下载数据。就可以得到对应的数据文件了。

2

step2: summary scalar数据的平滑与显示

tensorboard提供了下载接口,可以下载没有经过平滑后的数据,但是,没有经过平滑的数据的可视化效果并不好。因此通常需要先对数据进行平滑然后显示。平滑算法通常使用滑动平均算法。

summary-scalar数据的平滑与显示函数如下。


import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt

# 数据平滑
def summary_scalar_smooth(csv_path, weight=0.85,save=False):
    # 获取文件路径和文件名,用于后面的存储
    csv_dir = "/".join(csv_path.split("/")[:-1])
    csv_name = csv_path.split("/")[-1]

    # 读取损失数据
    data = pd.read_csv(filepath_or_buffer=csv_path, header=0, names=['Step', 'Value'],
                       dtype={'Step': np.int, 'Value': np.float})
    scalar = data['Value'].values

    # 滑动平均平滑
    last = scalar[0]
    smoothed = []
    for point in scalar:
        smoothed_val = last * weight + (1 - weight) * point # 滑动平均平滑
        smoothed.append(smoothed_val)
        last = smoothed_val

    # 把平滑后的数据保存为csv格式
    save_path = os.path.join(csv_dir,"smoothed_"+csv_name)
    smoothed_csv = pd.DataFrame({'Step': data['Step'].values, 'Value': smoothed})
    if save:
        smoothed_csv.to_csv(save_path)

    return smoothed_csv

# 数据显示
def summary_scalar_show(csv_list,csv_label_list,fig_name="",step_range=range(0,80000,10),yscale="log"):
    """
    绘制summary的scalar的曲线,支持对比显示多个曲线,并约束显示区间范围
    :param csv_list: csv文件数据
    :param csv_label_list: csv的标签
    :param step_range: summary的显示区间
    :param yscale: 是否使用对数y轴
    :return:
    """
    plt.figure()
    for csv,label in zip(csv_list,csv_label_list):
        # 提取数据
        steps,scalars = csv['Step'].values,csv['Value'].values

        # 筛选要显示的数据
        show_steps,show_scalars = [],[]
        for step,scalar in zip(steps,scalars):
            if step in step_range:
                show_steps.append(step)
                show_scalars.append(scalar)
        # 绘图
        plt.plot(show_steps,show_scalars,label=label)
    if yscale == "log":
        plt.yscale(yscale)
    plt.legend()
    plt.tight_layout()
    plt.savefig(fig_name)
    plt.show()



if __name__ == '__main__':
    # ped2数据

    temph_0_csv = "temph_loss0.csv"
    temph_10_csv = "temph_loss0.csv"

    temph_0_csv_smoothed = summary_scalar_smooth(temph_0_csv)
    temph_10_csv_smoothed = summary_scalar_smooth(temph_10_csv)

    csv_list = [temph_0_csv_smoothed,temph_10_csv_smoothed]
    csv_label_list = ["model_1", "model_2"]
    step_range = range(0, 80000, 10)

    summary_scalar_show(csv_list, csv_label_list, fig_name="TS-seqUnet-ped2-ts-loss-curve.tif",step_range=range(0, 80000, 10), yscale="log")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值