# 用 resnet101 做域内自监督(SimCLR)再聚类。 # # 与 film_simclr_resnet18/50 的区别只有骨架和 batch_size,其余超参保持一致, # 方便横向对比三个骨架。 # # 用法: # uv run python scripts/cluster_unlabeled.py --config configs/cluster/film_simclr_resnet101.yaml \ # --work-dir runs/simclr_r101 --set simclr.epochs=40 _base_: - ./film.yaml method: simclr num_clusters: 5 simclr: backbone: # _replace_ 必须保留:不加的话 base 里 tiny_conv 的 widths/depths/block 会残留, # 传给 TorchvisionBackbone 直接报错。见 utils/config.py::deep_merge _replace_: true name: torchvision arch: resnet101 pretrained: true # 首次使用会下载 ImageNet 权重(约 171 MB);改 false 则随机初始化 in_channels: 3 # torchvision 的 features 是 nn.Sequential,可以取中间层(4~7 = layer1~4)。 # 沿用 resnet18 上的实测结论:layer2+3 明显优于 layer4,缺陷差异主要在纹理层面。 # resnet101 的 layer2+3 是 512+1024=1536 维,与 resnet50 相同(都是 Bottleneck 结构), # 差别在深度:resnet101 的 layer3 有 23 个 block,resnet50 只有 6 个。 feature_stages: [5, 6] # 三个骨架的规模对比:resnet18 11.2M / resnet50 23.5M / resnet101 42.5M。 # batch_size 取 128 是保守值——Apple MPS 上实测 resnet50 在 batch 1024 就 OOM(要 18.7 GiB), # resnet101 约重 1.8 倍,故再降一档。 # 注意上面的数字来自 MPS;在 16 GB 独显(如 RTX 4080 SUPER)上可以往上调, # NT-Xent 的负样本越多下界越紧,显存够就尽量开大。 batch_size: 128 epochs: 2500 optimizer: {name: adamw, lr: 0.0001, weight_decay: 0.00001}