首页 > 其他分享 >(一)一文读懂transformers库中常见组件PreTrainedModel,PretrainedConfig,AutoTokenizer,AutoProcessor,AutoModel等

(一)一文读懂transformers库中常见组件PreTrainedModel,PretrainedConfig,AutoTokenizer,AutoProcessor,AutoModel等

时间:2025-01-23 15:56:42浏览次数:3  
标签:AutoTokenizer transformers 训练 模型 AutoProcessor import input 加载

文章目录

在自然语言处理(NLP)和深度学习的奇妙世界里,transformers 库就像是一个装满宝藏的魔法口袋,为开发者和研究者们提供了一系列强大而实用的工具。今天,就让我们一起踏上这段奇幻之旅,深入了解 transformers 库中的几个重要组件:TrainerTrainingArgumentsDataCollatorWithPaddingCausalLMOutputWithPastAutoProcessorAutoModelPreTrainedModelPretrainedConfigAutoTokenizerAutoModelForCausalLM

一、训练管理大师:TrainerTrainingArguments

TrainingArguments:训练的“魔法配方”

想象一下,你要制作一道美味的菜肴,你需要一份详细的配方来指导你加入各种调料和控制火候。在深度学习中,TrainingArguments 就是训练模型的“魔法配方”。它是一个用于存储训练过程中各种参数的类,就像配方中的各种调料和烹饪步骤一样,决定了训练的方方面面。

以下是一个简单的示例,展示如何使用 TrainingArguments

from transformers import TrainingArguments

# 定义训练参数
training_args = TrainingArguments(
    output_dir='./results',          # 训练结果保存的目录
    num_train_epochs=3,              # 训练的轮数
    per_device_train_batch_size=16,  # 每个设备上的训练批量大小
    per_device_eval_batch_size=64,   # 每个设备上的评估批量大小
    warmup_steps=500,                # 学习率热身步数
    weight_decay=0.01,               # 权重衰减率
    logging_dir='./logs',            # 日志保存的目录
    logging_steps=10,                # 每多少步记录一次日志
    save_steps=1000,                 # 每多少步保存一次模型
    evaluation_strategy="steps",     # 评估策略,按步数评估
    eval_steps=500                   # 每多少步进行一次评估
)

在这个例子中,我们设置了训练的输出目录、训练轮数、批量大小、学习率热身步数、权重衰减率等参数。这些参数就像烹饪配方中的各种调料和烹饪步骤,决定了训练的效果和性能。

Trainer:训练的“超级厨师”

有了“魔法配方”,还需要一位“超级厨师”来将配方变成美味的菜肴。Trainer 就是这位“超级厨师”,它封装了深度学习训练的主要过程,让你可以轻松地进行训练。

以下是一个使用 Trainer 进行训练的示例:

from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset

# 加载数据集
dataset = load_dataset("imdb")

# 加载预训练模型
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

# 使用上面定义的训练参数
trainer = Trainer(
    model=model,                         # 要训练的模型
    args=training_args,                  # 训练参数
    train_dataset=dataset["train"],      # 训练数据集
    eval_dataset=dataset["test"]         # 评估数据集
)

# 开始训练
trainer.train()

在这个例子中,我们使用 Trainer 来训练一个基于 BERT 的文本分类模型。Trainer 会根据我们提供的模型、训练参数、训练数据集和评估数据集,自动完成训练过程,包括数据加载、模型训练、损失计算、评估等步骤。

二、数据整理小能手:DataCollatorWithPadding

在深度学习中,数据就像一块块形状各异的拼图,而模型就像一个只能接受特定形状拼图的拼图板。DataCollatorWithPadding 就是一位神奇的拼图整理师,它可以将不同形状的拼图(数据)整理成统一的形状,以便放入拼图板(模型)中。

以下是一个使用 DataCollatorWithPadding 的示例:

from transformers import AutoTokenizer, DataCollatorWithPadding
from datasets import load_dataset

# 加载数据集
dataset = load_dataset("imdb")

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 对数据集进行分词
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 创建数据整理器
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

# 示例数据
samples = tokenized_datasets["train"][:5]
batch = data_collator(samples)

print("原始样本长度:", [len(sample["input_ids"]) for sample in samples])
print("整理后批次的输入 ID 形状:", batch["input_ids"].shape)

在这个例子中,我们首先加载了一个文本数据集,并使用 AutoTokenizer 对数据进行分词。然后,我们创建了一个 DataCollatorWithPadding 实例,它会根据 tokenizer 的填充规则,将不同长度的样本填充到相同的长度。最后,我们使用这个数据整理器对一批样本进行整理,并打印出原始样本的长度和整理后批次的输入 ID 形状。

三、因果语言模型的输出管家:CausalLMOutputWithPast

因果语言模型(Causal Language Model,CLM)就像一位讲故事的高手,它根据前文预测下一个词,逐步生成一个完整的故事。CausalLMOutputWithPast 就是这位讲故事高手的输出管家,它负责存储和管理模型的输出信息。

以下是一个简单的示例,展示如何使用 CausalLMOutputWithPast

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.modeling_outputs import CausalLMOutputWithPast

# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")

# 输入文本
input_text = "Once upon a time"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids

# 模型前向传播
outputs = model(input_ids)

# 输出是一个 CausalLMOutputWithPast 对象
print("输出类型:", type(outputs))
print("损失值:", outputs.loss)
print("预测的 logits 形状:", outputs.logits.shape)

在这个例子中,我们使用 GPT-2 模型进行文本生成。模型的输出是一个 CausalLMOutputWithPast 对象,我们可以通过它的属性访问损失值和预测的 logits。

四、模型加载与处理的智能助手:AutoProcessorAutoModel

AutoProcessor:数据预处理的智能精灵

在将数据输入模型之前,通常需要进行一些预处理步骤,例如对图像进行裁剪、归一化,对文本进行分词和编码等。AutoProcessor 就是一个智能精灵,它可以根据你提供的模型名称或路径,自动选择和加载正确的处理器,帮助你完成这些预处理步骤。

以下是一个使用 AutoProcessor 处理图像的示例:

from transformers import AutoProcessor, AutoModelForImageClassification
from PIL import Image
import requests

# 加载处理器和模型
processor = AutoProcessor.from_pretrained("google/vit-base-patch16-224")
model = AutoModelForImageClassification.from_pretrained("google/vit-base-patch16-224")

# 从网络加载一张图像
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

# 使用处理器对图像进行预处理
inputs = processor(images=image, return_tensors="pt")

# 模型前向传播
outputs = model(**inputs)
logits = outputs.logits

# 预测结果
predicted_class_idx = logits.argmax(-1).item()
print("预测的类别索引:", predicted_class_idx)
print("预测的类别标签:", model.config.id2label[predicted_class_idx])

在这个例子中,我们使用 AutoProcessor 对一张图像进行预处理,然后将处理后的图像输入到一个图像分类模型中进行预测。AutoProcessor 会自动完成图像的裁剪、归一化等预处理步骤,使图像符合模型的输入要求。

AutoModel:预训练模型的万能钥匙

AutoModel 就像一把万能钥匙,可以打开各种预训练模型的大门。它提供了一种方便的方式来加载各种类型的预训练模型,无论是用于文本分类、序列标注、文本生成还是其他任务,都可以使用 AutoModel 来加载。

以下是一个使用 AutoModel 加载文本分类模型的示例:

from transformers import AutoModelForSequenceClassification, AutoTokenizer

# 加载模型和分词器
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 输入文本
input_text = "This movie is really great!"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids

# 模型前向传播
outputs = model(input_ids)
logits = outputs.logits

# 预测结果
predicted_class_idx = logits.argmax(-1).item()
print("预测的类别索引:", predicted_class_idx)

在这个例子中,我们使用 AutoModelForSequenceClassification(继承自 AutoModel)加载了一个基于 BERT 的文本分类模型,并对输入的文本进行分类预测。

五、预训练模型的基石:PreTrainedModelPretrainedConfigAutoTokenizerAutoModelForCausalLM

PreTrainedModel:预训练模型的基础模板

PreTrainedModeltransformers 库中的一个基类,就像建造房子的基础模板一样,为预训练模型提供了通用的行为和属性。以下是一个简单的自定义模型继承 PreTrainedModel 的示例:

from transformers import PreTrainedModel, PretrainedConfig

# 自定义配置类
class MyConfig(PretrainedConfig):
    def __init__(self, hidden_size=768, **kwargs):
        self.hidden_size = hidden_size
        super().__init__(**kwargs)

# 自定义模型类
class MyModel(PreTrainedModel):
    config_class = MyConfig

    def __init__(self, config):
        super().__init__(config)
        # 这里可以定义模型的层和结构
        # 例如:
        # self.linear = nn.Linear(config.hidden_size, 2)

# 创建配置实例
config = MyConfig()

# 创建模型实例
model = MyModel(config)

在这个例子中,我们定义了一个自定义的配置类 MyConfig 和一个自定义的模型类 MyModelMyModel 继承自 PreTrainedModel。我们可以根据需要在 MyModel 中定义模型的层和结构。

PretrainedConfig:模型配置的秘密手册

PretrainedConfig 是用于存储预训练模型配置信息的类,就像一本秘密手册,记录了模型的各种设置和参数。以下是一个使用 PretrainedConfig 的示例:

from transformers import PretrainedConfig

# 创建一个配置实例
config = PretrainedConfig(
    hidden_size=768,
    num_attention_heads=12,
    num_hidden_layers=12
)

# 打印配置信息
print("隐藏层大小:", config.hidden_size)
print("注意力头数量:", config.num_attention_heads)
print("隐藏层数量:", config.num_hidden_layers)

在这个例子中,我们创建了一个 PretrainedConfig 实例,并设置了一些配置参数,然后打印出这些参数。

AutoTokenizer:文本处理的分词小精灵

在处理文本数据时,首先需要将文本分割成一个个的词或标记,这就是分词的过程。AutoTokenizer 就是一个分词小精灵,它可以根据你指定的预训练模型名称或路径,自动选择并加载正确的分词器。

以下是一个使用 AutoTokenizer 进行分词的示例:

from transformers import AutoTokenizer

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 输入文本
input_text = "Hello, how are you?"

# 分词
tokens = tokenizer.tokenize(input_text)
input_ids = tokenizer.convert_tokens_to_ids(tokens)

print("分词结果:", tokens)
print("转换后的 ID:", input_ids)

在这个例子中,我们使用 AutoTokenizer 对输入的文本进行分词,并将分词结果转换为 ID 列表。

AutoModelForCausalLM:因果语言模型的专属通道

AutoModelForCausalLM 是专门为因果语言模型设计的类,就像一个专属通道,为因果语言模型的加载和使用提供了便利。以下是一个使用 AutoModelForCausalLM 进行文本生成的示例:

from transformers import AutoModelForCausalLM, AutoTokenizer

# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")

# 输入文本
input_text = "The quick brown fox"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids

# 生成文本
outputs = model.generate(input_ids, max_length=50, num_return_sequences=1)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

print("生成的文本:", generated_text)

在这个例子中,我们使用 AutoModelForCausalLM 加载了 GPT-2 模型,并使用该模型进行文本生成。

六、总结

transformers 库中的这些组件就像一群默契的小伙伴,各自发挥着独特的作用,共同帮助我们在深度学习和自然语言处理的世界中探索和创造。TrainingArgumentsTrainer 帮助我们管理和执行训练过程;DataCollatorWithPadding 让数据变得整齐有序;CausalLMOutputWithPast 管理因果语言模型的输出;AutoProcessorAutoModel 帮助我们加载和处理模型;PreTrainedModelPretrainedConfigAutoTokenizerAutoModelForCausalLM 则为预训练模型的构建和使用提供了基础和便利。

标签:AutoTokenizer,transformers,训练,模型,AutoProcessor,import,input,加载
From: https://blog.csdn.net/weixin_73373302/article/details/145324767

相关文章

  • Gradio + Transformers** 实现带记忆功能的对话系统完整代码示例
    以下是一个使用Gradio+Transformers实现带记忆功能的对话系统完整代码示例,无需额外数据库依赖:importgradioasgrimportnumpyasnpfromtransformersimportAutoTokenizer,AutoModelfromtypingimportDict,List,Tuple#-----------------初始化模型---......
  • 一镜到底,通过Llama大模型架构图看透transformers原理
    一镜到底,通过Llama大模型架构图看透transformers原理LlamaNutsandBolts是Github上使用Go语言从零重写Llama3.18B-Instruct模型推理过程(80亿参数规模)的实战类开源项目,其作者是来自土耳其的AdilAlperDALKIRAN。如果你对于LLM(大语言模型)和Transformers的工作原理感兴趣,并......
  • 探索 Hugging Face Transformers 库
    自然语言处理(NLP)领域近年来取得了巨大的进展,而HuggingFaceTransformers库无疑是推动这一进展的重要力量。它为研究人员和开发者提供了丰富的预训练模型、简洁易用的接口以及高效的工具,极大地简化了NLP任务的开发流程。本文将带您深入探索Transformers库,了解其核心功能、......
  • Switch Transformers: 通过简单高效的稀疏性扩展到万亿参数模型
    摘要在深度学习中,模型通常为所有输入重用相同的参数。专家混合(MixtureofExperts,MoE)模型则不同,它为每个输入示例选择不同的参数。结果是一个稀疏激活的模型——具有惊人的参数数量——但计算成本恒定。然而,尽管MoE取得了一些显著的成功,但其广泛采用仍受到复杂性、通信......
  • Transformers 框架 Pipeline 任务详解(六):填充蒙版(fill-mask)
    在自然语言处理(NLP)领域,填空或填补句子中的缺失部分是一项重要的任务。它不仅考验了模型对语言的理解能力,还展示了其生成合理且语义连贯的文本的能力。HuggingFace的Transformers框架通过其PipelineAPI提供了强大的fill-mask功能,允许开发者和研究者轻松构建并应用这种填空技......
  • Transformers 框架 Pipeline 任务详解(五):表格问答(table-question-answering)
    在自然语言处理领域,表格问答是一项能够从结构化数据中提取信息的关键技术。它结合了自然语言理解和表格数据处理的能力,使得用户可以通过自然语言提问来获取表格中的特定信息。HuggingFace的Transformers框架通过其PipelineAPI提供了强大的table-question-answering功能,允许......
  • Transformers 框架 Pipeline 任务详解(四):问答(question-answering)
    在自然语言处理领域,问答系统是一项关键的技术,它旨在根据给定的问题从文本中找到最准确的答案。借助HuggingFace的Transformers框架的PipelineAPI,我们可以快速地搭建一个强大的问答系统,而无需深入理解背后的复杂模型结构和算法细节。本文将详细探讨Transformers框架中的qu......
  • Transformers-pipline
    HFTransformersPipelinesPipelines接口方式任务名称参数名称参数描述sentiment-analysismodel指定使用的模型名称或路径。tokenizer指定使用的分词器名称或路径。framework选择使用的深度学习框架,"pt"表示PyTorch,"tf"表示TensorFlow。device设......
  • TransCenter: Transformers with DenseRepresentations for Multiple-Object Tracking
    论文阅读笔记5——TransCenter:TransformerswithdensequeriesforMOT-CSDN博客TransCenter:TransformerswithDenseQueriesforMultiple-ObjectTracking-CSDN博客多目标跟踪TransCenter解读-CSDN博客简介:时间:2022期刊:TPAMI作者:YihongXu,YutongBan,Guill......
  • 深入解析 Transformers 框架(五):嵌入(Embedding)机制和 Word2Vec 词嵌入模型实战
    通过前面几篇关于Transformers框架的技术文章,我们探讨了大模型的配置、分词器和BPE(Byte-PairEncoding)分词算法。这些技术帮助我们将一段文本序列处理成一个Token(词元)列表,并为每个Token分配一个唯一的TokenID。然而,这仅仅是大模型输入层工作的第一步。接下来,我们将深入探......