# 用 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 num_clusters: 10 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: 1024 epochs: 300 optimizer: {name: adamw, lr: 0.01, weight_decay: 0.0001}