在训练神经网络时,我们通常用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”下载数据。就可以得到对应的数据文件了。
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")