前言

  • 本文主要针对Hugging Face平台中的图像分类模型,在自己数据集上进行微调,预训练模型为Googlevit-base-patch16-224模型,模型简介页面。
  • 代码运行于kaggle平台上,使用平台免费GPU,型号P100,笔记本地址,欢迎大家copy & edit
  • Github项目地址,Hugging Face模型微调文档

依赖安装

  • 如果是在本地环境下运行,只需要同时安装3个包就好transformersdatasetsevaluate,即pip install transformers datasets evaluate
  • 在kaggle中因为accelerate包与环境冲突,所以需要从项目源进行安装,即:
import IPython.display as display
! pip install -U git+https://github.com/huggingface/transformers.git
! pip install -U git+https://github.com/huggingface/accelerate.git
! pip install datasets
display.clear_output()
  • 因为安装过程中会产生大量输出,所以使用display.clear_output()清空jupyter notebook的输出。

数据处理

  • 这里使用kaggle中的图像分类公共数据集,5 Flower Types Classification Dataset,数据结构如下:
 - flower_images- Lilly- 000001.jpg- 000002.jpg- ......- Lotus- 001001.jpg- 001002.jpg- ......- Orchid- Sunflower
  • 可以看到flower_images为主文件夹,Lilly,Lotus,Orchid,Sunflower为各类花的种类,每类花的图片数量均为1000张
  • 微调模型图像的数据集读取与加载需要使用datasets包中的load_dataset函数,有关该函数的文档
from datasets import load_dataset
from datasets import load_metric
# 加载本地数据集
dataset = load_dataset("imagefolder", data_dir="/kaggle/input/5-flower-types-classification-dataset/flower_images")
# 整合数据标签与下标
labels = dataset["train"].features["label"].nameslabel2id, id2label = dict(), dict()
for i, label in enumerate(labels):label2id[label] = iid2label[i] = labelmetric = load_metric("accuracy")
display.clear_output()
  • 如果想要查看图片,可以使用image来访问
example = dataset["train"][0]
example['image'].resize((224, 224))

  • 确定想要进行微调的模型,加载其配置文件,这里选择vit-base-patch16-224,关于transfromers包中的AutoImageProcessor类,from_pretrained方法,请参见文档
from transformers import AutoImageProcessor
model_checkpoint = "google/vit-base-patch16-224"
batch_size = 64
image_processor  = AutoImageProcessor.from_pretrained(model_checkpoint)
image_processor
  • 根据vit-base-patch16-224预训练模型图像标准化参数标准化微调数据集,都是torchvision库中的一些常见变换,这里就不赘述了,重点是preprocess_trainpreprocess_val函数,分别用于标准化训练集与验证集。
from torchvision.transforms import (CenterCrop,Compose,Normalize,RandomHorizontalFlip,RandomResizedCrop,Resize,ToTensor,
)normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
if "height" in image_processor.size:size = (image_processor.size["height"], image_processor.size["width"])crop_size = sizemax_size = None
elif "shortest_edge" in image_processor.size:size = image_processor.size["shortest_edge"]crop_size = (size, size)max_size = image_processor.size.get("longest_edge")train_transforms = Compose([RandomResizedCrop(crop_size),RandomHorizontalFlip(),ToTensor(),normalize,])val_transforms = Compose([Resize(size),CenterCrop(crop_size),ToTensor(),normalize,])def preprocess_train(example_batch):example_batch["pixel_values"] = [train_transforms(image.convert("RGB")) for image in example_batch["image"]]return example_batchdef preprocess_val(example_batch):example_batch["pixel_values"] = [val_transforms(image.convert("RGB")) for image in example_batch["image"]]return example_batch
  • 划分数据集,并分别将训练集与验证集进行标准化
# 划分训练集与测试集
splits = dataset["train"].train_test_split(test_size=0.1)
train_ds = splits['train']
val_ds = splits['test']train_ds.set_transform(preprocess_train)
val_ds.set_transform(preprocess_val)display.clear_output()

微调模型

  • 加载预训练模型使用transformers包中AutoModelForImageClassification类,from_pretrained方法,参考文档
  • 需要注意的是ignore_mismatched_sizes参数,如果你打算微调一个已经微调过的检查点,比如google/vit-base-patch16-224(它已经在ImageNet-1k上微调过了),那么你需要给from_pretrained方法提供额外的参数ignore_mismatched_sizes=True。这将确保输出头(有1000个输出神经元)被扔掉,由一个新的、随机初始化的分类头取代,其中包括自定义数量的输出神经元。你不需要指定这个参数,以防预训练的模型不包括头。
from transformers import AutoModelForImageClassification, TrainingArguments, Trainermodel = AutoModelForImageClassification.from_pretrained(model_checkpoint, label2id=label2id,id2label=id2label,ignore_mismatched_sizes = True)
display.clear_output()
  • 配置训练参数由TrainingArguments函数控制,该函数参数较多,参考文档
model_name = model_checkpoint.split("/")[-1]args = TrainingArguments(f"{model_name}-finetuned-eurosat",remove_unused_columns=False,evaluation_strategy = "epoch",save_strategy = "epoch",save_total_limit = 5,learning_rate=5e-5,per_device_train_batch_size=batch_size,gradient_accumulation_steps=1,per_device_eval_batch_size=batch_size,num_train_epochs=20,warmup_ratio=0.1,logging_steps=10,load_best_model_at_end=True,metric_for_best_model="accuracy",)
  • 我解释一下上面出现的一些参数

    • output_dir:模型预测和检查点的输出目录
    • remove_unused_columns:是否自动删除模型转发方法未使用的列
    • evaluation_strategy: 在训练期间采用的评估策略
    • save_strategy:在训练期间采用的检查点保存策略
    • save_total_limit:限制检查点的总数,删除较旧的检查点
    • learning_rateAdamW优化器的初始学习率
    • per_device_train_batch_size:训练过程中GPU/TPU/CPU核心batch大小
    • gradient_accumulation_steps:在执行向后/更新传递之前累积梯度的更新步数
    • per_device_eval_batch_size:评估过程中GPU/TPU/CPU核心batch大小
    • num_train_epochs:要执行的训练时期总数
    • warmup_ratio:用于学习率从0到线性预热的总训练步数的比率
    • logging_steps:记录steps间隔数
    • load_best_model_at_end:是否在训练结束时加载训练期间找到的最佳模型
    • metric_for_best_model:指定用于比较两个不同模型的指标
  • 制定评估指标函数
import numpy as np
import torchdef compute_metrics(eval_pred):predictions = np.argmax(eval_pred.predictions, axis=1)return metric.compute(predictions=predictions, references=eval_pred.label_ids)def collate_fn(examples):pixel_values = torch.stack([example["pixel_values"] for example in examples])labels = torch.tensor([example["label"] for example in examples])return {"pixel_values": pixel_values, "labels": labels}
  • 传递训练配置,准备开始微调模型,Trainer函数,参考文档
trainer = Trainer(model,args,train_dataset=train_ds,eval_dataset=val_ds,tokenizer=image_processor,compute_metrics=compute_metrics,data_collator=collate_fn,)
  • 同样的,我解释一下上面的一些参数

    • model:训练、评估或用于预测的模型
    • args:调整训练的参数
    • train_dataset:用于训练的数据集
    • eval_dataset:用于评估的数据集
    • tokenizer:用于预处理数据的标记器
    • compute_metrics:将用于在评估时计算指标的函数
    • data_collator:用于从train_dataseteval_dataset的元素列表形成批处理的函数
  • 开始训练,并在训练完成后保存模型权重,模型训练指标变化,模型最终指标。
train_results = trainer.train()
# 保存模型
trainer.save_model()
trainer.log_metrics("train", train_results.metrics)
trainer.save_metrics("train", train_results.metrics)
trainer.save_state()
  • 在训练过程中可选择使用wandb平台对训练过程进行实时监控,但需要注册一个账号,获取对应api,个人推荐使用,当然也可以ctrl+q选择退出。
  • 训练输出:
Epoch    Training Loss   Validation Loss Accuracy
1   0.384800    0.252986    0.948000
2   0.174000    0.094400    0.968000
3   0.114500    0.070972    0.978000
4   0.106000    0.082389    0.972000
5   0.056300    0.056515    0.982000
6   0.044800    0.058216    0.976000
7   0.035700    0.060739    0.978000
8   0.068900    0.054247    0.980000
9   0.057300    0.058578    0.982000
10  0.067400    0.054045    0.980000
11  0.067100    0.051740    0.978000
12  0.039300    0.069241    0.976000
13  0.029000    0.056875    0.978000
14  0.027300    0.063307    0.978000
15  0.038200    0.056551    0.982000
16  0.016900    0.053960    0.984000
17  0.021500    0.049470    0.984000
18  0.031200    0.049519    0.984000
19  0.030500    0.051168    0.984000
20  0.041900    0.049122    0.984000
***** train metrics *****epoch                    =         20.0total_flos               = 6494034741GFtrain_loss               =       0.1092train_runtime            =   0:44:01.61train_samples_per_second =       34.062train_steps_per_second   =        0.538

wandb平台指标可视化







评估模型

metrics = trainer.evaluate()
# some nice to haves:
trainer.log_metrics("eval", metrics)
trainer.save_metrics("eval", metrics)

输出:

***** eval metrics *****epoch                   =       20.0eval_accuracy           =      0.984eval_loss               =      0.054eval_runtime            = 0:00:11.18eval_samples_per_second =     44.689eval_steps_per_second   =      0.715

微调Hugging Face中图像分类模型相关推荐

  1. 10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...

    译者 | linstancy 作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan 编辑 | 蓝色琥珀鱼, ...

  2. Facebook AI 提出10亿级数据规模的半监督图像分类模型,ImageNet测试精度高达81.2%!...

    译者 | linstancy 作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan 编辑 | 蓝色琥珀鱼, ...

  3. huggingface中Bert模型的简单使用

    因为项目和毕设的缘故,做了挺多关于Bert分类的实际操作的,本文主要记录下transformers库中使用较多的类. 在本文中,你将看到 huggingface(hf)中Bert模型的简单介绍 Ber ...

  4. 使用Python+OpenCV+Keras创建自己的图像分类模型

    介绍 你是否曾经偶然发现一个数据集或图像,并想知道是否可以创建一个能够区分或识别图像的系统? 图像分类的概念将帮助我们解决这个问题.图像分类是计算机视觉最热门的应用之一,是任何想在这个领域工作的人都必 ...

  5. keras构建卷积神经网络(CNN(Convolutional Neural Networks))进行图像分类模型构建和学习

    keras构建卷积神经网络(CNN(Convolutional Neural Networks))进行图像分类模型构建和学习 全连接神经网络(Fully connected neural networ ...

  6. 基于Keras Application和Densenet迁移学习(transfer learning)的乳腺癌图像分类模型(良性、恶性)

    基于Keras Application和Densenet迁移学习(transfer learning)的乳腺癌图像分类模型(良性.恶性) 概论: 美国癌症学会官方期刊发表<2018年全球癌症统计 ...

  7. 独家 | 手把手教你用Python构建你的第一个多标签图像分类模型(附案例)

    翻译:吴金笛 校对:郑滋 本文约4600字,建议阅读12分钟. 本文明确了多标签图像分类的概念,并讲解了如何构建多标签图像分类模型. 介绍 你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情 ...

  8. 实操指南:用谷歌AutoML构建图像分类模型

    2020-03-16 12:31:00 全文共2710字,预计学习时长8分钟 如何用谷歌AutoML创建单标签分类模型? 今天我们将使用一个来自generated.photos的AI生成的人脸数据集, ...

  9. python如何训练模型生产_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...

    你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情: 对象检测 图像分割 图像翻译 对象跟踪(实时),还有更多-- 这让我思考--如果一个图像中有多个对象类别,我们该怎么办?制作一个图像分类 ...

最新文章

  1. win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
  2. linux学习治疗,这时代,医生都用VR帮你看病了!
  3. [Hadoop][Zookeeper]Cluster + HA
  4. 反编译linux内核_Linux 后台开发常用调试工具
  5. Linux中文显示乱码?如何设置centos显示中文
  6. centos7安装face_recognition踩各种坑
  7. 宝剑锋从磨砺出——使用在线评测平台磨砺C#使用能力
  8. 李开复:21世纪7种人才最抢手
  9. Point和PointF
  10. iphone屏蔽系统更新_屏蔽 iOS 系统更新的最新方法,支持所有 iPhone、iPad 设备
  11. php哈希取模,PHP取模hash和一致性hash操作Memcached分布式集群
  12. 计算机在气象预测的应用,计算机在地面气象观测中的实际应用
  13. Leetcode每日一题:514.freedom-trail(自由之路)
  14. Python Tricks(一)—— np.where 与最大最小截断
  15. erdas2015几何校正模块在哪_什么是几何校正和正射校正还有怎样用erdas做几何校正...
  16. 传统3D游戏引擎的Web化
  17. 计算机usb接口无法读取,USB设备识别不了,USB接口无法识别设备怎么办
  18. HRA系列DC-DC隔离电源模块接线注意事项
  19. 世界电影经典《第七封印》
  20. 《微观经济学新论》读书笔记

热门文章

  1. Android3D曲面控件,智能手表还能这么玩?3D曲面+安卓定制,OPPO操作绝了​
  2. 关于立创EDA使用的几点心得
  3. GitHub仓库当图床,免费使用cdn加速
  4. 图解:AI 与深度学习及机器学习,三者之间的区别
  5. 大白话聊框架设计(入门篇) | 第三章:通配符匹配Mapping实现
  6. ARM Cortex 三个系列
  7. NOWCODER 小木乃伊到我家(最短路spfa)
  8. Repeater ItemDataBound
  9. CorelDraw插件开发-VBA-常用功能-输出数据库文件-CDR插件
  10. 无心剑2022年七绝130首