Transformers多模态数据预处理
《Transformers多模态数据预处理》共 0.4 万字,通篇围绕 数据集、预训练、语音、多模态 展开,归在「模型架构与原理」这一层。
适合要跟模型团队对话、得听懂他们在说什么的人
目录骨架(3 节)
- 自然语言处理
- 计算机视觉
- 构建张量
示例代码
注:将ppt后缀名改为zip后解压
预处理
在您可以在数据集上训练模型之前,数据需要被预处理为期望的模型输入格式。无论您的数据是文本、图像还是音频,它们都需要被转换并组合成批量的张量。🤗 Transformers 提供了一组预处理类来帮助准备数据以供模型使用。在本教程中,您将了解以下内容:
- 对于文本,使用分词器 (Tokenizer) 将文本转换为一系列标记 (tokens),并创建tokens的数字表示,将它们组合成张量。
- 对于语音和音频,使用特征提取器 (Feature extractor) 从音频波形中提取顺序特征并将其转换为张量。
- 图像输入使用图像处理器 (ImageProcessor) 将图像转换为张量。
- 多模态输入,使用处理器 (Processor) 结合了Tokenizer和ImageProcessor或Processor。
AutoProcessor始终有效的自动选择适用于您使用的模型的正确class,无论您使用的是Tokenizer、ImageProcessor、Feature extractor还是Processor。
在开始之前,请安装🤗 Datasets,以便您可以加载一些数据集来进行实验:
pip install datasets
自然语言处理
处理文本数据的主要工具是 Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字,然后转换为张量,成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。
如果您计划使用预训练模型,重要的是使用与之关联的预训练Tokenizer。这确保文本的拆分方式与预训练语料库相同,并在预训练期间使用相同的标记 - 索引的对应关系(通常称为词汇表 -vocab)。
开始使用 [AutoTokenizer.from_pretrained] 方法加载一个预训练tokenizer。这将下载模型预训练的vocab:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
然后将您的文本传递给tokenizer:
>>> encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
>>> print(encoded_input)
{'input_ids': [101, 2079, 2025, 19960, 10362, 1999, 1996, 3821, 1997, 16657, 1010, 2005, 2027, 2024, 11259, 1998, 4248, 2000, 4963, 1012, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1]}
tokenizer返回一个包含三个重要对象的字典:
- input_ids 是与句子中每个token对应的索引。
- attention_mask 指示是否应该关注一个token。
- token_type_ids 在存在多个序列时标识一个token属于哪个序列。
通过解码 input_ids 来返回您的输入:
>>> tokenizer.decode(encoded_input["input_ids"])
'[CLS] Do not meddle in the affairs of wizards, for they are subtle and quick to anger. [SEP]'
如您所见,tokenizer向句子中添加了两个特殊token - CLS 和 SEP(分类器和分隔符)。并非所有模型都需要特殊token,但如果需要,tokenizer会自动为您添加。
如果有多个句子需要预处理,将它们作为列表传递给tokenizer:
>>> batch_sentences = [
... "But what about second breakfast?",
... "Don't think he knows about second breakfast, Pip.",
... "What about elevensies?",
... ]
>>> encoded_inputs = tokenizer(batch_sentences)
>>> print(encoded_inputs)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102],
[101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
[101, 1327, 1164, 5450, 23434, 136, 102]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1]]}