
Transformers 数据预处理完全指南文本 Token 化、音频与图像特征提取及多模态处理【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers在向模型投喂数据之前你必须先把数据转换成模型可接受的格式模型无法理解原始的文本、图像或音频这些输入需要先被转换成数字并组装成张量tensor。本篇指南以 transformers 仓库的 数据预处理官方文档西班牙语版为核心系统讲解三类核心预处理手段——用tokenizer分词器处理文本、用feature extractor特征提取器处理图像与音频、用processor处理器统一处理多模态数据并深入解析padding、truncation、max_length三大参数的完整语义。读完本文你将能独立完成从原始数据到模型可消费张量的完整流水线搭建。概览三类预处理工具的分工在 transformers 中根据输入模态的不同数据预处理由三类对象分别承担模态预处理工具核心职责文本Tokenizer分词器将文本切分为 token映射为数字 ID并补充模型所需的特殊 token图像 / 音频Feature Extractor特征提取器从原始图像或音频信号中提取特征并组装成张量多模态Processor处理器组合 feature extractor 与 tokenizer统一处理多种模态输入一个贯穿始终的重要原则是如果你计划使用预训练模型务必使用与它配套的预训练 tokenizer / feature extractor。这能保证文本以与预训练语料相同的方式切分并使用预训练时相同的 token 索引通常称为vocab词表从而确保输入分布与模型预期一致。文本预处理NLP处理文本数据的主要工具是 tokenizer。它首先依据一组规则将文本拆分为token随后将 token 转换为数字用于构建输入到模型的张量同时 tokenizer 还会自动附加模型需要的任何额外输入如特殊 token。加载分词器AutoTokenizer在 tokenization_auto.py 中AutoTokenizer是一个通用分词器类它会根据配置对象的model_type属性或从模型 ID 推断自动实例化库中对应的具体分词器类。它不能直接通过__init__()实例化会抛出OSError必须通过AutoTokenizer.from_pretrained()类方法加载。加载过程会下载模型预训练时使用的词表 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 对应的索引数字 IDattention_mask指示某个 token 是否应被模型关注1 关注 / 0 忽略token_type_ids当存在多条序列时标识某个 token 属于哪条序列。你还可以通过decode将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 会自动补上。批量分词如果要一次预处理多条句子把句子以列表形式传入即可 batch_sentences [ ... But what about second breakfast?, ... Dont 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]]}填充Pad统一 batch 形状处理一个 batch 的句子时它们的长度往往不一致。模型要求输入张量的形状必须统一矩形因此需要采用padding填充策略向较短的句子追加一个特殊的 padding token使其与 batch 中最长的序列对齐。将padding参数设为Truetokenizer 就会把 batch 中较短的序列填充到与最长序列等长 encoded_input tokenizer(batch_sentences, paddingTrue) print(encoded_input) {input_ids: [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0], [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102], [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]], 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], [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, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]]}注意第一句和第三句因较短被填充了0且对应位置上的attention_mask也变成了0从而告诉模型这些是填充位无需关注。截断Truncation控制序列上限与填充相对的另一个极端是序列可能超出模型能接受的长度此时需要将序列截断到更短的长度。将truncation参数设为True序列会被截断到模型可接受的最大长度 encoded_input tokenizer(batch_sentences, paddingTrue, truncationTrue) print(encoded_input) {input_ids: [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0], [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102], [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]], 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], [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, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]]}构建张量return_tensors最后如果你希望 tokenizer 直接返回真正输入模型的张量可以设置return_tensors参数pt返回 PyTorch 张量tf返回 TensorFlow 张量 encoded_input tokenizer(batch, paddingTrue, truncationTrue, return_tensorspt) print(encoded_input) {input_ids: tensor([[ 101, 153, 7719, 21490, 1122, 1114, 9582, 1623, 102], [ 101, 5226, 1122, 9649, 1199, 2610, 1236, 102, 0]]), token_type_ids: tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]), attention_mask: tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0]])}TensorFlow 版本的返回结果如下return_tensorstf encoded_input tokenizer(batch, paddingTrue, truncationTrue, return_tensorstf) print(encoded_input) {input_ids: tf.Tensor: shape(2, 9), dtypeint32, numpy array([[ 101, 153, 7719, 21490, 1122, 1114, 9582, 1623, 102], [ 101, 5226, 1122, 9649, 1199, 2610, 1236, 102, 0]], dtypeint32), token_type_ids: tf.Tensor: shape(2, 9), dtypeint32, numpy array([[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]], dtypeint32), attention_mask: tf.Tensor: shape(2, 9), dtypeint32, numpy array([[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0]], dtypeint32)}音频数据预处理Audio音频输入的预处理方式与文本不同但最终目标一致生成模型可理解的数字序列。feature extractor特征提取器专门用于从原始图像或音频中提取特征并转换为张量。开始前先安装 Datasets 以加载音频数据集pip install datasets加载 SUPERB 基准中的关键词检测keyword spotting任务 from datasets import load_dataset, Audio dataset load_dataset(superb, ks)访问audio列的第一个元素来查看输入。调用audio列会自动加载音频文件并按需重采样 dataset[train][0][audio] {array: array([ 0. , 0. , 0. , ..., -0.00592041, -0.00405884, -0.00253296], dtypefloat32), path: /root/.cache/huggingface/datasets/downloads/extracted/05734a36d88019a09725c20cc024e1c4e7982e37d7d55c0c1ca1742ea1cdd47f/_background_noise_/doing_the_dishes.wav, sampling_rate: 16000}该字典返回三个条目array已加载并可能已重采样的语音信号表现为一维数组path音频文件所在位置sampling_rate每秒测量的语音信号数据点数量采样率。重采样Resample本教程将使用 Wav2Vec2 模型。从模型卡可以看到Wav2Vec2 是在16kHz采样的语音上预训练的。你的音频数据采样率必须与模型预训练数据集的采样率一致如果不一致就必须对音频重采样。例如LJ Speech 数据集的采样率为 22050Hz文档中写作 22050kHz实为笔误正确为 22050Hz。要用 Wav2Vec2 处理它需要将采样率降到 16kHz lj_speech load_dataset(lj_speech, splittrain) lj_speech[0][audio] {array: array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ..., 7.3242188e-04, 2.1362305e-04, 6.1035156e-05], dtypefloat32), path: /root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav, sampling_rate: 22050}使用 Datasets 的cast_column方法将采样率降到 16kHz lj_speech lj_speech.cast_column(audio, Audio(sampling_rate16_000))重新加载音频文件 lj_speech[0][audio] {array: array([-0.00064146, -0.00074657, -0.00068768, ..., 0.00068341, 0.00014045, 0. ], dtypefloat32), path: /root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav, sampling_rate: 16000}可以看到sampling_rate已降至 16kHz。掌握重采样原理后回到 SUPERB 数据集继续后面的步骤。加载特征提取器AutoFeatureExtractor下一步加载特征提取器对输入做归一化与填充。与文本填充时补0同理音频特征提取器会在较短的array上补0被解释为静音。在 feature_extraction_auto.py 中AutoFeatureExtractor同样是通用类必须通过AutoFeatureExtractor.from_pretrained()实例化它会根据配置的model_type自动选择对应的具体特征提取器类 from transformers import AutoFeatureExtractor feature_extractor AutoFeatureExtractor.from_pretrained(facebook/wav2vec2-base)把音频的array传给特征提取器。建议同时传入sampling_rate参数便于排查可能出现的静默错误 audio_input [dataset[train][0][audio][array]] feature_extractor(audio_input, sampling_rate16000) {input_values: [array([ 0.00045439, 0.00045439, 0.00045439, ..., -0.1578519 , -0.10807519, -0.06727459], dtypefloat32)]}音频的填充与截断和 tokenizer 一样你可以对音频应用填充或截断以处理 batch 中的变长序列。先观察两条音频样本的序列长度 dataset[train][0][audio][array].shape (1522930,) dataset[train][1][audio][array].shape (988891,)两条样本长度差异很大。编写一个预处理函数统一设置sampling_rate16000、paddingTrue、max_length1000000与truncationTrue def preprocess_function(examples): ... audio_arrays [x[array] for x in examples[audio]] ... inputs feature_extractor( ... audio_arrays, ... sampling_rate16000, ... paddingTrue, ... max_length1000000, ... truncationTrue, ... ) ... return inputs将函数应用到数据集的前几个样本 processed_dataset preprocess_function(dataset[train][:5])检查处理后的样本长度 processed_dataset[input_values][0].shape (1000000,) processed_dataset[input_values][1].shape (1000000,)两条样本的长度现在都对齐到了指定的最大长度。图像数据预处理Vision图像同样使用 feature extractor 处理目标依旧是把原始图像转换成一个 batch 的张量。加载 food101 数据集。由于该数据集较大用 Datasets 的split参数只加载训练集的一小部分 from datasets import load_dataset dataset load_dataset(ethz/food101, splittrain[:100])接着用 Datasets 的Image特性查看图像此处仅示意访问图像字段的方式 dataset[0][image]加载图像特征提取器 from transformers import AutoFeatureExtractor feature_extractor AutoFeatureExtractor.from_pretrained(google/vit-base-patch16-224)数据增强Data Augmentation计算机视觉任务通常会在预处理中加入数据增强。你可以用任意库实现增强方法本教程使用 torchvision 的transforms模块。归一化图像并用Compose串联若干变换——RandomResizedCrop随机裁剪缩放和ColorJitter颜色抖动 from torchvision.transforms import Compose, Normalize, RandomResizedCrop, ColorJitter, ToTensor normalize Normalize(meanfeature_extractor.image_mean, stdfeature_extractor.image_std) _transforms Compose( ... [RandomResizedCrop(feature_extractor.size), ColorJitter(brightness0.5, hue0.5), ToTensor(), normalize] ... )这里image_mean、image_std、size都直接取自 feature extractor保证归一化参数与预训练模型一致。模型接受pixel_values作为输入该值由 feature extractor 生成。编写一个从变换中生成pixel_values的函数 def transforms(examples): ... examples[pixel_values] [_transforms(image.convert(RGB)) for image in examples[image]] ... return examples使用 Datasets 的set_transform让变换在数据访问时即时生效 dataset.set_transform(transforms)现在访问图像时可以看到 feature extractor 已为模型输入添加了pixel_values dataset[0][image] {image: PIL.JpegImagePlugin.JpegImageFile image modeRGB size384x512 at 0x7F1A7B0630D0, label: 6, pixel_values: tensor([[[ 0.0353, 0.0745, 0.1216, ..., -0.9922, -0.9922, -0.9922], [-0.0196, 0.0667, 0.1294, ..., -0.9765, -0.9843, -0.9922], [ 0.0196, 0.0824, 0.1137, ..., -0.9765, -0.9686, -0.8667], ..., [ 0.0275, 0.0745, 0.0510, ..., -0.1137, -0.1216, -0.0824], [ 0.0667, 0.0824, 0.0667, ..., -0.0588, -0.0745, -0.0980], [ 0.0353, 0.0353, 0.0431, ..., -0.0039, -0.0039, -0.0588]], [[ 0.2078, 0.2471, 0.2863, ..., -0.9451, -0.9373, -0.9451], [ 0.1608, 0.2471, 0.3098, ..., -0.9373, -0.9451, -0.9373], [ 0.2078, 0.2706, 0.3020, ..., -0.9608, -0.9373, -0.8275], ..., [-0.0353, 0.0118, -0.0039, ..., -0.2392, -0.2471, -0.2078], [ 0.0196, 0.0353, 0.0196, ..., -0.1843, -0.2000, -0.2235], [-0.0118, -0.0039, -0.0039, ..., -0.0980, -0.0980, -0.1529]], [[ 0.3961, 0.4431, 0.4980, ..., -0.9216, -0.9137, -0.9216], [ 0.3569, 0.4510, 0.5216, ..., -0.9059, -0.9137, -0.9137], [ 0.4118, 0.4745, 0.5216, ..., -0.9137, -0.8902, -0.7804], ..., [-0.2314, -0.1922, -0.2078, ..., -0.4196, -0.4275, -0.3882], [-0.1843, -0.1686, -0.2000, ..., -0.3647, -0.3804, -0.4039], [-0.1922, -0.1922, -0.1922, ..., -0.2941, -0.2863, -0.3412]]])}经过预处理后图像被随机裁剪且颜色属性发生了改变这正是前面变换链所期望的效果。若想可视化处理结果可以借助 numpy 与 matplotlib 展示pixel_values将通道维移到最后一维再显示 import numpy as np import matplotlib.pyplot as plt img dataset[0][pixel_values] plt.imshow(img.permute(1, 2, 0))多模态数据预处理Multimodal多模态任务需要组合前面学到的所有技能。以自动语音识别ASR为例你需要一个feature extractor处理音频数据一个tokenizer处理文本。回到 LJ Speech 数据集 from datasets import load_dataset lj_speech load_dataset(lj_speech, splittrain)如果只关心audio和text两列可以先移除其余列 lj_speech lj_speech.map(remove_columns[file, id, normalized_text])查看audio和text两列 lj_speech[0][audio] {array: array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ..., 7.3242188e-04, 2.1362305e-04, 6.1035156e-05], dtypefloat32), path: /root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav, sampling_rate: 22050} lj_speech[0][text] Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition回顾音频预处理一节音频数据的采样率必须与模型预训练数据集一致因此同样先重采样到 16kHz lj_speech lj_speech.cast_column(audio, Audio(sampling_rate16_000))Processor特征提取器与分词器的组合processor 将 feature extractor 与 tokenizer 组合成一个对象。使用AutoProcessor.from_pretrained加载 from transformers import AutoProcessor processor AutoProcessor.from_pretrained(facebook/wav2vec2-base-960h)在 processing_auto.py 中AutoProcessor与前面两个 Auto 类遵循相同的设计根据配置选择具体的 processor 类通过类方法实例化不能直接__init__。编写一个函数把音频数据处理成input_values把文本 tokenize 成labels——这两者就是模型的输入 def prepare_dataset(example): ... audio example[audio] ... ... example.update(processor(audioaudio[array], textexample[text], sampling_rate16000)) ... ... return example将函数应用到一条样本上 prepare_dataset(lj_speech[0])可以看到 processor 方法添加了input_values和labels采样率也被正确降到了 16kHz。至此你已经可以为任何模态预处理数据甚至组合不同模态。下一步就可以在预处理好的数据上对模型进行微调。关于填充与截断你该知道的一切前面演示的都是最常见用法按 batch 内最长序列填充、按模型最大长度截断。实际上 API 还支持更多策略三个需要掌握的核心参数是padding、truncation和max_length。padding 参数padding控制是否对文本填充可以是布尔值或字符串True或longest填充到 batch 中最长序列的长度若只传入单条序列则不填充max_length填充到max_length指定的长度若未提供max_length即max_lengthNone则填充到模型可接受的最大长度。即使只传入单条序列也会执行填充False或do_not_pad不填充这是默认行为。truncation 参数truncation控制是否截断可以是布尔值或字符串True或longest_first截断到max_length指定的长度若未提供max_lengthmax_lengthNone则截断到模型可接受的最大长度。该策略会逐 token 截断从序列对中较长的那条依次移除 token直到达到合适长度only_second截断到max_length指定的长度或模型最大长度。仅当提供序列对或序列对 batch时只截断其中的第二条序列only_first截断到max_length指定的长度或模型最大长度。仅当提供序列对时只截断第一条序列False或do_not_truncate不截断这是默认行为。max_length 参数max_length用于控制填充/截断的目标长度可以是整数或None。为None时默认取模型可接受的最大长度若模型没有明确的最大输入长度则max_length相关的填充/截断会被禁用。底层实现策略枚举与解析逻辑这些策略并非文档中的口头约定在源码中有明确的枚举与解析实现PaddingStrategy定义于 utils/generic.py取值包括LONGEST longest、MAX_LENGTH max_length、DO_NOT_PAD do_not_padTruncationStrategy定义于 tokenization_utils_base.py取值包括ONLY_FIRST、ONLY_SECOND、LONGEST_FIRST、DO_NOT_TRUNCATE策略解析逻辑位于 tokenization_utils_base.py 的_get_padding_truncation_strategies方法中它负责把True归一化为对应默认策略、校验pad_token是否存在、检查max_length与pad_to_multiple_of是否冲突并最终返回解析后的策略与长度。几个值得注意的细节兼容旧行为若只设置max_length而未显式设置paddingFalse、truncationNone则会自动激活truncationlongest_first当padding与truncation同时启用且设置了pad_to_multiple_of时若max_length不是pad_to_multiple_of的整数倍会抛出ValueError请求填充但 tokenizer 没有 padding tokenpad_token is None或pad_token_id 0时会抛出ValueError提示你设置pad_token或通过add_special_tokens添加。推荐配置速查表下表总结了设置填充与截断的推荐方式。若某些示例中使用序列对输入可将truncationTrue替换为STRATEGY取[only_first, only_second, longest_first]之一例如truncationonly_second或truncationlongest_first以按前述规则精确控制序列对中两条序列的截断方式TruncationPaddingInstructions不截断不填充tokenizer(batch_sentences)填充到 batch 内最长序列tokenizer(batch_sentences, paddingTrue)或tokenizer(batch_sentences, paddinglongest)填充到模型最大输入长度tokenizer(batch_sentences, paddingmax_length)填充到指定长度tokenizer(batch_sentences, paddingmax_length, max_length42)截断到模型最大输入长度不填充tokenizer(batch_sentences, truncationTrue)或tokenizer(batch_sentences, truncationSTRATEGY)填充到 batch 内最长序列tokenizer(batch_sentences, paddingTrue, truncationTrue)或tokenizer(batch_sentences, paddingTrue, truncationSTRATEGY)填充到模型最大输入长度tokenizer(batch_sentences, paddingmax_length, truncationTrue)或tokenizer(batch_sentences, paddingmax_length, truncationSTRATEGY)填充到指定长度不可行截断到指定长度不填充tokenizer(batch_sentences, truncationTrue, max_length42)或tokenizer(batch_sentences, truncationSTRATEGY, max_length42)填充到 batch 内最长序列tokenizer(batch_sentences, paddingTrue, truncationTrue, max_length42)或tokenizer(batch_sentences, paddingTrue, truncationSTRATEGY, max_length42)填充到模型最大输入长度不可行填充到指定长度tokenizer(batch_sentences, paddingmax_length, truncationTrue, max_length42)或tokenizer(batch_sentences, paddingmax_length, truncationSTRATEGY, max_length42)其中不可行的含义是当截断目标长度小于填充目标长度时二者矛盾截断到 42 却要填充到模型最大长度因此这类组合不被支持。实践中应遵循先截断、后填充的原则让最终长度由填充策略决定。延伸阅读分词器的主类参考见 Tokenizer 文档其中完整罗列了PreTrainedTokenizerBase的全部参数stride、pad_to_multiple_of、return_overflowing_tokens等特征提取器的主类参考见 Feature Extractor 文档术语速查见 Glossary可对照查阅input_ids、attention_mask、token_type_ids的精确定义若想深入理解快速分词器的实现可阅读 Fast Tokenizers仓库中亦提供西班牙语版需要处理变长序列的更多细节可参考 Pad 与 Truncation 专题多模态任务中pixel_values的消费方式可查看 VisionEncoderDecoderModel 文档。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考