打开json文件,读取里边的每一行数据,每一行数据是一个字典,使用matplotlib画图

这段代码的目的是读取 JSON 文件,提取关键信息,然后使用 Matplotlib 绘制四个子图,分别显示不同的指标随着 iter 变化的情况。这种图形化分析有助于直观地了解模型的性能。

画图结果如下:

json文件格式如下:下面只粘贴出来前6行数据

{"mode": "train", "epoch": 1, "iter": 50, "lr": 0.0, "memory": 19479, "data_time": 0.00483, "decode.loss_ce": 4.60138, "decode.acc_seg": 0.23948, "aux_identity.loss_ce": 4.31477, "aux_identity.acc_seg": 0.14401, "loss": 8.91615, "time": 0.65278}
{"mode": "train", "epoch": 1, "iter": 100, "lr": 1e-05, "memory": 19479, "data_time": 0.00338, "decode.loss_ce": 4.43467, "decode.acc_seg": 0.62701, "aux_identity.loss_ce": 3.0979, "aux_identity.acc_seg": 0.85732, "loss": 7.53257, "time": 0.60686}
{"mode": "train", "epoch": 1, "iter": 150, "lr": 1e-05, "memory": 19479, "data_time": 0.00342, "decode.loss_ce": 4.10557, "decode.acc_seg": 2.23878, "aux_identity.loss_ce": 2.13645, "aux_identity.acc_seg": 7.20875, "loss": 6.24202, "time": 0.60892}
{"mode": "train", "epoch": 1, "iter": 200, "lr": 1e-05, "memory": 19479, "data_time": 0.00344, "decode.loss_ce": 3.77826, "decode.acc_seg": 8.71241, "aux_identity.loss_ce": 1.75049, "aux_identity.acc_seg": 13.31084, "loss": 5.52875, "time": 0.60606}
{"mode": "train", "epoch": 1, "iter": 250, "lr": 2e-05, "memory": 19479, "data_time": 0.00344, "decode.loss_ce": 3.17202, "decode.acc_seg": 19.45514, "aux_identity.loss_ce": 1.451, "aux_identity.acc_seg": 16.99208, "loss": 4.62302, "time": 0.59555}
{"mode": "train", "epoch": 1, "iter": 300, "lr": 2e-05, "memory": 19479, "data_time": 0.00348, "decode.loss_ce": 2.56726, "decode.acc_seg": 29.93745, "aux_identity.loss_ce": 1.16545, "aux_identity.acc_seg": 23.99233, "loss": 3.73271, "time": 0.59519}

具体绘制代码如下:

import json
import matplotlib.pyplot as plt
import os

print(os.path.abspath(__file__))#打印当前路径

# 存储读取的数据,创建一个字典 data 用于存储 JSON 文件中的数据,每个键对应一个需要提取的数据列。
data = {"mode": [], "epoch": [], "iter": [], "lr": [], "memory": [],
        "data_time": [], "decode.loss_ce": [], "decode.acc_seg": [],
        "aux_identity.loss_ce": [], "aux_identity.acc_seg": [],
        "loss": [], "time": []}


# 读取JSON文件
json_file_path = '/home/lsj/code/model/ZegCLIP/draw/20240120_151005.log.json'  # 请替换成实际的JSON文件路径
print("json_file_path:",json_file_path)

with open(json_file_path, 'r') as json_file:
    for line in json_file:#遍历 JSON 文件的每一行。
        json_data = json.loads(line)#解析 JSON 行并将其转换为 Python 字典。
        if json_data["mode"]=="val":
            continue

        # 提取所需的键值
        for key in data.keys():#遍历 data 字典的键,将每个键对应的值添加到 data 字典中。
            # print("key:",key)
            # print("data[key]:",data[key])
            # print("json_data[key]:",json_data[key])
            data[key].append(json_data[key])

# 绘制图形
fig, axs = plt.subplots(2, 2, figsize=(12, 8))#创建一个包含 2x2 子图的 Matplotlib 图形。

#在第一个子图中绘制 decode_loss_ace 随着 iter 的变化图,并设置标签。
axs[0, 0].plot(data['iter'], data['decode.loss_ce'], label='decode.loss_ce')
axs[0, 0].set_title('Decode Loss (ACE)')
axs[0, 0].set_xlabel('iter')
axs[0, 0].set_ylabel('Loss')
axs[0, 0].legend()

#在第一个子图中绘制 decode_acc_seg 随着 iter 的变化图,并设置标签。
axs[0, 1].plot(data['iter'], data['decode.acc_seg'], label='decode.acc_seg')
axs[0, 1].set_title('Decode Accuracy (Seg)')
axs[0, 1].set_xlabel('iter')
axs[0, 1].set_ylabel('Accuracy')
axs[0, 1].legend()

#在第一个子图中绘制 aux_identity_loss_ce 随着 iter 的变化图,并设置标签。
axs[1, 0].plot(data['iter'], data['aux_identity.loss_ce'], label='aux_identity.loss_ce')
axs[1, 0].set_title('Aux Identity Loss (CE)')
axs[1, 0].set_xlabel('iter')
axs[1, 0].set_ylabel('Loss')
axs[1, 0].legend()

#在第一个子图中绘制 aux_identity.acc_seg 随着 iter 的变化图,并设置标签。
axs[1, 1].plot(data['iter'], data['aux_identity.acc_seg'], label='aux_identity.acc_seg')
axs[1, 1].set_title('Aux Identity Accuracy (Seg)')
#axs[1, 1].set_xlabel('Epoch')
axs[1, 1].set_xlabel('iter')
axs[1, 1].set_ylabel('Accuracy')
axs[1, 1].legend()

plt.tight_layout()#调整子图的布局,以确保它们不会重叠
plt.show()#展示 Matplotlib 图形