Transformers 4.37 中文文档(一)(5)

简介: Transformers 4.37 中文文档(一)

Transformers 4.37 中文文档(一)(4)https://developer.aliyun.com/article/1565783


计算机视觉

对于计算机视觉任务,您将需要一个图像处理器来准备您的数据集以供模型使用。图像预处理包括几个步骤,将图像转换为模型期望的输入。这些步骤包括但不限于调整大小、归一化、颜色通道校正以及将图像转换为张量。

图像预处理通常遵循某种形式的图像增强。图像预处理和图像增强都会转换图像数据,但它们有不同的目的:

  • 图像增强以一种可以帮助防止过拟合并增加模型鲁棒性的方式改变图像。您可以在数据增强中发挥创造力 - 调整亮度和颜色,裁剪,旋转,调整大小,缩放等。但是,请注意不要通过增强改变图像的含义。
  • 图像预处理确保图像与模型期望的输入格式匹配。在微调计算机视觉模型时,图像必须与模型最初训练时的预处理方式完全相同。

您可以使用任何您喜欢的库进行图像增强。对于图像预处理,请使用与模型关联的ImageProcessor

加载food101数据集(请参阅🤗数据集教程以获取有关如何加载数据集的更多详细信息),以查看如何在计算机视觉数据集中使用图像处理器:

使用🤗数据集split参数仅加载训练集中的一小部分样本,因为数据集非常大!

>>> from datasets import load_dataset
>>> dataset = load_dataset("food101", split="train[:100]")

接下来,看一下带有🤗数据集Image特征的图像:

>>> dataset[0]["image"]

使用 AutoImageProcessor.from_pretrained()加载图像处理器:

>>> from transformers import AutoImageProcessor
>>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")

首先,让我们添加一些图像增强。您可以使用任何您喜欢的库,但在本教程中,我们将使用 torchvision 的transforms模块。如果您有兴趣使用其他数据增强库,请在AlbumentationsKornia notebooks中学习如何使用。

  1. 在这里,我们使用Compose来链接一些转换 - RandomResizedCropColorJitter。请注意,对于调整大小,我们可以从image_processor获取图像大小要求。对于某些模型,期望精确的高度和宽度,对于其他模型只定义了shortest_edge
>>> from torchvision.transforms import RandomResizedCrop, ColorJitter, Compose
>>> size = (
...     image_processor.size["shortest_edge"]
...     if "shortest_edge" in image_processor.size
...     else (image_processor.size["height"], image_processor.size["width"])
... )
>>> _transforms = Compose([RandomResizedCrop(size), ColorJitter(brightness=0.5, hue=0.5)])
  1. 模型接受pixel_values作为其输入。ImageProcessor可以负责归一化图像,并生成适当的张量。创建一个函数,将图像增强和图像预处理组合为一批图像,并生成pixel_values
>>> def transforms(examples):
...     images = [_transforms(img.convert("RGB")) for img in examples["image"]]
...     examples["pixel_values"] = image_processor(images, do_resize=False, return_tensors="pt")["pixel_values"]
...     return examples

在上面的示例中,我们设置了do_resize=False,因为我们已经在图像增强转换中调整了图像的大小,并利用了适当的image_processorsize属性。如果您在图像增强期间不调整图像大小,请省略此参数。默认情况下,ImageProcessor将处理调整大小。

如果希望将图像归一化作为增强转换的一部分,请使用image_processor.image_meanimage_processor.image_std值。

  1. 然后使用🤗数据集set_transform来动态应用转换:
>>> dataset.set_transform(transforms)
  1. 现在当您访问图像时,您会注意到图像处理器已添加了pixel_values。现在您可以将处理过的数据集传递给模型了!
>>> dataset[0].keys()

这是应用转换后的图像样子。图像已被随机裁剪,其颜色属性不同。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> img = dataset[0]["pixel_values"]
>>> plt.imshow(img.permute(1, 2, 0))

对于目标检测、语义分割、实例分割和全景分割等任务,ImageProcessor提供后处理方法。这些方法将模型的原始输出转换为有意义的预测,如边界框或分割地图。

填充

在某些情况下,例如在微调 DETR 时,模型会在训练时应用尺度增强。这可能导致批处理中的图像大小不同。您可以使用来自 DetrImageProcessor 的DetrImageProcessor.pad(),并定义一个自定义的collate_fn来将图像批处理在一起。

>>> def collate_fn(batch):
...     pixel_values = [item["pixel_values"] for item in batch]
...     encoding = image_processor.pad(pixel_values, return_tensors="pt")
...     labels = [item["labels"] for item in batch]
...     batch = {}
...     batch["pixel_values"] = encoding["pixel_values"]
...     batch["pixel_mask"] = encoding["pixel_mask"]
...     batch["labels"] = labels
...     return batch

多模态

对于涉及多模态输入的任务,您将需要一个处理器来为模型准备您的数据集。处理器将两个处理对象(如标记器和特征提取器)耦合在一起。

加载LJ Speech数据集(查看🤗数据集教程以获取有关如何加载数据集的更多详细信息),以查看如何使用处理器进行自动语音识别(ASR):

>>> from datasets import load_dataset
>>> lj_speech = load_dataset("lj_speech", split="train")

对于 ASR,您主要关注音频文本,因此可以删除其他列:

>>> lj_speech = lj_speech.map(remove_columns=["file", "id", "normalized_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], dtype=float32),
 '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'

记住,你应该始终重新采样你的音频数据集的采样率,以匹配用于预训练模型的数据集的采样率!

>>> lj_speech = lj_speech.cast_column("audio", Audio(sampling_rate=16_000))

使用 AutoProcessor.from_pretrained()加载一个处理器:

>>> from transformers import AutoProcessor
>>> processor = AutoProcessor.from_pretrained("facebook/wav2vec2-base-960h")
  1. 创建一个函数来处理array中包含的音频数据为input_values,并将文本标记化为标签。这些是模型的输入:
>>> def prepare_dataset(example):
...     audio = example["audio"]
...     example.update(processor(audio=audio["array"], text=example["text"], sampling_rate=16000))
...     return example
  1. prepare_dataset函数应用到一个样本中:
>>> prepare_dataset(lj_speech[0])

处理器现在已经添加了input_valueslabels,采样率也已经正确降采样到 16kHz。现在您可以将处理过的数据集传递给模型了!

对预训练模型进行微调

原始文本:huggingface.co/docs/transformers/v4.37.2/en/training

使用预训练模型有很多好处。它可以减少计算成本、减少碳足迹,并且可以让您使用最先进的模型,而无需从头开始训练。🤗 Transformers   提供了数千个预训练模型,适用于各种任务。当您使用预训练模型时,您需要在特定于您任务的数据集上对其进行训练。这被称为微调,是一种非常强大的训练技术。在本教程中,您将使用您选择的深度学习框架对预训练模型进行微调:

  • 使用 🤗 Transformers Trainer 对预训练模型进行微调。
  • 使用 Keras 在 TensorFlow 中对预训练模型进行微调。
  • 在原生 PyTorch 中对预训练模型进行微调。

准备数据集

www.youtube-nocookie.com/embed/_BZearw7f0w

在对预训练模型进行微调之前,下载一个数据集并为训练做好准备。之前的教程向您展示了如何处理训练数据,现在您有机会将这些技能付诸实践!

首先加载 Yelp 评论 数据集:

>>> from datasets import load_dataset
>>> dataset = load_dataset("yelp_review_full")
>>> dataset["train"][100]
{'label': 0,
 'text': 'My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\\nThe cashier took my friends\'s order, then promptly ignored me. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\'s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for \\"serving off their orders\\" when they didn\'t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\\nThe manager was rude when giving me my order. She didn\'t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\\nI\'ve eaten at various McDonalds restaurants for over 30 years. I\'ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!'}

现在您知道,您需要一个分词器来处理文本,并包含填充和截断策略以处理任何可变序列长度。为了一次处理您的数据集,使用 🤗 Datasets map 方法在整个数据集上应用预处理函数:

>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
>>> def tokenize_function(examples):
...     return tokenizer(examples["text"], padding="max_length", truncation=True)
>>> tokenized_datasets = dataset.map(tokenize_function, batched=True)

如果您愿意,可以创建一个较小的数据集子集进行微调,以减少所需的时间:

>>> small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
>>> small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

训练

在这一点上,您应该按照您想要使用的框架对应的部分进行操作。您可以使用右侧边栏中的链接跳转到您想要的部分 - 如果您想隐藏给定框架的所有内容,只需使用该框架块右上角的按钮!

PytorchHide Pytorch 内容

www.youtube-nocookie.com/embed/nvBXf7s7vTI

使用 PyTorch Trainer 进行训练

🤗 Transformers 提供了一个专为训练 🤗 Transformers 模型优化的 Trainer 类,使得开始训练变得更加容易,而无需手动编写自己的训练循环。Trainer API 支持各种训练选项和功能,如日志记录、梯度累积和混合精度。

首先加载您的模型并指定预期标签的数量。从 Yelp 评论 数据集卡片 中,您知道有五个标签:

>>> from transformers import AutoModelForSequenceClassification
>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)

您将看到一个警告,指出一些预训练权重未被使用,一些权重被随机初始化。不用担心,这是完全正常的!BERT 模型的预训练头被丢弃,并用随机初始化的分类头替换。您将对这个新模型头进行微调,将预训练模型的知识转移到它上面进行序列分类任务。

训练超参数

接下来,创建一个包含所有可以调整的超参数以及激活不同训练选项的标志的 TrainingArguments 类。对于本教程,您可以从默认的训练 超参数 开始,但请随时尝试这些参数以找到您的最佳设置。

指定保存训练检查点的位置:

>>> from transformers import TrainingArguments
>>> training_args = TrainingArguments(output_dir="test_trainer")

评估

Trainer 在训练期间不会自动评估模型性能。您需要传递 Trainer 一个函数来计算和报告指标。🤗 Evaluate库提供了一个简单的accuracy函数,您可以使用evaluate.load加载(有关更多信息,请参阅此快速导览):

>>> import numpy as np
>>> import evaluate
>>> metric = evaluate.load("accuracy")

metric上调用compute以计算您预测的准确性。在将预测传递给compute之前,您需要将 logits 转换为预测(请记住,所有🤗 Transformers 模型都返回 logits):

>>> def compute_metrics(eval_pred):
...     logits, labels = eval_pred
...     predictions = np.argmax(logits, axis=-1)
...     return metric.compute(predictions=predictions, references=labels)

如果您想在微调期间监视评估指标,请在训练参数中指定evaluation_strategy参数,以在每个时期结束时报告评估指标:

>>> from transformers import TrainingArguments, Trainer
>>> training_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch")

Trainer

使用您的模型、训练参数、训练和测试数据集以及评估函数创建一个 Trainer 对象:

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     train_dataset=small_train_dataset,
...     eval_dataset=small_eval_dataset,
...     compute_metrics=compute_metrics,
... )

然后通过调用 train()微调您的模型:

>>> trainer.train()

TensorFlow 隐藏 TensorFlow 内容

www.youtube-nocookie.com/embed/rnTGBy2ax1c

使用 Keras 训练 TensorFlow 模型

您还可以使用 Keras API 在 TensorFlow 中训练🤗 Transformers 模型!

为 Keras 加载数据

当您想要使用 Keras API 训练🤗 Transformers 模型时,您需要将数据集转换为 Keras 理解的格式。如果您的数据集很小,您可以将整个数据集转换为 NumPy 数组并将其传递给 Keras。在我们做更复杂的事情之前,让我们先尝试这个。

首先,加载一个数据集。我们将使用来自GLUE 基准的 CoLA 数据集,因为它是一个简单的二进制文本分类任务,现在只取训练拆分。

from datasets import load_dataset
dataset = load_dataset("glue", "cola")
dataset = dataset["train"]  # Just take the training split for now

接下来,加载一个分词器并将数据标记为 NumPy 数组。请注意,标签已经是 0 和 1 的列表,因此我们可以直接将其转换为 NumPy 数组而无需进行标记化!

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
tokenized_data = tokenizer(dataset["sentence"], return_tensors="np", padding=True)
# Tokenizer returns a BatchEncoding, but we convert that to a dict for Keras
tokenized_data = dict(tokenized_data)
labels = np.array(dataset["label"])  # Label is already an array of 0 and 1

最后,加载,compile,和fit模型。请注意,Transformers 模型都有一个默认的与任务相关的损失函数,因此除非您想要,否则不需要指定一个:

from transformers import TFAutoModelForSequenceClassification
from tensorflow.keras.optimizers import Adam
# Load and compile our model
model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-cased")
# Lower learning rates are often better for fine-tuning transformers
model.compile(optimizer=Adam(3e-5))  # No loss argument!
model.fit(tokenized_data, labels)

当您compile()模型时,您不必向模型传递损失参数!如果将此参数留空,Hugging Face 模型会自动选择适合其任务和模型架构的损失。如果您想要,您始终可以通过指定自己的损失来覆盖这一点!

这种方法对于较小的数据集效果很好,但对于较大的数据集,您可能会发现它开始成为一个问题。为什么?因为标记化的数组和标签必须完全加载到内存中,而且因为  NumPy  不处理“不规则”数组,所以每个标记化的样本都必须填充到整个数据集中最长样本的长度。这将使您的数组变得更大,所有这些填充标记也会减慢训练速度!

将数据加载为 tf.data.Dataset

如果您想避免减慢训练速度,可以将数据加载为tf.data.Dataset。虽然如果您愿意,您可以编写自己的tf.data流水线,但我们有两种方便的方法来做到这一点:

  • prepare_tf_dataset():这是我们在大多数情况下推荐的方法。因为它是在您的模型上的一个方法,它可以检查模型以自动找出哪些列可用作模型输入,并丢弃其他列以使数据集更简单、更高效。
  • to_tf_dataset:此方法更低级,当您想要精确控制数据集创建方式时很有用,通过指定要包含的确切columnslabel_cols

在您可以使用 prepare_tf_dataset()之前,您需要将分词器的输出添加到数据集中作为列,如下面的代码示例所示:

def tokenize_dataset(data):
    # Keys of the returned dictionary will be added to the dataset as columns
    return tokenizer(data["text"])
dataset = dataset.map(tokenize_dataset)

请记住,Hugging Face 数据集默认存储在磁盘上,因此这不会增加您的内存使用!一旦添加了列,您可以从数据集中流式传输批次并对每个批次进行填充,这将大大减少与填充整个数据集相比的填充标记数量。

>>> tf_dataset = model.prepare_tf_dataset(dataset["train"], batch_size=16, shuffle=True, tokenizer=tokenizer)

请注意,在上面的代码示例中,您需要将分词器传递给prepare_tf_dataset,以便它可以正确地填充批次。如果数据集中的所有样本长度相同且不需要填充,则可以跳过此参数。如果您需要执行比填充样本更复杂的操作(例如,为了进行掩码语言建模而破坏标记),则可以使用collate_fn参数,而不是传递一个函数,该函数将被调用以将样本列表转换为批次并应用任何您想要的预处理。查看我们的示例notebooks以查看此方法的实际操作。

一旦创建了tf.data.Dataset,您可以像以前一样编译和拟合模型:

model.compile(optimizer=Adam(3e-5))  # No loss argument!
model.fit(tf_dataset)

在本机 PyTorch 中训练

PytorchHide Pytorch content

www.youtube-nocookie.com/embed/Dh9CL8fyG80

Trainer 负责训练循环,并允许您在一行代码中微调模型。对于喜欢编写自己训练循环的用户,您也可以在本机 PyTorch 中微调🤗 Transformers 模型。

此时,您可能需要重新启动笔记本或执行以下代码以释放一些内存:

del model
del trainer
torch.cuda.empty_cache()

接下来,手动后处理tokenized_dataset以准备训练。

  1. 删除text列,因为模型不接受原始文本作为输入:
>>> tokenized_datasets = tokenized_datasets.remove_columns(["text"])
  1. label列重命名为labels,因为模型期望参数命名为labels
>>> tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
  1. 将数据集的格式设置为返回 PyTorch 张量而不是列表:
>>> tokenized_datasets.set_format("torch")

然后创建数据集的较小子集,以加快微调速度:

>>> small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
>>> small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

DataLoader

为您的训练和测试数据集创建一个DataLoader,这样您就可以迭代处理数据批次:

>>> from torch.utils.data import DataLoader
>>> train_dataloader = DataLoader(small_train_dataset, shuffle=True, batch_size=8)
>>> eval_dataloader = DataLoader(small_eval_dataset, batch_size=8)

加载您的模型并指定预期标签的数量:

>>> from transformers import AutoModelForSequenceClassification
>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)

优化器和学习率调度程序

创建一个优化器和学习率调度程序来微调模型。让我们使用 PyTorch 中的AdamW优化器:

>>> from torch.optim import AdamW
>>> optimizer = AdamW(model.parameters(), lr=5e-5)

从 Trainer 创建默认学习率调度程序:

>>> from transformers import get_scheduler
>>> num_epochs = 3
>>> num_training_steps = num_epochs * len(train_dataloader)
>>> lr_scheduler = get_scheduler(
...     name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
... )

最后,如果您可以使用 GPU,请指定device来使用 GPU。否则,使用 CPU 进行训练可能需要几个小时,而不是几分钟。

>>> import torch
>>> device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
>>> model.to(device)

如果您没有云 GPU,可以通过像ColaboratorySageMaker StudioLab这样的托管笔记本获得免费访问。

很好,现在您已经准备好开始训练了!🥳

训练循环

为了跟踪您的训练进度,使用tqdm库在训练步骤数量上添加进度条:

>>> from tqdm.auto import tqdm
>>> progress_bar = tqdm(range(num_training_steps))
>>> model.train()
>>> for epoch in range(num_epochs):
...     for batch in train_dataloader:
...         batch = {k: v.to(device) for k, v in batch.items()}
...         outputs = model(**batch)
...         loss = outputs.loss
...         loss.backward()
...         optimizer.step()
...         lr_scheduler.step()
...         optimizer.zero_grad()
...         progress_bar.update(1)

评估

就像您在 Trainer 中添加了一个评估函数一样,当您编写自己的训练循环时,您需要做同样的事情。但是,这次您将累积所有批次并在最后计算指标,而不是在每个 epoch 结束时计算和报告指标。

>>> import evaluate
>>> metric = evaluate.load("accuracy")
>>> model.eval()
>>> for batch in eval_dataloader:
...     batch = {k: v.to(device) for k, v in batch.items()}
...     with torch.no_grad():
...         outputs = model(**batch)
...     logits = outputs.logits
...     predictions = torch.argmax(logits, dim=-1)
...     metric.add_batch(predictions=predictions, references=batch["labels"])
>>> metric.compute()

额外资源

有关更多微调示例,请参考:

  • 🤗 Transformers Examples 包括了用于在 PyTorch 和 TensorFlow 中训练常见 NLP 任务的脚本。
  • 🤗 Transformers Notebooks 包含了关于如何在 PyTorch 和 TensorFlow 中为特定任务微调模型的各种笔记本。
    学习率调度程序

创建一个优化器和学习率调度程序来微调模型。让我们使用 PyTorch 中的AdamW优化器:

>>> from torch.optim import AdamW
>>> optimizer = AdamW(model.parameters(), lr=5e-5)

从 Trainer 创建默认学习率调度程序:

>>> from transformers import get_scheduler
>>> num_epochs = 3
>>> num_training_steps = num_epochs * len(train_dataloader)
>>> lr_scheduler = get_scheduler(
...     name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
... )

最后,如果您可以使用 GPU,请指定device来使用 GPU。否则,使用 CPU 进行训练可能需要几个小时,而不是几分钟。

>>> import torch
>>> device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
>>> model.to(device)

如果您没有云 GPU,可以通过像ColaboratorySageMaker StudioLab这样的托管笔记本获得免费访问。

很好,现在您已经准备好开始训练了!🥳

训练循环

为了跟踪您的训练进度,使用tqdm库在训练步骤数量上添加进度条:

>>> from tqdm.auto import tqdm
>>> progress_bar = tqdm(range(num_training_steps))
>>> model.train()
>>> for epoch in range(num_epochs):
...     for batch in train_dataloader:
...         batch = {k: v.to(device) for k, v in batch.items()}
...         outputs = model(**batch)
...         loss = outputs.loss
...         loss.backward()
...         optimizer.step()
...         lr_scheduler.step()
...         optimizer.zero_grad()
...         progress_bar.update(1)

评估

就像您在 Trainer 中添加了一个评估函数一样,当您编写自己的训练循环时,您需要做同样的事情。但是,这次您将累积所有批次并在最后计算指标,而不是在每个 epoch 结束时计算和报告指标。

>>> import evaluate
>>> metric = evaluate.load("accuracy")
>>> model.eval()
>>> for batch in eval_dataloader:
...     batch = {k: v.to(device) for k, v in batch.items()}
...     with torch.no_grad():
...         outputs = model(**batch)
...     logits = outputs.logits
...     predictions = torch.argmax(logits, dim=-1)
...     metric.add_batch(predictions=predictions, references=batch["labels"])
>>> metric.compute()

额外资源

有关更多微调示例,请参考:

  • 🤗 Transformers Examples 包括了用于在 PyTorch 和 TensorFlow 中训练常见 NLP 任务的脚本。
  • 🤗 Transformers Notebooks 包含了关于如何在 PyTorch 和 TensorFlow 中为特定任务微调模型的各种笔记本。
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
1月前
|
数据可视化 自动驾驶 机器人
Transformers 4.37 中文文档(五)(4)
Transformers 4.37 中文文档(五)
23 0
|
1月前
|
存储 PyTorch TensorFlow
Transformers 4.37 中文文档(二)(2)
Transformers 4.37 中文文档(二)
46 7
|
1月前
|
自然语言处理 PyTorch 语音技术
Transformers 4.37 中文文档(四)(1)
Transformers 4.37 中文文档(四)
28 3
|
1月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一)(1)
Transformers 4.37 中文文档(一)
25 1
|
1月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一)(2)
Transformers 4.37 中文文档(一)
25 1
|
1月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(4)
Transformers 4.37 中文文档(一百)
23 1
|
1月前
|
存储 JSON 缓存
Transformers 4.37 中文文档(一百)(1)
Transformers 4.37 中文文档(一百)
18 1
|
1月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(6)
Transformers 4.37 中文文档(一百)
19 1
|
1月前
|
存储 自然语言处理 测试技术
Transformers 4.37 中文文档(八)(1)
Transformers 4.37 中文文档(八)
20 2
|
1月前
|
存储 开发工具 算法框架/工具
Transformers 4.37 中文文档(十)(3)
Transformers 4.37 中文文档(十)
23 0