diff --git a/src/tias_judge_model/training/cross_validation.py b/src/tias_judge_model/training/cross_validation.py index aa80e85..e03dc6c 100644 --- a/src/tias_judge_model/training/cross_validation.py +++ b/src/tias_judge_model/training/cross_validation.py @@ -15,7 +15,7 @@ import logging import time -from collections.abc import Sequence +from collections.abc import Mapping, Sequence from dataclasses import dataclass, field from pathlib import Path @@ -200,9 +200,9 @@ for name, counts in group_counts.items(): logger.info("%s: %s のグループ別枚数 %s", prefix, name, counts) - train_idx = np.array([position[r.image_path] for r in train_records], dtype=np.int64) - val_idx = np.array([position[r.image_path] for r in val_records], dtype=np.int64) - held_idx = np.array([position[r.image_path] for r in held_records], dtype=np.int64) + train_idx = _positions(train_records, position) + val_idx = _positions(val_records, position) + held_idx = _positions(held_records, position) seed_everything(seed) model = create_model(config.model.name, pretrained=config.model.pretrained).to(device) @@ -270,6 +270,11 @@ return result +def _positions(records: Sequence[ManifestRecord], position: Mapping[str, int]) -> np.ndarray: + # `(N,)` の int64.各レコードの manifest 上の位置(0 始まり). + return np.array([position[r.image_path] for r in records], dtype=np.int64) + + def _make_loader( images: np.ndarray, labels: np.ndarray, diff --git a/src/tias_judge_model/training/loop.py b/src/tias_judge_model/training/loop.py index d67f706..0074708 100644 --- a/src/tias_judge_model/training/loop.py +++ b/src/tias_judge_model/training/loop.py @@ -13,7 +13,6 @@ import time from collections.abc import Callable from dataclasses import dataclass, field -from typing import Any import numpy as np import torch @@ -66,11 +65,6 @@ history: list[EpochRecord] = field(default_factory=list) seconds: float = 0.0 - @property - def epochs_run(self) -> int: - """実際に回したエポック数.""" - return len(self.history) - def seed_everything(seed: int) -> None: """`random`・`numpy`・`torch`(CUDA を含む)の乱数 seed を固定する. @@ -261,19 +255,3 @@ if not logits: return np.zeros((0, 0), dtype=np.float32), np.zeros((0,), dtype=np.int64) return np.concatenate(logits), np.concatenate(labels) - - -def summarize_history(history: list[EpochRecord]) -> dict[str, Any]: - """エポックの記録から所要時間の要約(エポック数・1 エポックあたり平均秒数)を返す. - - Args: - history: エポックごとの記録. - - Returns: - `{"epochs_run", "mean_epoch_seconds"}`. - """ - seconds = [h.seconds for h in history] - return { - "epochs_run": len(history), - "mean_epoch_seconds": float(np.mean(seconds)) if seconds else None, - }