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)
|