如何用 Cell-DINO 在 HPAone 上运行蛋白质定位线性评估并得到 mean_per_class_multilabel_f1?
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
如果你已经拿到一个 Cell-DINO(ViT-L/16)模型权重,想验证它在 HPAone(HPA 单细胞)数据集上的蛋白质定位(protein localization)能力,本文给出仓库 docs/README_CELL_DINO.md 中的完整操作路径:冻结骨干网络、只训练线性分类头,并用mean_per_class_multilabel_f1作为验证指标。评估在单个节点上运行,跑完后你会在输出目录得到 best classifier 名称和对应的 F1 数值。
准备条件
1. 环境
按 docs/README_CELL_DINO.md 的安装说明,构建 Python 3.10 环境并安装依赖:
conda create -n py310 python=3.10 conda activate py310 pip install -r requirements.txt pip install -U scikit-learn运行评估命令时必须让dinov2包位于 Python 模块搜索路径中,即命令前加PYTHONPATH=.(评估脚本实际写作PYTHONPATH=.:dinov2/data,因为需要直接引用dinov2/data下的数据集模块)。
2. 数据
HPA-FoV 和 HPA single cell(HPAone)数据集的下载入口见 docs/README_CELL_DINO.md 的 “Data preparation” 一节(文档给出了 EBI BioStudies 数据页链接,请自行查阅原文获取)。
HPAone 的数据加载器(dinov2/data/datasets/cell_dino/hpaone.py,dataloader : HPAone.py)要求数据集根目录下有以下 5 个文件:
fixed_size_masked_single_cells_HPAvaried_size_masked_single_cells_HPAvaried_size_masked_single_cells_pretrain_20240507.csvfixed_size_masked_single_cells_evaluation_20240507.csvfixed_size_masked_single_cells_pretrain_20240507.csv
其中训练 split(TRAIN)读取fixed_size_masked_single_cells_pretrain_20240507.csv,验证 split(VAL)读取fixed_size_masked_single_cells_evaluation_20240507.csv,图像统一从fixed_size_masked_single_cells_HPA目录加载。
蛋白质定位任务使用多标签(multilabel)标注:hpaone.py中定义的PROTEIN_LOCALIZATION共 19 个类别(如nucleoplasm、mitochondria、nuclear membrane等),每张图对应一个 19 维 0/1 标签向量。
3. 模型权重
--pretrained-weights需要一个检查点文件,文档给出两种来源:
- 自训练产物:用 dinov2/run/train/train.py 在 HPAone 上训练时,训练代码每隔 9000 次迭代把 teacher 权重保存到
eval文件夹。文档示例用的是<训练输出目录>/eval/training_44999/teacher_checkpoint.pth(迭代号随你的训练进度而定)。 - 官方发布的预训练权重:README 指出下载说明在根目录 README.md 末尾 “DINO for Biology” 一节,HPA single cell 模型对应 hubconf 入口
cell_dino_hpa_vitl16(见 dinov2/hub/cell_dino/backbones.py)。
执行线性评估
蛋白质定位任务的评估命令来自 docs/README_CELL_DINO.md:
PYTHONPATH=.:dinov2/data python dinov2/run/eval/cell_dino/linear.py \ --config-file dinov2/configs/eval/cell_dino/vitl16_pretrain.yaml \ --pretrained-weights <CHECKPOINT/PATH> \ --output-dir <PATH/TO/OUTPUT/DIR> \ --train-dataset HPAone:split=TRAIN:mode=PROTEIN_LOCALIZATION:root=<PATH/TO/DATASET> \ --val-dataset HPAone:split=VAL:mode=PROTEIN_LOCALIZATION:root=<PATH/TO/DATASET> \ --val-metric-type mean_per_class_multilabel_f1 \ --loss-type binary_cross_entropy \ --avgpool占位符替换说明(均沿用文档中的写法):
<CHECKPOINT/PATH>:上面第 3 小节准备的一个检查点路径,训练产物示例为<PATH/TO/OUTPUT/DIR>/eval/training_44999/teacher_checkpoint.pth;<PATH/TO/DATASET>:HPAone 数据集根目录(含上述 5 个文件);<PATH/TO/OUTPUT/DIR>:评估结果与检查点输出目录,命令执行时会自动创建。
各参数的作用:
--config-file:指定 dinov2/configs/eval/cell_dino/vitl16_pretrain.yaml,内容为 student/teacher 均为vit_large、patch_size: 16、in_chans: 4(HPA 图像为 4 通道),评估脚本据此构建并加载模型;--train-dataset/--val-dataset:数据集名:split=...:mode=...:root=...格式,mode=PROTEIN_LOCALIZATION决定加载 19 维多标签标注;换到 HPAFoV 时按文档说明把HPAone替换为HPAFoV并加载对应模型权重;--val-metric-type mean_per_class_multilabel_f1:验证指标,在 dinov2/eval/metrics.py 中映射为MultilabelF1Score(num_labels=19, average="macro"),即每个定位类别先算 F1 再取宏平均;--loss-type binary_cross_entropy:线性头损失用nn.BCEWithLogitsLoss()(多标签必需;细胞系分类任务则用默认 cross entropy);--avgpool:在线性输入中额外拼接 patch tokens 的平均池化结果(除 CLS token 外)。
脚本内部行为(见 dinov2/eval/cell_dino/linear.py):骨干网络冻结,只训练LinearClassifier线性头;优化器为 AdamW,默认调度器 CosineAnnealingLR;学习率在 16 个候选值上做网格搜索,weight decay 在[0.0, 0.0001, 1.0e-05]中搜索,每个 (lr, wd) 组合各训一个线性头,默认epochs=30、epoch_length=145、batch_size=64。每eval_period_iterations次迭代在验证集上评一次,F1 最高的分类头会被记为 best classifier 并保存。
一个需要留意的文档差异:README 中“评估官方预训练权重”的蛋白质定位命令写的是python dinov2/run/eval/linear_celldino.py,但该路径在当前仓库中不存在;仓库内实际存在的是dinov2/run/eval/cell_dino/linear.py(README 中训练 checkpoint 评估与细胞系分类命令均用它)。本文使用存在的路径。
结果验证
评估过程与结果落在两处:
- 日志:训练中周期性打印
running validation !、每个候选头的指标行、best classifier: {'name': ..., 'accuracy': ...};结束前打印Test Results Dict ...,其中 best classifier 对应的数值即最终成绩(代码中该主指标为 F1 × 100)。 - 输出文件:
<PATH/TO/OUTPUT/DIR>/results_eval_linear.json,主进程每次评估都会向其中追加iter: <迭代号>和 best_classifier 的 JSON 记录,可直接查看最后一轮结果。
判断标准参考文档给出的数值:按 README 的训练配方(4 个 A100-80GB 节点、约 2 天)在 HPAone 上训练的模型,线性评估的蛋白质定位 F1 应达到 78.5。不同权重和超参组合下结果会有出入,以你自己输出目录中的results_eval_linear.json为准,文档未承诺其他固定数值。
边界与说明
- 该评估脚本文档定位为“single node”运行;命令通过 submitit 启动(dinov2/run/eval/cell_dino/linear.py 只是 Evaluator 的 submitit launcher)。
- 仓库代码与模型权重仅供研究使用,不用于临床诊断等医疗场景(docs/README_CELL_DINO.md 有明确声明)。
- 细胞系分类(CELL_TYPE)任务与本场景是独立任务:需要
mode=CELL_TYPE与--val-metric-type mean_per_class_multiclass_f1,且不需要--loss-type binary_cross_entropy,命令见 README 对应小节。
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考