CSVLogger: deduplicate epochs on resume (replace, not append duplicates)
On resume, the same epoch may be re-run. Now log_train/log_val remove existing entries for the same epoch before appending, preventing duplicate rows in train.csv/val.csv. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -288,14 +288,18 @@ class CSVLogger:
|
||||
)
|
||||
|
||||
def log_train(self, epoch: int, metrics: dict, lr: float, elapsed: float) -> None:
|
||||
"""Log epoch-level train averages."""
|
||||
"""Log epoch-level train averages. Replaces existing entry for same epoch on resume."""
|
||||
row = {"epoch": epoch, "lr": lr, "elapsed_s": round(elapsed, 1), **metrics}
|
||||
# Remove previous entry for this epoch (resume may re-run it).
|
||||
self.train_rows = [r for r in self.train_rows if r.get("epoch") != epoch]
|
||||
self.train_rows.append(row)
|
||||
pd.DataFrame(self.train_rows).to_csv(self.log_dir / "train.csv", index=False)
|
||||
pd.DataFrame([row]).to_csv(self.log_dir / f"epoch_{epoch:03d}_train.csv", index=False)
|
||||
|
||||
def log_val(self, epoch: int, metrics: dict) -> None:
|
||||
"""Log val metrics. Replaces existing entry for same epoch on resume."""
|
||||
row = {"epoch": epoch, **metrics}
|
||||
self.val_rows = [r for r in self.val_rows if r.get("epoch") != epoch]
|
||||
self.val_rows.append(row)
|
||||
pd.DataFrame(self.val_rows).to_csv(self.log_dir / "val.csv", index=False)
|
||||
pd.DataFrame([row]).to_csv(self.log_dir / f"epoch_{epoch:03d}_val.csv", index=False)
|
||||
|
||||
Reference in New Issue
Block a user