File size: 2,486 Bytes
e4ac40d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import json
import os
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def load_metrics(path: str) -> dict[str, list]:
    data: dict[str, list] = {
        "epoch": [],
        "train_loss": [],
        "train_accuracy": [],
        "train_precision": [],
        "train_recall": [],
        "train_f1": [],
        "train_f1_w": [],
        "val_loss": [],
        "val_accuracy": [],
        "val_precision": [],
        "val_recall": [],
        "val_f1": [],
        "val_f1_w": []
    }

    files = sorted(
        [fn for fn in os.listdir(path) if fn.lower().endswith(".json")],
        key=lambda x: int(x.split("_")[1].split(".")[0])
    )

    train_keys = ["loss", "accuracy", "precision", "recall", "f1", "f1_w"]
    val_keys = ["loss", "accuracy", "precision", "recall", "f1", "f1_w"]

    for file in files:
        with open(os.path.join(path, file), "r", encoding="utf-8") as f:
            content = json.load(f)

        data["epoch"].append(content.get("epoch"))

        train = content.get("train", {}) or {}
        val = content.get("val", {}) or {}

        for k in train_keys:
            data[f"train_{k}"].append(train.get(k))
        for k in val_keys:
            data[f"val_{k}"].append(val.get(k))

    return data

def plot(title: str, name: str, values: dict, palette: dict) -> None:
    df = pd.DataFrame({
        "epoch": values["epoch"],
        "train": values["train"],
        "val": values["val"]
    })

    df_long = df.melt(
        id_vars="epoch",
        var_name="type",
        value_name="value"
    )

    sns.set_theme(style="darkgrid", context="paper")

    plt.figure(figsize=(6, 5))
    sns.lineplot(
        data=df_long,
        x="epoch",
        y="value",
        hue="type",
        linewidth=2,
        palette=palette,
        errorbar=None
    )

    plt.xlabel("Epoch")
    plt.ylabel(name)
    plt.title(title)

    plt.tight_layout()
    plt.show()



if __name__ == '__main__':
    metrics = load_metrics(r"C:\Users\Michał\PycharmProjects\SUML\data\4_weights\final\metrics")
    print(metrics.keys())

    m = {
        "epoch": metrics["epoch"],
        "train": metrics["train_accuracy"],
        "val": metrics["val_accuracy"]
    }

    palette = {
        "train": "#264653",  # ciemny granat
        "val": "#e76f51",  # ciepły czerwono-pomarańczowy
    }

    plot(title="Train vs. Val Loss",
         name="Loss",
         values=m,
         palette=palette)