原始数据从 data/<数据集> 移到了 data/raw/<数据集>。
- 聚类配置的 dataset.root:film / pearlescent 均改为 data/raw/ 下
- 检测配置的 img_dir 与 label_dir 注释同步
- README、data/README、算法文档、流程图(含重新渲染的 PNG)与各脚本
docstring 里的路径示例一并更新
- data/README 补充目录约定:原始数据只读放 data/raw/,
export_clusters.py 的派生数据集放在 data/ 下与 raw/ 平级
- 顺手把 unlabeled 数据集加进 datasets/__init__.py:此前它没在包初始化时注册,
build_dataset({"name": "unlabeled"}) 只有在别处先 import 过该模块时才可用
迁移后重跑全量聚类,结果与迁移前逐项一致(轮廓 0.3255、稳定性 0.9641、
簇大小 [4507, 3795, 4849, 1428])。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
39 lines
1.6 KiB
YAML
39 lines
1.6 KiB
YAML
# 用 resnet18 做域内自监督(SimCLR)再聚类。
|
|
#
|
|
# 与默认配置的区别只有骨架:configs/cluster/film.yaml 的 method=pretrained 用的也是
|
|
# resnet18,但那是 ImageNet 权重、不训练;这里是在 data/raw/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: 5
|
|
|
|
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: 2500
|
|
optimizer: {name: adamw, lr: 0.0001, weight_decay: 0.00001}
|