网站建设费计入 科目,建网站内容,四川省的住房和城乡建设厅网站,中国平安财产保险公司官网目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理#xff0c;transformer库能关联到huggface中对应的模型transformer库能关联到huggface中对应的模型并且提供简洁的transformer模型调用这大大提高了开发人员的开发效率。本博客主要利用transformer库实现一个简单的模型微调以进行图像分类的任务。 一、环境准备 使用终端命令行安装对应的第三方包具体安装命令输入如下
pip install transformers datasets evaluate二、基于Pytorch的预训练模型 由于下面这些内容需要在huggface上申请账号权限才能进行模型和数据集加载如果之前有从huggface上拉取模型和数据集的经验可以略过如果没有配置过可以参考笔者之前的文章https://blog.csdn.net/qq_40734883/article/details/143922095然后直接申请Write权限就可以。 后续所有涉及到的数据集food101和transformer模型都需要参考上述文章进行直接下载才能运行整个程序或者在google的colab直接运行。 如果在google的colab上运行请提前设置好电脑的GPU资源同时加入huggface登录代码具体如下
from huggingface_hub import notebook_login
notebook_login()运行之后会提示进行token输入按之前获取到的token输入即可。
1、准备数据集 这里以food101数据集作为微调数据集在imagenet-21k上训练完成的transformer模型vit-base-patch16-224进行优化
from datasets import load_datasetfood load_dataset(food101, splittrain[:5000])# 划分数据集训练集:测试集8:2food有两个键一个train一个test
food food.train_test_split(test_size0.2) # 标签转换
labels food[train].features[label].names
label2id, id2label dict(), dict()
for i, label in enumerate(labels):label2id[label] str(i)id2label[str(i)] label id2label为通过id访问标签的字典后续会使用到。
2、加载预训练模型
from transformers import AutoImageProcessorcheckpoint google/vit-base-patch16-224-in21k # ImageNet-21k上的预训练模型
image_processor AutoImageProcessor.from_pretrained(checkpoint) # 从huggface拉取并加载模型3、 使用pytorch进行模型构建
from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor# 数据预处理操作定义
normalize Normalize(meanimage_processor.image_mean, stdimage_processor.image_std)
size (image_processor.size[shortest_edge]if shortest_edge in image_processor.sizeelse (image_processor.size[height], image_processor.size[width])
)
_transforms Compose([RandomResizedCrop(size), ToTensor(), normalize])# 对原始数据进行RGB及字典化
def transforms(examples):examples[pixel_values] [_transforms(img.convert(RGB)) for img in examples[image]]del examples[image]return examplesfood food.with_transform(transforms)# 验证
import evaluate
# 指定验证过程中的评价指标-准确率
accuracy evaluate.load(accuracy)import numpy as np
def compute_metrics(eval_pred):predictions, labels eval_predpredictions np.argmax(predictions, axis1)return accuracy.compute(predictionspredictions, referenceslabels)训练设置和运行具体输入代码如下
# 整合训练中的数据以便在模型训练或评估过程中使用
from transformers import DefaultDataCollator
data_collator DefaultDataCollator()from transformers import AutoModelForImageClassification, TrainingArguments, Trainer# 初始化模型
model AutoModelForImageClassification.from_pretrained(checkpoint,num_labelslen(labels),id2labelid2label,label2idlabel2id,
)# 设置模型优化参数
training_args TrainingArguments(output_dirmy_awesome_food_model,remove_unused_columnsFalse,evaluation_strategyepoch,save_strategyepoch,learning_rate5e-5,per_device_train_batch_size16,gradient_accumulation_steps4,per_device_eval_batch_size16,num_train_epochs3,warmup_ratio0.1,logging_steps10,load_best_model_at_endTrue,metric_for_best_modelaccuracy,push_to_hubTrue,
)# 初始化训练实例
trainer Trainer(modelmodel,argstraining_args,data_collatordata_collator,train_datasetfood[train],eval_datasetfood[test],tokenizerimage_processor,compute_metricscompute_metrics,
)trainer.train() # 开始训练trainer.push_to_hub() # 推送到huggfacehub经过上述设置训练完成之后会将模型微调结果推送到huggface平台如果不想推送可以不运行相关的命令行并且training_args中的push_to_hubFalse。 训练结果如下图所示 默认需要选择是否关联wandb如果不想选择直接根据设置提示跳过即可。 如果选择了推送到huggfacehubtrainer.push_to_hub() 的话在个人的huggface上会有一个名为my_awesome_food_model的模型里面包含了模型训练的各个参数设置和测试结果。 三、基于keras的预训练模型 使用transflow的keras API 进行模型的搭建具体代码如下
from transformers import create_optimizer# 超参数设置
batch_size 16
num_epochs 5
num_train_steps len(food[train]) * num_epochs
learning_rate 3e-5
weight_decay_rate 0.01# 定义优化方式和策略
optimizer, lr_schedule create_optimizer(init_lrlearning_rate, num_train_stepsnum_train_steps, weight_decay_rateweight_decay_rate, num_warmup_steps0)# 定义分类器
from transformers import TFAutoModelForImageClassification
model TFAutoModelForImageClassification.from_pretrained(checkpoint, id2labelid2label, label2idlabel2id)# converting our train dataset to tf.data.Dataset
tf_train_dataset food[train].to_tf_dataset(columnspixel_values, label_colslabel, shuffleTrue, batch_sizebatch_size, collate_fndata_collator)# converting our test dataset to tf.data.Dataset
tf_eval_dataset food[test].to_tf_dataset(columnspixel_values, label_colslabel, shuffleFalse, batch_sizebatch_size, collate_fndata_collator)# 定义损失函数
from tensorflow.keras.losses import SparseCategoricalCrossentropy
loss tf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue)model.compile(optimizeroptimizer, lossloss)from transformers.keras_callbacks import KerasMetricCallback, PushToHubCallback
# 定义验证指标
metric_callback KerasMetricCallback(metric_fncompute_metrics, eval_datasettf_eval_dataset)
# 推送到huggface回调函数
push_to_hub_callback PushToHubCallback(output_dirfood_classifier, tokenizerimage_processor, save_strategyno)
callbacks [metric_callback, push_to_hub_callback]# 开始训练
model.fit(tf_train_dataset, validation_datatf_eval_dataset, epochsnum_epochs, callbackscallbacks)四、模型测试 这里使用微调好的模型在food101上找一张验证图像进行简单的验证测试具体代码如下
# 验证food中验证集的某一张图像
ds load_dataset(food101, splitvalidation[-5:-1])
image ds[image][-1]# visualize image
import matplotlib.pyplot as plt
plt.imshow(image)
plt.axis(off)
plt.show()测试图像如下所示 from transformers import pipeline
# initialize classifier instance
classifier pipeline(image-classification, modelmy_awesome_food_model)
classifier(image)from transformers import AutoImageProcessor
import torch
# load pre-trained image processor
image_processor AutoImageProcessor.from_pretrained(my_awesome_food_model)
inputs image_processor(image, return_tensorspt)from transformers import AutoModelForImageClassification
# laod pre-trained model
model AutoModelForImageClassification.from_pretrained(my_awesome_food_model)
with torch.no_grad():logits model(**inputs).logits# 输出测试结果
predicted_label logits.argmax(-1).item()
print(model.config.id2label[predicted_label])输出结果如下所示
Device set to use cuda:0
[{label: ramen, score: 0.9517934918403625},{label: bruschetta, score: 0.7566707730293274},{label: hamburger, score: 0.7004948854446411},{label: chicken_wings, score: 0.6275856494903564},{label: prime_rib, score: 0.5991673469543457}]预测结果为ramen。 释义“ramen”一词源于日语“ラーメン”是“拉面”的意思。它进一步追溯至汉语“拉面”是一种起源于中国、流行于日本及其他东亚地区的面条食品。在日本拉面通常由小麦面粉制成的面条搭配肉汤和各种配料如叉烧、鸡蛋、蔬菜等。
五、参考
[1] https://huggingface.co/docs/transformers/main/tasks/image_classification
[2] https://github.com/huggingface/transformers/blob/main/docs/source/en/installation.md