- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
翻译自: Fine-tuning a model with the Trainer API 。
Transformers 提供了一个 Trainer 类,处理微调在数据集上提供的任何预训练模型。 完成所有数据预处理工作后,只需执行几个步骤即可定义 Trainer。 最困难的部分可能是准备运行 Trainer.train() 的环境,因为它在 CPU 上运行速度非常慢。 如果没有设置 GPU,可以在 Google Colab 上访问免费的 GPU 或 TPU。 下面的代码示例假设已经完成了数据预处理的操作:
from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorWithPadding
raw_datasets = load_dataset("glue", "mrpc")
checkpoint = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
def tokenize_function(example):
return tokenizer(example["sentence1"], example["sentence2"], truncation=True)
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
map函数与DataCollatorWithPadding函数请查阅: Processing the data 。
定义 Trainer 之前的第一步是定义一个 TrainingArguments 类,该类将包含 Trainer 用于训练和评估的所有超参数。 必须提供的唯一参数是保存训练模型的目录以及checkpoint。 对于其余所有内容,可以保留默认值,这对于基本的微调应该非常有效.
from transformers import TrainingArguments
training_args = TrainingArguments("test-trainer")
第二步是定义我们的模型。 使用 AutoModelForSequenceClassification 类,它带有两个标签:
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
一旦我们有了模型,我们就可以通过传递迄今为止构建的所有对象来定义 Trainer --- Model 、 training_args 、 training 和 validation datasets 、 data_collator 和 tokenizer :
from transformers import Trainer
trainer = Trainer(
model,
training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
tokenizer=tokenizer,
)
要在数据集上微调模型,我们只需调用训练器的 train() 方法:
trainer.train()
这将开始微调(在 GPU 上应该需要几分钟)并每 500 步报告一次训练损失。 但是,它不会告诉你模型的表现有多好(或多差)。 这是因为:
evaluation_strategy
设置为“ steps
”(评估每个 eval_steps
)或“ epoch
”(在每个 epoch
结束时评估)来进行评估。 compute_metrics()
函数来在所述评估期间计算指标(否则评估只会打印损失,这不是一个非常直观的数字)。 让我们看看如何构建一个有用的 compute_metrics() 函数并在下次训练时使用它。 该函数必须采用 EvalPrediction 对象(这是一个带有预测字段和 label_ids 字段的命名元组),并将返回一个将字符串映射到浮点数的字典(字符串是返回的指标的名称,浮点数是它们的值)。 为了从我们的模型中获得一些预测,我们可以使用 Trainer.predict() 方法:
predictions = trainer.predict(tokenized_datasets["validation"])
print(predictions.predictions.shape, predictions.label_ids.shape)
## 输出
(408, 2) (408,)
Predict() 方法的输出是另一个具有三个字段的命名元组:预测、label_ids 和指标。 指标字段将仅包含传递的数据集的损失,以及一些时间指标(预测所需的总时间和平均时间)。 一旦我们完成了 compute_metrics() 函数并将其传递给Trainer,该字段还将包含 compute_metrics() 返回的指标。 结果所展示的预测是一个形状为 408 x 2 的二维数组(408 是我们使用的数据集中的元素数量)。 这些是我们传递给 predict() 的数据集每个元素的logits。 为了将它们转换为可以与标签进行比较的预测,我们需要在第二个轴上获取最大值的索引:
import numpy as np
preds = np.argmax(predictions.predictions, axis=-1)
我们现在可以将这些预测与标签进行比较。 为了构建我们的 compute_metric() 函数,我们将依赖于HuggingFace Evaluate库中的指标。 我们可以像加载数据集一样轻松地加载与 MRPC 数据集关联的指标,这次使用 evaluate.load() 函数。 返回的对象有一个 compute() 方法,我们可以用它来进行度量计算:
import evaluate
metric = evaluate.load("glue", "mrpc")
metric.compute(predictions=preds, references=predictions.label_ids)
## 输出:
{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542}
获得的确切结果可能会有所不同,因为 Model Head 部分的随机初始化可能会改变它实现的指标。 在这里,我们可以看到我们的模型在验证集上的准确率为 85.78%,F1 得分为 89.97。 这些是用于评估 GLUE 基准的 MRPC 数据集结果的两个指标。 BERT 论文中的表格报告了基本模型的 F1 分数为 88.9,这是非case的模型,而我们目前使用的是case的模型,这解释了更好的结果。 将所有内容包装在一起,我们得到了 compute_metrics() 函数:
def compute_metrics(eval_preds):
metric = evaluate.load("glue", "mrpc")
logits, labels = eval_preds
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
为了查看它在每个epoch结束时报告指标的实际使用情况,下面是我们如何使用这个 compute_metrics() 函数定义一个新的 Trainer
training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch")
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
trainer = Trainer(
model,
training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
tokenizer=tokenizer,
compute_metrics=compute_metrics,
)
请注意,我们创建了一个新的 TrainingArguments ,其评估策略设置为“ epoch ”和一个新模型 - 否则,我们将继续训练已经训练过的模型。 要启动新的训练运行,我们执行:
trainer.train()
这次,除了训练损失之外,它将在每个时期结束时报告验证损失和指标。 同样,由于模型的Model Head初始化,你达到的确切准确度/F1 分数可能与我们发现的有所不同,但它应该处于相同的范围内。 Trainer 将在多个 GPU 或 TPU 上开箱即用,并提供许多选项,例如混合精度训练(在训练参数中使用 fp16 = True).
最后此篇关于聊聊预训练模型的微调的文章就讲到这里了,如果你想了解更多关于聊聊预训练模型的微调的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在阅读哈德利的 Advanced R并尝试一些东西。我正在尝试创建一个 lazy闭包函数返回一个带有提供的函数 data.frame在其环境中以及使用 with并且能够在以后提供额外的函数参数。
我有两个 ViewController。初始 ViewController 是输入和存储 URL 的地方。此初始 ViewController 的 viewDidLoad 还应该在应用程序启动时开始加
你是怎么用的 对于应用程序中的 ListView 项也应该在设备 <11 上运行? 由于 activated_state 在 HC 之前不可用,我只能想到两个肮脏的解决方法: 在您的 Activit
我正在为 android (2.1 > 3.1) 编写一个应用程序,我想使用熟悉的做法,即在 Honeycomb 应用程序中使用应用程序图标来进入家庭 Activity ,但是,当我之前运行该 Act
如果搜索的键不存在,我如何覆盖方法 GET 或编写一个将在服务器端执行的新函数返回另一个键值? 示例: 如果关键字“word_1 word_2 word_3 word_4”不存在则搜索关键字“word
对于我的存储库,我使用的是 Git 和 Stash。在 Stash 端,我限制了(只读)对 master 的访问权限,因此任何用户都可以从 master 分支分支以获取功能/分支,但不能直接 merg
如何配置dgrid及其存储以定义渲染行时是否已经选择了行? 例如,如果我的行数据是这样的: { id: 1, name: 'Item Name', selected: true } 我当前
有没有一种方法可以将变量从一个 BeanShell 前/后处理器引用到另一个 BeanShell 处理器(它们在同一个线程组中)? 如果我在 HTTP 请求下的 BeanShell 预处理器中创建了一
问题 我已尝试添加预操作 shell 脚本,这些脚本会根据我正在构建的内容打开/关闭我的 .pch 文件中的某些定义。 但是,在运行构建时,没有任何反应。我不是一个流利的 shell 脚本编写者,所以
我有一个 HTML 字符串用作 jQuery 输入文档。 // the variable html contains the HTML code jQuery( html ).find( 'p' ).
在 Mercurial 中允许 merge 之前有没有办法进行一些检查? 通过将以下内容添加到 ~/.hg/hgrc,我找到了更新前 Hook ,并拥有一个在允许更新之前运行的脚本: [hooks]
总结: 预 Controller Hook 是否在缓存期间执行?是否有任何 Hook 点可以执行? (系统前?) 我应该强调一个事实,即 Hook 不会影响发送到浏览器的内容。这不是问题。 详细版:
我正在使用适用于 android 的 Skobbler Map API,到目前为止它一直非常好。按照官方的“操作方法”,我已经能够将 map 应用到我的应用程序中。比我可以让应用程序下载 map 并离
当我安装bcrypt时我的 hapi js 项目的模块尚未安装,它显示类似 node-pre-gyp install --fallback-to-build 我尝试通过运行来安装; npm i nod
我试图使用此代码的变体: apply plugin: 'java' apply plugin: 'idea' idea.workspace.iws.withXml { provider ->
假设我们有一个 PHP 项目,其依赖项 A 和 B 分别依赖于 PHP 库 X,但版本不同。 通常,人们会使用诸如 composer 之类的 PHP 依赖管理器,它可以通过在与 A 和 B 兼容的版本
这似乎违背了代码块的目的,但我希望能够在代码块中加粗。例如,如果我想将返回行加粗: int main(void) { **return 0;** } 最佳答案 您必须在 HTML 中执行此操作
我们是否应该使用 Huggingface(预)训练一个 BERT 无框模型的小写输入数据?我查看了 Thomas Wolf ( https://github.com/huggingface/trans
我有两个模式: 技能: var mongoose = require("mongoose"); var SkillSchema = new mongoose.Schema({ skill: {
我这里有问题。这适用于 Chrome,但我无法在 IE11 的 index.html 中使用任何动画。当它不想工作时,我会看到一个静态屏幕。同样在 IE 中,消息不会像它应该的那样消失。如果我将 di
我是一名优秀的程序员,十分优秀!