Huggingface--Quick tour


学习教程来自 Huggingface官网,此学习文档为个人笔记,主要学习pytorch框架的相关使用方法。

下载所有相关的库

! pip install transformers datasets

AutoClass

AutoTokenizer

一个tokenizer负责将文本处理成数字数组作为模型的输入。最重要的事情是需要实例化一个与模型名字相同的tokenizer,确保使用与模型预训练相同的tokenization规则。下面是使用AtuoTokenizer加载tokenizer的示例:

form transformers import AutoTokenizer
model_name = 'nlptown/bert-base-multilingual-uncased-sentiment'
tokenizer = AutoTokenizer.from_pretrained(model_name)

将自己的文本输入到tokenizer:

encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
print(encoding)

{‘input_ids’: [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
‘token_type_ids’: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
‘attention_mask’: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

tokenizer返回的字典包括:

  • input_ids: tokens的数字表示
  • attention_mask: 表示应关注哪些tokens

同时,tokenizer还可以接受一个list,填充并截断(padding and truncate)文本以返回具有统一长度的批次:

pt_batch = tokenizer([
			"We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
			padding = True,
			truncation = True,
			max_length = 512,
			return_tensors='pt',
			)

AutoModel

Transformers提供一个简单且统一的方式来加载预训练模型。这意味着可以像加载_AutoTokenizer_一样加载_AutoModel_。唯一不同的是需要为任务选择正确的_AutoModel_。如对于文本分类任务,可以加载_AutoModelForSequenceClassification_:

from transformers import AutoModelForSequenceClassification

model_name = 'nlptown/bert-base-multilingual-uncased-sentiment'
model = AutoModelForSequenceClassification.from_pretrained(model_name)

有关AutoModel支持的任务,请参阅任务汇总
下面将预处理的输入批次直接输入到模型,只需要添加**解包字典。

pt_outputs = pt_model(**pt_batch)

模型在logits属性中输出最终激活。将softmax函数应用于logits以检索概率:

from torch import nn
pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
print(pt_predictions)

tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
[0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=)

[说明]所有Transformers模型输出最终激活函数(如softmax)之前的tensors,因为最终激活函数通常与loss融合。模型的输出是特殊的数据类,因此它们的属性在IDE中自动完成。模型输出行为类似一个元组或一个字典(可以用整数、切片或字符串索引),这种情况下None属性将被忽略。

Save a model

一旦对模型进行了微调,可以使用PreTrainedModel.save_pretrained()将模型和tokenizer一起保存:

pt_save_directory = './pt_save_pretrained'
tokenizer.save_pretrained(pt_save_directory)
pt_model.save_pretrained(pt_save_directory)

当准备再次使用该模型时,使用PreTrainedModel.from_pretrained():

pt_model = AutoModelForSequenceClassification.from_pretrained('./pt_save_pretrained')

一个特别cool的transformers功能是保存一个模型,并重新加载它为Pytorch或Tensorflow模型。from_pt或from_tf参数能够将模型从一个框架转为另一个:

from transformers import AutoModel
tokenizer = AutoTokenizer.form_pretrained(tf_save_directory)
pt_model = AutoModelForSequenceClassification.from_pretrained(tf_save_directory, from_tf=True)

自定义模型构建

你可以修改模型的配置类(configuration class)来改变模型的构建方式。Configuration指定模型的属性,如隐藏层数或注意力头数。当你从自定义配置类初始化模型时,你可以从头开始。模型属性是随机初始化的,你需要训练模型,然后才能使用它得到有意义的结果。

AutoConfig

从导入AutoConfig开始,然后加载你想修改的预训练模型。在AutoConfig.from_pretrained()中,你可以具体说明你想要修改的属性,如注意力头数:

from transformers import AutoConfig
my_config = AutoConfig.from_pretrained('distilbert-base-uncased', n_heads=12)

AutoModel

使用AutoModel.from_config()从自定义配置创建模型:

from transformers import AutoModel
my_model = AutoModel.from_config(my_config)

Trainer–Pytorch优化的训练循环

所有的模型都是标准的torch.nn.Module,因此你可以在任何典型的训练循环中使用它们。同时你可以写自己的训练循环,Transformers为Pytorch提供了Trainer类,它包含基本的训练循环并为分布式训练、混合精度等功能添加了额外的功能。
依赖于自己的任务,通常将以下参数传递给Trainer:

  1. 一个PreTrainedModel或一个torch.nn.Module
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained('distilbert-base-uncased')

2.TrainingArguments包含你能改变的模型超参数,如用于训练的学习率、批次大小、epoch数。如果没有具体说明任何训练参数,将使用默认值:

from transformers import TrainingArguments
training_args = TrainingArguments(
				output_dir = 'path/to/save/folder',
				learning_rate = 2e-5,
				per_device_train_batch_size = 8,
				per_device_eval_batch_size = 8,
				num_train_epochs = 2,
				)
  1. 一个预处理类,如tokenizer, image processor, feature extractor, or processor:
from transformers import AutoTokenzier
tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased')

4.加载数据集:

from dataset import load_dataset
dataset = load_dataset('rotten_tomatoes')  # doctest: +IGNORE_RESULT
  1. 创建一个函数来tokenize数据集:
def tokenize_dataset(dataset):
	return tokenizer(dataset['text'])

然后利用map将其应用到整个数据集:

dataset = dataset.map(tokenize_dataset, batched=True)

6.利用DataCollatorWithPadding从数据集中创建一个批次示例:

from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

在Trainer中聚集所有这些类:

from transformers import Trainer
trainer = Trainer(
			model = model,
			args = training_args,
			train_dataset = dataset['train'],
			eval_dataset = dataset['test'],
			tokenizer = tokenizer,
			data_collator = data_collator,
		) #doctest: SKIP

当你准备完毕后,调用train()来开始训练:

trainer.train()

您可以通过在Trainer中对方法进行子类化来自定义训练循环行为。这允许您自定义丢失函数、优化器和调度程序等功能。查看Trainer参考资料,可以对其方法进行子类化。
另一种自定义训练循环的方法是使用回调(Callbacks)。您可以使用回调与其他库集成,并检查培训循环以报告进度或提前停止培训。回调不会修改训练循环本身中的任何内容。要自定义类似损失函数的东西,您需要将Trainer子类化。

微调教程

如果找不到适合自己用例的模型,可以用自己的数据微调一个模型(待填坑)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值