diff --git a/configs/lr1e-3/cv_effb0_with_mild_lr1e-3.yaml b/configs/lr1e-3/cv_effb0_with_mild_lr1e-3.yaml new file mode 100644 index 0000000..5687f4b --- /dev/null +++ b/configs/lr1e-3/cv_effb0_with_mild_lr1e-3.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり込み): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(EfficientNet-B0.モデル名以外は cv_with_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/cv_effb0_with_mild.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, mild, normal] + +split: + seed: 42 + n_folds: 5 + +model: + name: efficientnet_b0 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_effb0_with_mild_lr1e-3_s43.yaml b/configs/lr1e-3/cv_effb0_with_mild_lr1e-3_s43.yaml new file mode 100644 index 0000000..b521ce5 --- /dev/null +++ b/configs/lr1e-3/cv_effb0_with_mild_lr1e-3_s43.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり込み): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(EfficientNet-B0.モデル名以外は cv_with_mild.yaml と同一).分割 seed 43 の繰り返し(seed 以外は configs/cv_effb0_with_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_effb0_with_mild_s43.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, mild, normal] + +split: + seed: 43 + n_folds: 5 + +model: + name: efficientnet_b0 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_effb0_with_mild_lr1e-3_s44.yaml b/configs/lr1e-3/cv_effb0_with_mild_lr1e-3_s44.yaml new file mode 100644 index 0000000..8719852 --- /dev/null +++ b/configs/lr1e-3/cv_effb0_with_mild_lr1e-3_s44.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり込み): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(EfficientNet-B0.モデル名以外は cv_with_mild.yaml と同一).分割 seed 44 の繰り返し(seed 以外は configs/cv_effb0_with_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_effb0_with_mild_s44.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, mild, normal] + +split: + seed: 44 + n_folds: 5 + +model: + name: efficientnet_b0 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_effb0_without_mild_lr1e-3.yaml b/configs/lr1e-3/cv_effb0_without_mild_lr1e-3.yaml new file mode 100644 index 0000000..850c69f --- /dev/null +++ b/configs/lr1e-3/cv_effb0_without_mild_lr1e-3.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり除外.held_out は全程度で評価する): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(EfficientNet-B0.モデル名以外は cv_without_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/cv_effb0_without_mild.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, normal] + +split: + seed: 42 + n_folds: 5 + +model: + name: efficientnet_b0 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_effb0_without_mild_lr1e-3_s43.yaml b/configs/lr1e-3/cv_effb0_without_mild_lr1e-3_s43.yaml new file mode 100644 index 0000000..2b56ad2 --- /dev/null +++ b/configs/lr1e-3/cv_effb0_without_mild_lr1e-3_s43.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり除外.held_out は全程度で評価する): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(EfficientNet-B0.モデル名以外は cv_without_mild.yaml と同一).分割 seed 43 の繰り返し(seed 以外は configs/cv_effb0_without_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_effb0_without_mild_s43.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, normal] + +split: + seed: 43 + n_folds: 5 + +model: + name: efficientnet_b0 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_effb0_without_mild_lr1e-3_s44.yaml b/configs/lr1e-3/cv_effb0_without_mild_lr1e-3_s44.yaml new file mode 100644 index 0000000..c84ca4e --- /dev/null +++ b/configs/lr1e-3/cv_effb0_without_mild_lr1e-3_s44.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり除外.held_out は全程度で評価する): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(EfficientNet-B0.モデル名以外は cv_without_mild.yaml と同一).分割 seed 44 の繰り返し(seed 以外は configs/cv_effb0_without_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_effb0_without_mild_s44.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, normal] + +split: + seed: 44 + n_folds: 5 + +model: + name: efficientnet_b0 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3.yaml b/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3.yaml new file mode 100644 index 0000000..5b2183f --- /dev/null +++ b/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり込み): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(ResNet-50.モデル名以外は cv_with_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/cv_resnet50_with_mild.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, mild, normal] + +split: + seed: 42 + n_folds: 5 + +model: + name: resnet50 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3_s43.yaml b/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3_s43.yaml new file mode 100644 index 0000000..e514824 --- /dev/null +++ b/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3_s43.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり込み): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(ResNet-50.モデル名以外は cv_with_mild.yaml と同一).分割 seed 43 の繰り返し(seed 以外は configs/cv_resnet50_with_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_resnet50_with_mild_s43.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, mild, normal] + +split: + seed: 43 + n_folds: 5 + +model: + name: resnet50 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3_s44.yaml b/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3_s44.yaml new file mode 100644 index 0000000..c15b77d --- /dev/null +++ b/configs/lr1e-3/cv_resnet50_with_mild_lr1e-3_s44.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり込み): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(ResNet-50.モデル名以外は cv_with_mild.yaml と同一).分割 seed 44 の繰り返し(seed 以外は configs/cv_resnet50_with_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_resnet50_with_mild_s44.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, mild, normal] + +split: + seed: 44 + n_folds: 5 + +model: + name: resnet50 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml b/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml new file mode 100644 index 0000000..3be1c16 --- /dev/null +++ b/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり除外.held_out は全程度で評価する): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(ResNet-50.モデル名以外は cv_without_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/cv_resnet50_without_mild.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, normal] + +split: + seed: 42 + n_folds: 5 + +model: + name: resnet50 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3_s43.yaml b/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3_s43.yaml new file mode 100644 index 0000000..5a59352 --- /dev/null +++ b/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3_s43.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり除外.held_out は全程度で評価する): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(ResNet-50.モデル名以外は cv_without_mild.yaml と同一).分割 seed 43 の繰り返し(seed 以外は configs/cv_resnet50_without_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_resnet50_without_mild_s43.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, normal] + +split: + seed: 43 + n_folds: 5 + +model: + name: resnet50 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3_s44.yaml b/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3_s44.yaml new file mode 100644 index 0000000..1b5584c --- /dev/null +++ b/configs/lr1e-3/cv_resnet50_without_mild_lr1e-3_s44.yaml @@ -0,0 +1,27 @@ +# 5-fold 交差検証(ややあり除外.held_out は全程度で評価する): 計算サーバ上の実データで学習・評価する(SPEC_02「交差検証の実行」).モデル比較用(ResNet-50.モデル名以外は cv_without_mild.yaml と同一).分割 seed 44 の繰り返し(seed 以外は configs/cv_resnet50_without_mild.yaml と同一).学習率 1e-3 の再実験(lr 以外は configs/repeat/cv_resnet50_without_mild_s44.yaml と同一.lr 1e-4 では学習不足だったため) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + severities: [strong, normal] + +split: + seed: 44 + n_folds: 5 + +model: + name: resnet50 + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" index 3c8c94e..d1d052d 100644 --- "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -2,7 +2,6 @@ 日常の開発で使うコマンドの一覧.**コマンドを推測せず必ず本ファイルを参照する**(新しく確定・変更された時は本ファイルに反映する). -※ 学習・評価のコマンドは未実装のため本ファイルには未記載(実装時に追記する). ※ Git Bash ではログの日本語が文字化けする.先頭に `PYTHONIOENCODING=utf-8` を付けると正しく表示される. ## 環境 (Environment) @@ -61,6 +60,38 @@ - **ジョブの実行中に同じサーバへ push しない**(上書き展開なので,実行中のジョブが新旧のコードを混ぜて読むおそれがある.実行中なら警告が出る) - 各サブコマンドの詳細は `uv run tias-remote <サブコマンド> --help` +## 学習・交差検証 (Training) + +| 目的 | コマンド | 備考 | +| --- | --- | --- | +| 5-fold 交差検証 | `uv run tias-train cv --config <設定>` | 学習・評価して `runs/<実験ID>/` に書き出す.最後に実験 ID を出力する([SPEC_02](../04_SPEC/SPEC_02_学習・評価仕様.md)「交差検証の実行」) | +| 手元での試運転 | `uv run tias-train cv --config configs/cv_synthetic.yaml` | 合成データ・小さなモデル・事前学習なし.CPU で十数秒 | + +設定ファイル: + +| 設定 | 内容 | +| --- | --- | +| `configs/cv_with_mild.yaml`・`configs/cv_without_mild.yaml` | ConvNeXt-Tiny・ややあり込み/除外(サーバの実データ) | +| `configs/cv__.yaml` | モデル比較用(モデル名以外は上と同一) | +| `configs/repeat/*_s43.yaml`・`*_s44.yaml` | 分割 seed を変えた繰り返し(seed 以外は元の設定と同一) | + +**サーバでの実行例**: + +```bash +# 1 本だけ(空いている GPU を自動で選ぶ) +uv run tias-remote run --name cv1 -- tias-train cv --config configs/cv_with_mild.yaml + +# 複数本を同じ GPU で順に回す(キュー).; で区切るので 1 本が失敗しても次へ進む +uv run tias-remote run --name q1 --server Archimedes --gpu 1 -- bash -c "tias-train cv --config configs/cv_with_mild.yaml; tias-train cv --config configs/cv_effb0_with_mild.yaml;" + +uv run tias-remote logs q1 # 各実験の最後の行に実験 ID が出る +uv run tias-remote pull <実験ID> # 指標・図・ログだけが手元の runs/ に届く +``` + +- ConvNeXt-Tiny の 5-fold 交差検証 1 本は Archimedes の RTX A6000 で約 2.5 分(2026-09-28 実測.画像の読み込み約 8 秒を含む) +- 事前学習の重みは初回にサーバが Hugging Face からダウンロードする(`~/.cache/huggingface`) +- ログに出る `lr_scheduler.step() before optimizer.step()` の警告は,混合精度で最初の数ステップの勾配がオーバーフローして捨てられたときに出るもので無害 + ## テスト (Test) | 目的 | コマンド | @@ -86,9 +117,3 @@ | 目的 | コマンド | 備考 | | --- | --- | --- | | フックのテスト | `bash .claude/hooks/tests/test_hooks.py` 相当を `uv run pytest .claude/hooks/tests` | テンプレート由来.`.claude/` の変更時に確認する | - -## 未実装のコマンド (Planned) - -実装した時点で本ファイルに追記する. - -- 学習・評価 diff --git "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" index eba8393..ee36225 100644 --- "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" +++ "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" @@ -9,8 +9,8 @@ | 1 | 基盤: 設定スキーマ・合成データ生成・manifest 読み込み・患者単位分割 ✅ 完了 | なし(手元で完結) | | 2 | リモート実行ツール(送信・実行・回収・GPU 確認,回収ホワイトリスト)✅ 完了(Newton・Archimedes の 2 サーバ対応) | Step 1 | | 3 | データセット集計(実データの素性把握)✅ 完了(結果は [TEST_02](../06_TEST/TEST_02_データセット集計結果.md)) | **臨床データのコピー完了**・倫理確認 | -| 4 | 学習パイプライン最小版(ConvNeXt-Tiny を 1 本通す) | Step 2・3 | -| 5 | 評価・レポート生成(指標・混同行列・`runs/` 出力) | Step 4 | +| 4 | 学習パイプライン最小版(ConvNeXt-Tiny を 1 本通す)✅ 完了 | Step 2・3 | +| 5 | 評価・レポート生成(指標・混同行列・`runs/` 出力)✅ 完了(5-fold 交差検証として実装.結果は [TEST_03](../06_TEST/TEST_03_交差検証結果.md)) | Step 4 | | 6 | ベースライン比較(TIASjudge のルールベース)※ 後回し | Step 5 | | 7 | 実験反復(不均衡対策・モデル比較・解像度検討) | Step 6 | | 8 | 結論(5-fold 交差検証・評価レポート・配布形式の判断) | Step 7 | diff --git "a/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" index cc134c2..87573b1 100644 --- "a/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" +++ "b/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" @@ -53,6 +53,10 @@ - 正規化: ImageNet の mean / std - デバイス: CUDA があれば `cuda`(`CUDA_VISIBLE_DEVICES` で割り当てられた GPU),無ければ CPU - 高速化のため,レターボックス済みの画像(uint8)をメモリに載せてから学習してよい(1085 枚 × 224² × 3 ≒ 160 MB) +- 平行移動は ±5%.学習時は端数のバッチを捨てる(BatchNorm を持つモデルで 1 件のバッチになると止まるため) +- 学習率は step 単位の線形 warmup の後,`max_epochs` の終わりで 0 になる cosine +- 早期終了は検証 macro F1 の厳密な改善(`>`)で判定し,同点なら先のエポックを残す +- `convnext_tiny` の事前学習の重みは timm の既定タグ `convnext_tiny.in12k_ft_in1k`(ImageNet-12k で事前学習し ImageNet-1k で微調整したもの)が使われる ## 交差検証の実行 (Cross-Validation Run) @@ -60,7 +64,7 @@ 1. manifest 全体で患者単位・9 グループ層化の 5-fold 分割を作る(`data.severities` に関わらず同じ分割.上記「程度(ややあり)の扱い」) 2. 各 fold について - 1. 学習側(held_out 以外)から `train.inner_val_ratio` の患者を検証用に取る(患者単位・9 グループ層化.seed は分割と同じ設定から決める) + 1. 学習側(held_out 以外)から `train.inner_val_ratio` の患者を検証用に取る(患者単位・9 グループ層化.**`data.severities` を適用する前の全程度から取る**.seed は `split.seed + fold 番号`.学習の seed も同じ) 2. `data.severities` を**学習用と検証用にだけ**適用する(held_out には適用しない.下記) 3. 検証の macro F1 が最良のエポックの重みを採用する(早期終了) 4. **held_out(全程度を含む)で 1 回だけ評価する** @@ -78,7 +82,8 @@ - 各部分集合で: macro F1・accuracy・クラス別 precision / recall / F1・混同行列(`common` と `all`) - `mild` では加えて**予測の内訳**を出す: 淡紅と予測された割合・元のクラスと予測された割合・その他のクラスと予測された割合(クラス別と全体) -- fold ごとの値と,fold 間の平均 ± 標準偏差を出す.混同行列は全 fold の合計も出す +- fold ごとの値と,fold 間の平均 ± 標準偏差(不偏標準偏差.ddof=1)を出す.全 fold の予測をまとめた値(`pooled`)と,混同行列の全 fold の合計も出す +- **macro F1 は,その部分集合の正解に現れるクラスだけで平均する**(`mild` には淡紅の正解が無いため,5 クラスで平均すると淡紅への予測が F1 = 0 として平均を下げてしまう).クラス別の指標も正解に現れるクラスだけを出す.淡紅への流れ込みは `mild` の予測の内訳で見る - 画像ごとの予測(個票)は `predictions.csv` に保存し,**回収しない** ### 出力 (Run Artifacts) @@ -94,7 +99,7 @@ | `log.txt` | ログ | する | | `figures/*.png` | 学習曲線・混同行列 | する | | `split.json`・`predictions.csv` | 分割と個票の予測(患者 ID を含む) | しない | -| `checkpoints/fold.pt` | 各 fold の最良の重み | `--with-checkpoints` のときだけ | +| `checkpoints/fold.pt` | 各 fold の最良の重み(サーバには常に保存する) | `--with-checkpoints` のときだけ | **所要時間の記録**(2026-09-28 ユーザー要望): `metrics.json` に次を含める.モデル間・条件間で計算コストも比べられるようにするため.