fix(cluster): 配置层级写错不再静默忽略,并始终打印生效的超参
聚类配置里 optimizer/epochs 等键都在 `simclr:` 段下。写到顶层会被完全忽略、 不报任何错——用户改了 lr 却毫无反应,极难排查。同样的坑还有:改了基类 configs/cluster/film.yaml 的 simclr.optimizer,但运行的是子配置 film_simclr_resnet18.yaml,子配置里的同名键会盖掉基类的修改。 - 顶层出现 optimizer / scheduler / epochs / temperature / projection / save_interval / resume / checkpoint / log_interval 时警告并给出正确写法 - method != simclr 却写了 simclr: 段时提示该段不会生效 - SimCLRTrainer 初始化时无条件打印实际生效的 epochs / temperature / optimizer / scheduler,不再只在续训时才打印 - 修掉一处假差异:旧存档没有 scheduler_cfg 字段时会误报 "scheduler None -> cosine", 那是"不知道"而非"当时没有调度器" 已验证 --set 覆盖、直接改 yaml、旧格式存档三条路径下 lr/weight_decay 均正常生效。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
105cb38831
commit
506fde0290
+10
-1
@@ -92,6 +92,14 @@ class SimCLRTrainer:
|
||||
|
||||
self.global_step = 0
|
||||
self.start_epoch = 0
|
||||
# 无论是否续训都打印一次实际生效的超参:配置写错层级时最难发现的就是"改了没反应"
|
||||
logger.info(
|
||||
"SimCLR 超参:epochs=%d temperature=%.3g optimizer=%s scheduler=%s",
|
||||
self.epochs,
|
||||
self.temperature,
|
||||
dict(self.cfg.get("optimizer", {})) or "(默认 adamw lr=1e-3)",
|
||||
(dict(self.cfg.get("scheduler") or {})).get("name") or "(无)",
|
||||
)
|
||||
if resume:
|
||||
self.load_state(resume)
|
||||
|
||||
@@ -297,7 +305,8 @@ class SimCLRTrainer:
|
||||
changes.append(f"optimizer.{key} {archived} -> {current}")
|
||||
archived_scheduler = (state.get("scheduler_cfg") or {}).get("name")
|
||||
current_scheduler = (dict(self.cfg.get("scheduler") or {})).get("name")
|
||||
if archived_scheduler != current_scheduler:
|
||||
# 旧存档没有 scheduler_cfg 字段,那是"不知道"而不是"当时没有调度器",不能报成差异
|
||||
if "scheduler_cfg" in state and archived_scheduler != current_scheduler:
|
||||
changes.append(f"scheduler {archived_scheduler} -> {current_scheduler}")
|
||||
|
||||
if changes:
|
||||
|
||||
Reference in New Issue
Block a user