Files
ModelTrainEval/configs/cluster/film_simclr_resnet18.yaml
T
Shaun ZhouandClaude Opus 5 6f00074199 feat(cluster): 新增 resnet18 自监督聚类配置,并修复 --set 的 YAML 标量解析
- 新增 configs/cluster/film_simclr_resnet18.yaml:用 resnet18 做域内自监督后聚类。
  backbone 块带 _replace_,避免 base 里 tiny_conv 的 widths/depths 残留
- parse_override 此前只用 ast.literal_eval,不认 YAML 风格的 null/true/false:
  `--set xxx.enabled=false` 会得到字符串 "false",而非空字符串是真值,开关反被打开。
  改为先试 Python 字面量(保住 1e-3 这类),再退回 YAML 标量解析
- feature_stages 默认由 null 改为 [5, 6]:实测 1 epoch 自监督后 layer2+3 的轮廓
  0.243/稳定性 0.997,明显优于 layer4 的 0.156/0.528。原注释里"自监督后 layer4
  已是域内特征"的推断被数据推翻
- README 补充三种方案的实测对比与成本

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 15:51:28 +08:00

36 lines
1.5 KiB
YAML

# 用 resnet18 做域内自监督(SimCLR)再聚类。
#
# 与默认配置的区别只有骨架:configs/cluster/film.yaml 的 method=pretrained 用的也是
# resnet18,但那是 ImageNet 权重、不训练;这里是在 data/film 上自监督训练它。
#
# 用法:
# uv run python scripts/cluster_unlabeled.py --config configs/cluster/film_simclr_resnet18.yaml \
# --work-dir runs/simclr_r18 --set simclr.epochs=40
_base_:
- ./film.yaml
method: simclr
simclr:
backbone:
# _replace_ 必须保留:不加的话 base 里 tiny_conv 的 widths/depths/block 会残留,
# 传给 TorchvisionBackbone 直接报错。见 utils/config.py::deep_merge
_replace_: true
name: torchvision
arch: resnet18
pretrained: true # 从 ImageNet 权重起步再自监督微调;改 false 则从随机初始化开始
in_channels: 3
# torchvision 的 features 是 nn.Sequential,可以取中间层(4~7 = layer1~4)。
# 实测(1 epoch 自监督后,14,579 张,k=4):
# [5, 6] layer2+3 轮廓 0.243 稳定性 0.997 <- 默认
# null layer4 轮廓 0.156 稳定性 0.528
# [5, 6, 7] 再加 layer4 轮廓 0.155 稳定性 0.553
# 原以为自监督之后 layer4 已是域内特征、可以直接用,实测并非如此:
# 缺陷差异主要在纹理层面,中间层依然更合适。
feature_stages: [5, 6]
# resnet18 比 tiny_conv 重得多(11.2M vs 0.3M),显存和耗时都要留余量
batch_size: 128
epochs: 40