首页 > 其他分享 >基于Hugging Face的transformers包的微调模型训练

基于Hugging Face的transformers包的微调模型训练

时间:2022-09-01 18:12:36浏览次数:97  
标签:map transformers label2id Hugging dataset Face train import label

transformers API参考链接:https://huggingface.co/docs/transformers/v4.21.2/en/training

train.py

from datasets import load_dataset
from transformers import AutoTokenizer,AutoConfig
from transformers import DataCollatorWithPadding
from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer
import os
import json

#from datasets import load_metric

os.environ["CUDA_VISIBLE_DEVICES"]= "1,2,3,4,5,6,7"

# 加载数据集(训练数据、测试数据)
dataset = load_dataset("csv", data_files={"train": "./weibo_train.csv", "test": "./weibo_test.csv"}, cache_dir="./cache")
dataset = dataset.class_encode_column("label") #对标签类进行编码,此过程对训练集的标签进行汇总

# 利用加载的数据集,对label进行编号,生成label_map,以便于训练、及后续的推理、计算准确率等
def generate_label_map(dataset):
    labels=dataset['train'].features['label'].names
    label2id=dict()
    for idx,label in enumerate(labels):
        label2id[label]=idx
    return label2id

def save_label_map(dataset,label_map_file):
    # only take the labels of the training data for the label set of the model.
    label2id=generate_label_map(dataset)
    with open(label_map_file,'w',encoding='utf-8') as fout:
        json.dump(label2id,fout)

# 保存label map
label_map_file='label2id.json'
save_label_map(dataset,label_map_file)

# 读取label map【注意,在多卡训练时,这种读取文件的方法可能会导致报错】
#label2id={}
#with open(label_map_file,'r',encoding='utf-8') as fin:
#    label2id=json.load(fin)

label2id=generate_label_map(dataset)

if not label2id:
    exit()
id2label={id:label for label,id in label2id.items()}
#加载tokenizer,会自动下载
tokenizer = AutoTokenizer.from_pretrained("./bert-base-chinese") 


def preprocess_function(examples):
    return tokenizer(examples["text"], truncation=True, max_length=45)

tokenized_dataset = dataset.map(preprocess_function, batched=True)

#small_eval_dataset = tokenized_dataset["test"].shuffle(seed=42).select(range(1000))
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

config = AutoConfig.from_pretrained("./bert-base-chinese", num_labels=len(label2id), id2label=id2label, label2id=label2id)
# 加载Bert预训练模型
model=AutoModelForSequenceClassification.from_pretrained("./bert-base-chinese",config=config)


training_args = TrainingArguments(
    output_dir="./results",
    learning_rate=2e-5,
    per_device_train_batch_size=180,
    per_device_eval_batch_size=128,
    num_train_epochs=20,
    weight_decay=0.01,
    #fp16=True,
    evaluation_strategy="epoch",
    save_strategy="epoch",
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset["train"],
    eval_dataset=tokenized_dataset["test"],
    #train_dataset=small_train_dataset,
    #eval_dataset=small_eval_dataset,
    tokenizer=tokenizer,
    data_collator=data_collator,
    compute_metrics=compute_metrics,
)

print("training sample: ", trainer.train_dataset[1])

trainer.train()

print("finished")

2、推理

参考文档:https://huggingface.co/docs/transformers/v4.21.2/en/pipeline_tutorial

infer.py

from transformers import pipeline
from transformers.pipelines.pt_utils import KeyDataset
from datasets import load_dataset
import datasets
from sklearn.metrics import accuracy_score


# 加载测试数据
#dataset = load_dataset("csv", data_files={"train": "", "test": "./weibo_test.csv"}, split='test')
dataset=load_dataset("csv", data_files={"train": "weibo_train.csv", "test": "weibo_test.csv"}, cache_dir="./cache")

# 加载模型
model_dir='./results/checkpoint-1200'
print('using checkpoint from dir:',model_dir)
pipe = pipeline(task="text-classification",device=0,model=model_dir)

# 模型预测
preds=[]
for out in pipe(KeyDataset(dataset['test'], "text"), batch_size=128, truncation="only_first"):
    print(out)
    #print(out['label'])
    preds.append(out['label'])

'''
with open('pred.txt','w',encoding='utf8') as fout:
    for label in preds:
        fout.write(label)
        fout.write('\n')
'''

# 计算准确率
y_true=dataset['test']['label']
acc=accuracy_score(y_true,preds)
print('Acc on test data:{:.4f}'.format(acc))

 

标签:map,transformers,label2id,Hugging,dataset,Face,train,import,label
From: https://www.cnblogs.com/aaronhoo/p/16647420.html

相关文章

  • c#通过interface调用封装在dll中的实现
    如果在每个dll中都声明一模一样的interface,照样会遇到编译期提示类名不一致的问题。因为夸dll时,c#并不是完全通过interface名字和namaspace来判断是否是同一个接口,所以需......
  • 利用Hugging Face中的模型进行句子相似性实践
      HuggingFace是什么?它作为一个GitHub史上增长最快的AI项目,创始人将它的成功归功于弥补了科学与生产之间的鸿沟。什么意思呢?因为现在很多AI研究者写了大量的论文和开源......
  • 【OpenFace】使用命令行单个/批量处理图像/视频
    在OpenFace的可执行文件夹Release下运行cmd以识别单个视频为例:命令行参数参考:https://blog.csdn.net/bj233/article/details/113737268?utm_medium=distribute.pc_rel......
  • 在 ML.NET 中使用Hugginface Transformer
    本文主要来自https://rubikscode.net/2021/10/25/using-huggingface-transformers-with-ml-net/,根据自己的理解做了一些修改。ML.NET集成的ONNX运行时,Hugginface提供了......
  • final、static、abstract修饰符以及Interface接口
    转载:https://www.cnblogs.com/gbxblog/p/13887382.htmlfinal可以修饰:类、变量、方法当final修饰类的时候,说明该类不能被继承。当final修饰方法的时候,说明该方法不能被重......
  • type 和 interface的区别
    type和interface的区别一咻世界都变了 3人赞同了该文章 相同点1、都可以描述一个对象或者函数【interface】interfaceUser{n......
  • CSS3 响应式布局: @media (min/max-width:***) @font-face
    https://www.cnblogs.com/hualiu0/p/5319046.html 响应式布局responsivedesign@media属性bootstrap css分析:@media(min-width:768px){body{***}}use@me......
  • 基于泛型实现的B-Tree号称比用interface的快20%~30%
    测试比较的是在B-Tree里面存放int类型数字这个非常特殊的场景。Google的实现中参数都是interface,因为int类型的数字要转成interface,且发生了逃逸。用泛型减少了数字分配到......
  • @FunctionalInterface 函数式接口
    作用:在编译过程中,校验该接口只有一个抽象方法;解释:除了唯一的抽象方法外,可以包含已经有实现的方法(包括静态方法);使用:可以使用Lambda表达式来表示该接口的一个实现:@Functi......
  • wasm的 surface.makeSurface
    wasm的surface.makeSurfacejs中:  CanvasKit.Surface.prototype.makeSurface=function(imageInfo){  CanvasKit.setCurrentContext(this._context);  var......