diff --git a/CLAUDE.md b/CLAUDE.md index 2b8b5e9..8cb2c68 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ ## 開発進捗 -最新: 色特徴+ロジスティック回帰が CNN と同等以上(込みで +0.04)と判明(TEST_05).次は CNN と色特徴の併用・効いている特徴の分析 +最新: CNN のハイパーパラメータを変えても性能はほぼ不変と判明(TEST_06).次は CNN と色特徴の併用・効いている特徴の分析 ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) @@ -103,3 +103,4 @@ - 交差検証結果: docs/06_TEST/TEST_03_交差検証結果.md - クラス不均衡対策の実験: docs/06_TEST/TEST_04_クラス不均衡対策の実験.md - 色特徴分類器の実験: docs/06_TEST/TEST_05_色特徴分類器の実験.md +- ハイパーパラメータの比較: docs/06_TEST/TEST_06_ハイパーパラメータの比較.md diff --git a/configs/hparam/cv_hp_convnext_cwinv_bs16.yaml b/configs/hparam/cv_hp_convnext_cwinv_bs16.yaml new file mode 100644 index 0000000..b7aac68 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_bs16.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): batch_size = 16(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 16 + max_epochs: 40 + patience: 8 + lr: 1.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_ep60p15.yaml b/configs/hparam/cv_hp_convnext_cwinv_ep60p15.yaml new file mode 100644 index 0000000..98f4075 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_ep60p15.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): max_epochs = 60・patience = 15(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 60 + patience: 15 + lr: 1.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_img320.yaml b/configs/hparam/cv_hp_convnext_cwinv_img320.yaml new file mode 100644 index 0000000..736ce51 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_img320.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): image_size = 320(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 320 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_img320_s43.yaml b/configs/hparam/cv_hp_convnext_cwinv_img320_s43.yaml new file mode 100644 index 0000000..ee302d0 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_img320_s43.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 43): image_size = 320(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 320 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_img320_s44.yaml b/configs/hparam/cv_hp_convnext_cwinv_img320_s44.yaml new file mode 100644 index 0000000..3176998 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_img320_s44.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 44): image_size = 320(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 320 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_lr2e-4.yaml b/configs/hparam/cv_hp_convnext_cwinv_lr2e-4.yaml new file mode 100644 index 0000000..ca7ab69 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_lr2e-4.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): lr = 2.0e-4(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 2.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_lr3e-5.yaml b/configs/hparam/cv_hp_convnext_cwinv_lr3e-5.yaml new file mode 100644 index 0000000..036a396 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_lr3e-5.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): lr = 3.0e-5(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 3.0e-5 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_lr4e-4.yaml b/configs/hparam/cv_hp_convnext_cwinv_lr4e-4.yaml new file mode 100644 index 0000000..5ce7422 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_lr4e-4.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): lr = 4.0e-4(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 4.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_wd0.005.yaml b/configs/hparam/cv_hp_convnext_cwinv_wd0.005.yaml new file mode 100644 index 0000000..a15e0f7 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_wd0.005.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): weight_decay = 0.005(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-4 + weight_decay: 0.005 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_convnext_cwinv_wd0.2.yaml b/configs/hparam/cv_hp_convnext_cwinv_wd0.2.yaml new file mode 100644 index 0000000..a5d53f1 --- /dev/null +++ b/configs/hparam/cv_hp_convnext_cwinv_wd0.2.yaml @@ -0,0 +1,28 @@ +# ハイパーパラメータの比較(ConvNeXt-Tiny・重み inverse・ややあり除外.seed 42): weight_decay = 0.2(それ以外は configs/imbalance/cv_without_mild_cwinv.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: convnext_tiny + pretrained: true + +train: + image_size: 224 + batch_size: 32 + max_epochs: 40 + patience: 8 + lr: 1.0e-4 + weight_decay: 0.2 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true + class_weighting: inverse diff --git a/configs/hparam/cv_hp_resnet50_bs16.yaml b/configs/hparam/cv_hp_resnet50_bs16.yaml new file mode 100644 index 0000000..98f4e55 --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_bs16.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 42): batch_size = 16(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: 16 + 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/hparam/cv_hp_resnet50_img320.yaml b/configs/hparam/cv_hp_resnet50_img320.yaml new file mode 100644 index 0000000..ed17c2d --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_img320.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 42): image_size = 320(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: 320 + 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/hparam/cv_hp_resnet50_img320_s43.yaml b/configs/hparam/cv_hp_resnet50_img320_s43.yaml new file mode 100644 index 0000000..8d82934 --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_img320_s43.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 43): image_size = 320(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: 320 + 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/hparam/cv_hp_resnet50_img320_s44.yaml b/configs/hparam/cv_hp_resnet50_img320_s44.yaml new file mode 100644 index 0000000..6f7fab1 --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_img320_s44.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 44): image_size = 320(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: 320 + 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/hparam/cv_hp_resnet50_lr3e-3.yaml b/configs/hparam/cv_hp_resnet50_lr3e-3.yaml new file mode 100644 index 0000000..1043aa7 --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_lr3e-3.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 42): lr = 3.0e-3(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: 3.0e-3 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/hparam/cv_hp_resnet50_lr3e-4.yaml b/configs/hparam/cv_hp_resnet50_lr3e-4.yaml new file mode 100644 index 0000000..bdbf3ce --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_lr3e-4.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 42): lr = 3.0e-4(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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: 3.0e-4 + weight_decay: 0.05 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/hparam/cv_hp_resnet50_wd0.005.yaml b/configs/hparam/cv_hp_resnet50_wd0.005.yaml new file mode 100644 index 0000000..7459379 --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_wd0.005.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 42): weight_decay = 0.005(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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.005 + warmup_epochs: 2 + inner_val_ratio: 0.15 + num_workers: 4 + amp: true diff --git a/configs/hparam/cv_hp_resnet50_wd0.2.yaml b/configs/hparam/cv_hp_resnet50_wd0.2.yaml new file mode 100644 index 0000000..c2d710b --- /dev/null +++ b/configs/hparam/cv_hp_resnet50_wd0.2.yaml @@ -0,0 +1,27 @@ +# ハイパーパラメータの比較(ResNet-50・学習率 1e-3・ややあり除外.seed 42): weight_decay = 0.2(それ以外は configs/lr1e-3/cv_resnet50_without_mild_lr1e-3.yaml と同一.選択は内側の検証 macro F1 で行う.TEST_06) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 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.2 + 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 de96f1c..b36406b 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" @@ -78,6 +78,7 @@ | `configs/repeat/*_s43.yaml`・`*_s44.yaml` | 分割 seed を変えた繰り返し(seed 以外は元の設定と同一) | | `configs/lr1e-3/*.yaml` | ResNet-50・EfficientNet-B0 を学習率 1e-3 で回す設定(1e-4 では学習不足だったため.TEST_03) | | `configs/imbalance/*.yaml` | クラス不均衡の対策(`_cwinv`: 重み inverse・`_cwsqrt`: 重み sqrt_inverse・`_balanced`: バランス・サンプリング).元の設定(ConvNeXt-Tiny・ResNet-50 lr 1e-3 の各 6 本)から対策のキーだけを変えたもの | +| `configs/hparam/*.yaml` | ハイパーパラメータの比較(`cv_hp__<変更>[_s43 \| _s44]`).基準の設定(ConvNeXt-Tiny・重み inverse/ResNet-50 lr 1e-3.ややあり除外)から 1 項目だけを変えたもの([TEST_06](../06_TEST/TEST_06_ハイパーパラメータの比較.md)) | | `configs/color/*.yaml` | 色特徴分類器(`cv_color__[_s43 \| _s44][_cwinv]`).分割・程度の設定は同名の CNN の設定と同一 | **サーバでの実行例**: 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 b43008a..82a45c8 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" @@ -60,7 +60,7 @@ - **成果物**: 実験群(クラス不均衡対策・モデル比較・入力解像度・マスク外領域の埋め方)とその記録 - **完了条件**: 各要因の効果が**独立した実験として**切り分けて記録されている - **注意**: 共用サーバのため使用する GPU を明示的に指定する -- **進捗**: クラス不均衡対策([TEST_04](../06_TEST/TEST_04_クラス不均衡対策の実験.md))・色特徴分類器との比較([TEST_05](../06_TEST/TEST_05_色特徴分類器の実験.md))を実施 +- **進捗**: クラス不均衡対策([TEST_04](../06_TEST/TEST_04_クラス不均衡対策の実験.md))・色特徴分類器との比較([TEST_05](../06_TEST/TEST_05_色特徴分類器の実験.md))・ハイパーパラメータの比較([TEST_06](../06_TEST/TEST_06_ハイパーパラメータの比較.md))を実施 ## Step 8: 結論 (Conclusion) diff --git "a/docs/06_TEST/TEST_06_\343\203\217\343\202\244\343\203\221\343\203\274\343\203\221\343\203\251\343\203\241\343\203\274\343\202\277\343\201\256\346\257\224\350\274\203.md" "b/docs/06_TEST/TEST_06_\343\203\217\343\202\244\343\203\221\343\203\274\343\203\221\343\203\251\343\203\241\343\203\274\343\202\277\343\201\256\346\257\224\350\274\203.md" new file mode 100644 index 0000000..3a59a69 --- /dev/null +++ "b/docs/06_TEST/TEST_06_\343\203\217\343\202\244\343\203\221\343\203\274\343\203\221\343\203\251\343\203\241\343\203\274\343\202\277\343\201\256\346\257\224\350\274\203.md" @@ -0,0 +1,80 @@ +# ハイパーパラメータの比較 (Hyperparameter Sweep) + +CNN の学習のハイパーパラメータ(学習率・weight decay・バッチサイズ・入力解像度・学習の長さ)を 1 つずつ変えて,[TEST_04](TEST_04_クラス不均衡対策の実験.md) までの基準の構成と比べた結果(ユーザーの依頼で約 1 時間の枠で実施).まず seed 42 の分割で 14 通りを試し,効果が見えた入力解像度 320 だけを seed 43・44 でも回して確かめた. + +| 項目 | 内容 | +| --- | --- | +| 実行日時 | 2026-09-28 12:11〜13:07(約 56 分) | +| 実行場所 | Archimedes の RTX A6000(GPU 1 の 1 枚.未使用の GPU のみを使用.他の GPU は使用中または利用者ありだった) | +| 本数 | 18 本(seed 42 で 14 通り+入力解像度 320 の seed 43・44 を 2 モデル × 2) | +| 条件 | ややあり除外(TEST_03〜05 で最も良かった条件).評価は common(「あり」と淡紅)の macro F1 | +| 基準の構成 | ConvNeXt-Tiny・重み `inverse`(学習率 1e-4)と ResNet-50(学習率 1e-3・対策なし).いずれも batch 32・weight decay 0.05・入力 224・最大 40 エポック・patience 8 | +| 設定 | `configs/hparam/`(基準の設定から 1 項目だけを変えたもの) | +| コード | `d9f67e5-dirty`(コードの変更なし.未コミットの設定ファイルを含むため dirty) | + +## seed 42 での比較 (Sweep on Seed 42) + +1 項目だけを変えた結果(5 fold の平均).「内側の検証 F1」は各 fold の早期終了に使った検証データでの最良の macro F1 で,**held_out を見ずに構成を選ぶための値**.「基準との差」は同じ fold どうしの held_out の差. + +| モデル | 変更 | 内側の検証 F1 | held_out common F1 | 基準との差 | 上回った fold | 淡白 recall | 紫 recall | 1 本の秒数 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| ConvNeXt-Tiny | 基準 | 0.714 | 0.627 ± 0.034 | — | — | 0.57 | 0.37 | 159 | +| ConvNeXt-Tiny | 学習率 3e-5 | 0.708 | 0.608 ± 0.050 | −0.019 | 1 / 5 | 0.51 | 0.29 | 137 | +| ConvNeXt-Tiny | 学習率 2e-4 | 0.730 | 0.621 ± 0.020 | −0.005 | 3 / 5 | 0.65 | 0.39 | 180 | +| ConvNeXt-Tiny | 学習率 4e-4 | 0.691 | 0.598 ± 0.052 | −0.028 | 1 / 5 | 0.59 | 0.48 | 211 | +| ConvNeXt-Tiny | weight decay 0.005 | **0.731** | 0.627 ± 0.061 | −0.000 | 3 / 5 | 0.66 | 0.32 | 142 | +| ConvNeXt-Tiny | weight decay 0.2 | 0.695 | 0.614 ± 0.066 | −0.012 | 3 / 5 | 0.67 | 0.46 | 142 | +| ConvNeXt-Tiny | batch 16 | 0.705 | 0.588 ± 0.092 | −0.039 | 1 / 5 | 0.47 | 0.36 | 210 | +| ConvNeXt-Tiny | 最大 60 エポック・patience 15 | 0.708 | 0.599 ± 0.069 | −0.028 | 1 / 5 | 0.57 | 0.28 | 189 | +| ConvNeXt-Tiny | 入力 320 | 0.699 | **0.654 ± 0.078** | **+0.028** | **4 / 5** | 0.66 | 0.32 | 222 | +| ResNet-50 | 基準 | 0.723 | 0.627 ± 0.056 | — | — | 0.60 | 0.36 | 117 | +| ResNet-50 | 学習率 3e-4 | 0.683 | 0.633 ± 0.063 | +0.005 | 2 / 5 | 0.48 | 0.28 | 124 | +| ResNet-50 | 学習率 3e-3 | 0.705 | 0.599 ± 0.031 | −0.029 | 1 / 5 | 0.66 | 0.32 | 82 | +| ResNet-50 | weight decay 0.005 | 0.709 | 0.641 ± 0.029 | +0.013 | 2 / 5 | 0.63 | 0.41 | 119 | +| ResNet-50 | weight decay 0.2 | 0.706 | 0.630 ± 0.051 | +0.003 | 2 / 5 | 0.63 | 0.32 | 110 | +| ResNet-50 | batch 16 | 0.706 | 0.653 ± 0.032 | +0.025 | 3 / 5 | 0.64 | 0.41 | 159 | +| ResNet-50 | 入力 320 | **0.742** | **0.664 ± 0.096** | **+0.036** | 3 / 5 | 0.58 | 0.45 | 188 | + +- 学習率・weight decay・学習の長さは,**今の値(ConvNeXt 1e-4・ResNet-50 1e-3・weight decay 0.05・40 エポック)がほぼ最良**だった.どれを変えても held_out は ±0.03 の範囲で,多くは下がる +- 内側の検証 F1 で選ぶと,ConvNeXt は weight decay 0.005(held_out は基準と同じ),ResNet-50 は入力 320 になる.内側の検証 F1 と held_out の順位はあまり一致しない(検証データが各 fold 約 100 枚と少ないため) +- 2 モデルとも held_out が上がったのは**入力 320 だけ**だったので,seed を変えて確かめた + +## 入力解像度 320 の確認 (Resolution Check) + +seed 42・43・44 の 15 fold で,入力 224(TEST_03・TEST_04 の結果)と 320 を同じ fold どうしで比べた. + +| モデル | 入力 224 | 入力 320 | 差(320 − 224) | 320 が上回った fold | seed ごとの差(42 / 43 / 44) | 紫 recall | 1 本の秒数 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| ConvNeXt-Tiny(重み inverse) | 0.632 ± 0.060 | 0.634 ± 0.072 | +0.002 ± 0.065 | 8 / 15 | +0.028 / +0.001 / −0.022 | 0.34 → 0.39 | 約 220 | +| ResNet-50(lr 1e-3) | 0.637 ± 0.062 | **0.653 ± 0.076** | +0.016 ± 0.072 | 8 / 15 | +0.036 / +0.011 / +0.001 | 0.39 → 0.47 | 約 180 | + +- **seed 42 で見えた改善は,seed を増やすとほぼ消えた**.ConvNeXt は差なし,ResNet-50 は +0.016 だが上回った fold は半分(8/15)で,ばらつきの範囲内 +- 紫の再現率は 2 モデルとも少し上がった(+0.05〜0.08).解像度を上げると細部の色むらが見えるという見込み(TEST_04「次の一手」)と矛盾しないが,確かな差ではない +- ResNet-50・入力 320 の 0.653 は CNN の中では最も高く,色特徴+ロジスティック回帰([TEST_05](TEST_05_色特徴分類器の実験.md).除外で 0.644)とほぼ同じ + +## 分かったこと (Findings) + +1. **学習のハイパーパラメータを変えても性能はほとんど変わらない**.今の設定はすでに妥当な範囲にあり,ハイパーパラメータの調整で大きく伸ばせる余地は小さい +2. **seed 1 つ(5 fold)での比較は当てにならない**.seed 42 では +0.03 に見えた入力 320 の効果が,3 seed では +0.00〜0.02 になった.fold 間の標準偏差(0.03〜0.10)が効果の大きさより大きいため,今後の比較も最低 3 seed で行う +3. 内側の検証 F1(各 fold 約 100 枚)で構成を選んでも held_out の良さとは一致しにくい.選び方を公平にするための入れ子の交差検証は,このデータ量では選択の精度自体が低い +4. 以上から,CNN の性能の頭打ち(common macro F1 0.63〜0.65)はハイパーパラメータではなく**データ量やラベルのあいまいさ**によるものと考えられる.色特徴だけの分類器が同じ水準に届く(TEST_05)こととも整合する + +## 注意 (Caveats) + +- 1 項目ずつ変えただけで,組み合わせ(例: 入力 320 + batch 16)は試していない +- seed 42 だけの比較(上の表)は,どの差もばらつきの範囲内である +- 条件はややあり除外だけ.ややあり込みでは試していない +- 重み(`checkpoints/`)は保存したが,Archimedes の共用ディスクを圧迫するためユーザーの判断で削除した(本実験の 18 本ぶん 8.8 GB と TEST_04 の 36 本ぶん 18 GB.削除後の空き 52 GB.TEST_03「サーバの容量について」).同じ設定で数分で作り直せる + +## 次の一手 (Next Steps) + +- ハイパーパラメータの調整は打ち切り,性能を伸ばすなら**情報を増やす方向**を試す: CNN と色特徴の併用(アンサンブル),「ややあり」のソフトラベル化 +- 入力 320 は紫の再現率に効いている可能性があるので,併用を試すときの CNN 側の候補に残す + +## 実験 ID (Run IDs) + +手元の `runs/` に回収済み(`.gitignore` 対象).名前の `cv_hp_<モデル>_<変更>` が構成を表す.実験 ID の日時は 2026-09-28 12:11〜13:03. + +```bash +ls -d runs/*_cv_hp_* +``` diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 4c00449..d731f5a 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -119,3 +119,14 @@ - 進め方: ユーザーの指示で Phase 1 の人間の確認を省き,テスト作成と並行してサーバで実験した.GPU は使わず 2 台の CPU で 9 本ずつ回した(計約 30 分.1 本 1〜2 分) - 結果: **色特徴+ロジスティック回帰が CNN と同等以上**.除外で common macro F1 0.644(CNN の最良 0.637 と並ぶ),込みで 0.630(CNN の最良 0.590 を上回り,対応比較で 11〜14/15 fold).fold 間のばらつきも小さく,込み/除外の差も小さい.重み `inverse` は macro F1 を下げたが,淡白 0.81・紫 0.60 と少数クラスの再現率はこれまでで最高 - 示唆: 現状のデータ量では CNN が色の統計以上のものを学べていない.次は CNN と色特徴の併用と,どの特徴が効いているかの分析(TIASjudge のルール改良にもつながる) + +## Step 7(一部): ハイパーパラメータの比較 + +- [x] **学習率・weight decay・バッチサイズ・入力解像度・学習の長さを 1 項目ずつ変えて 18 本を実験**: ユーザーの依頼で約 1 時間の枠(12:11〜13:07).Archimedes の未使用の GPU 1 枚だけを使った.結果は [TEST_06](06_TEST/TEST_06_ハイパーパラメータの比較.md).コードの変更はなく設定の追加のみ. + - 設計判断 ①: 基準は TEST_04 までで最も良かった 2 構成(ConvNeXt-Tiny・重み inverse/ResNet-50 lr 1e-3)のややあり除外とし,1 項目ずつ変えて効果を切り分けた + - 設計判断 ②: 構成の良さは held_out に加えて内側の検証 F1(held_out を見ない値)でも記録した + - 進め方: まず seed 42 だけで 14 通りを回し(約 40 分),残り時間で効果が見えた入力 320 だけを seed 43・44 で確かめた + - 結果: 今の設定がほぼ最良で,どれを変えても ±0.03 の範囲.seed 42 で +0.03 に見えた入力 320 は,3 seed では ConvNeXt +0.002・ResNet-50 +0.016(いずれも 8/15 fold)とほぼ消えた + - 失敗パターン: seed 1 つ(5 fold)の比較は fold 間のばらつき(標準偏差 0.03〜0.10)に埋もれて当てにならない → 今後の比較は最低 3 seed で行う + - 示唆: 性能の頭打ち(0.63〜0.65)はハイパーパラメータではなくデータ量・ラベルのあいまいさによる.伸ばすなら CNN と色特徴の併用など情報を増やす方向 + - 対応済み: 本実験と TEST_04 の重み(計約 27 GB)が Archimedes の共用ディスク(残り 35 GB・98%)を圧迫していたため,ユーザーの判断で削除した(空き 52 GB に回復).重みを保存するかを設定で選べるようにする対応は未実施