Trainer参数解读
在学习完Tokenizer、Datasets、Model、Evaluate组件后,Trainer组件是用来训练模型的,也是最简
单的。以下是一个最基础的Trainer的参数示例:
1 2 3 4 5 6 7 8 9
| trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, tokenizer=tokenizer, data_collator=data_collator, compute_metrics=compute_metrics, )
|
接下来,以**情感分析(外卖评价)**为例进行参数解读一下。
1.参数构造
1.1导包
1 2
| from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset
|
1.2加载数据集
选择huggingface上的公开数据集,可以看到,他这个数据集是已经区分了训练集和测试集的。我们无需划分再次划分
1
| dataset = load_dataset("C-MTEB/waimai-classification")
|
数据集内容如下:
1 2 3 4 5 6 7 8 9 10
| DatasetDict({ test: Dataset({ features: ['label', 'text'], num_rows: 1000 }) train: Dataset({ features: ['label', 'text'], num_rows: 8000 }) })
|
看一下数据长什么样吧,看一下前几条。
| label |
review |
| 1 |
分量很足,不错,都是肉丁,还有青辣椒,不腻,下次尝尝别的口味的。 |
| 1 |
味道一如既往的好,说好的微辣呢,感觉比普通还辣,但盖不过眉州的美味,好评 |
| 0 |
不好吃,还不如食堂做的,这口味不值这个价 |
| 1 |
肘子挺好吃~ |
| 0 |
清炒菠菜根本无法吃,菠菜里的沙子没洗净 |
1.3加载分词器
1
| tokenizer = AutoTokenizer.from_pretrained("hfl/rbt3")
|
1.4数据集预处理
利用分词器把数据文本进行分词,并把分词后的结果转换为模型可读的格式。
1 2 3 4 5 6 7 8 9
| def process_function(examples): tokenized_examples = tokenizer(examples["text"], max_length=128, truncation=True,padding="max_length") tokenized_examples["labels"] = examples["label"] return tokenized_examples
tokenized_datasets = dataset.map(process_function, batched=True, remove_columns=dataset["train"].column_names)
|
结果如下:
1 2 3 4 5 6 7 8 9 10
| DatasetDict({ test: Dataset({ features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'], num_rows: 1000 }) train: Dataset({ features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'], num_rows: 8000 }) )}
|
1.5加载模型
1
| model = AutoModelForSequenceClassification.from_pretrained("hfl/rbt3")
|
1.6创建评估函数
1 2 3 4 5 6 7 8 9 10 11 12
| import evaluate acc_metric = evaluate.load("accuracy") f1_metirc = evaluate.load("f1") def eval_metric(eval_predict): predictions, labels = eval_predict predictions = predictions.argmax(axis=-1) acc = acc_metric.compute(predictions=predictions, references=labels) f1 = f1_metirc.compute(predictions=predictions, references=labels) acc.update(f1) return acc
|
1.7创建TrainingArguments(训练参数)
1 2 3
| train_args = TrainingArguments( output_dir="./checkpoints", )
|
TrainingArguments还支持一些自定义参数,比如:
1 2 3 4 5 6 7 8 9 10 11
| per_device_train_batch_size=64, per_device_eval_batch_size=128, logging_steps=10, evaluation_strategy="epoch", save_strategy="epoch", save_total_limit=3, learning_rate=2e-5, weight_decay=0.01, metric_for_best_model="f1", load_best_model_at_end=True, no_cuda=True,
|
2.参数传入Trainer
将第一步构建的参数传进来
1 2 3 4 5 6 7 8 9
| from transformers import DataCollatorWithPadding trainer = Trainer( model=model, args=train_args, train_dataset=tokenized_datasets["train"], eval_dataset=tokenized_datasets["test"], data_collator=DataCollatorWithPadding(tokenizer=tokenizer), tokenizer=tokenizer, compute_metrics=eval_metric)
|
3.开始训练
开始训练就很简单了,一句代码搞定
4.模型评估
使用数据集中的测试数据集进行评估
1
| trainer.evaluate(tokenized_datasets["test"])
|
输出结果如下:
1 2 3 4 5 6 7 8 9
| {'eval_loss': 0.2914249002933502, 'eval_accuracy': 0.894, 'eval_f1': 0.8290322580645162, 'eval_recall': 0.7907692307692308, 'eval_precision': 0.8711864406779661, 'eval_runtime': 2.8437, 'eval_samples_per_second': 351.651, 'eval_steps_per_second': 2.813, 'epoch': 3.0}
|
5.模型预测
使用pipeline来加载模型,进行预测。从checkpoint中进行加载
1 2 3 4 5 6 7 8
| from transformers import pipeline
model = AutoModelForSequenceClassification.from_pretrained("./checkpoints/checkpoint-3000")
tokenizer = AutoTokenizer.from_pretrained("hfl/rbt3")
model.config.id2label = {0: "差评", 1: "好评"} pipe = pipeline("text-classification", model=model, tokenizer=tokenizer, device=0)
|
使用pipe()预测