基于大规模预训练基础模型的参数高效迁移学习方法在各种下游应用中均取得了优异的表现,其中包括了利用side网络进行调优的方法。该方法仅需训练一个side网络,并将基础预训练模型的输出和side网络的输出进行加权融合,仅需训练极少部分的参数,就能取得不错的性能表现。
该页面展示了Side-Tuning在图像分类任务上的应用,即给定一张图片,返回候选类别中的分类标签及置信度。
Side-Tuning的模型结构如下所示,其中左侧为Vision Transformer的框架,右侧为side网络的具体结构,其中可以根据任务的难易程度对side网络的尺寸和复杂度进行相应的调整:
基于 ModelScope 框架,通过调用预定义的 Pipeline 可实现快速调用。
from modelscope.pipelines import pipeline
sidetuning_pipeline = pipeline('vision-efficient-tuning',
'damo/cv_vitb16_classification_vision-efficient-tuning-sidetuning',
model_revision='v1.0.1')
result = sidetuning_pipeline('https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/vision_efficient_tuning_test_1.png')
print(f'Output: {result}.')
模型分别在不同的预训练模型和图像分类数据集下进行评估,结果如下:
Dataset | ViT-B/16 (IN-21K) | ViT-L/14 (CLIP) |
---|---|---|
CIFAR100 | 79.51% | 84.09% |
CUB-200-2011 | 85.35% | 85.71% |
NABirds | 76.52% | 80.78% |
Oxford Flowers | 97.43% | 98.42% |
Stanford Cars | 50.86% | 90.65% |
Stanford Dogs | 86.24% | 84.66% |
Average | 79.32% | 87.39% |
其中,ViT-B/16模型使用 ImageNet-21K 作为预训练模型,ViT-L/14使用 CLIP 作为预训练模型。
以下为使用FME Benchmark中的子数据集OxfordFlowers[点击预览]进行finetune训练和评测的示例代码:
import tempfile
from modelscope.msdatasets import MsDataset
from modelscope.metainfo import Trainers
from modelscope.trainers import build_trainer
from modelscope.utils.constant import DownloadMode
# 模型ID
model_id = 'damo/cv_vitb16_classification_vision-efficient-tuning-sidetuning'
# 加载训练集
ms_train_dataset = MsDataset.load(
'foundation_model_evaluation_benchmark',
namespace='damo',
subset_name='OxfordFlowers',
split='train',
download_mode=DownloadMode.FORCE_REDOWNLOAD)
# 加载验证集
ms_eval_dataset = MsDataset.load(
'foundation_model_evaluation_benchmark',
namespace='damo',
subset_name='OxfordFlowers',
split='eval',
download_mode=DownloadMode.FORCE_REDOWNLOAD)
tmp_dir = tempfile.TemporaryDirectory().name # 使用临时目录作为工作目录
# 修改配置文件
def cfg_modify_fn(cfg):
max_epochs = 1 # 最大训练轮次
cfg.model.head.num_classes = 102 # 类别数
cfg.model.finetune = True # 进行微调
cfg.train.max_epochs = max_epochs # 最大训练轮次
cfg.train.lr_scheduler.T_max = max_epochs # 学习率调度器的参数
return cfg
# 构建训练器
kwargs = dict(
model=model_id, # 模型id
work_dir=tmp_dir, # 工作目录
train_dataset=ms_train_dataset, # 训练集
eval_dataset=ms_eval_dataset, # 验证集
cfg_modify_fn=cfg_modify_fn # 用于修改训练配置文件的回调函数
)
trainer = build_trainer(name=Trainers.vision_efficient_tuning, default_args=kwargs)
# 进行训练
trainer.train()
# 进行评估
result = trainer.evaluate()
print('result:', result)
训练说明见示例代码中的注释部分,详细的训练说明和用法见官方的训练文档。
如果该模型对您有所帮助,请引用下面的相关的论文:
@inproceedings{sidetuning2019,
title={Side-tuning: Network Adaptation via Additive Side Networks},
author={Jeffrey O. Zhang and Alexander Sax and Amir Zamir and Leonidas J. Guibas and Jitendra Malik},
booktitle=ECCV,
year={2019}
}