在 Models - Hugging Face模型中找使用方法
https://hf-mirror.com/
一:如何找到统一使用方法
对于文字处理AutoTokenizer是一样的,模型名可能不一样。具体操作如下:
1. 先在模型下面找到你需要的模型点开
2. 点开最右边的Use in Transformers
二:如何找到本模型使用方法
滑到底端的如何使用,此为pytorch的使用方法,也有其他的说明。
其中字符串名字可以为路径。
同理,文本操作如下:
专属命名的方法一般是:
分词器命名:“模型名+Tokenizer”
图片处理命名:模型名+ImageProcessor
模型名命名:“ 模型名+Modal”
这个命名和公司有关,还是直接选择自己需要的模型在官网查询使用最好。
三:两种使用方法结果一样
# -------------------- 使用 RobertaTokenizer ---------------
tokenizer = RobertaTokenizer.from_pretrained(pretrained_model_path)
inputs = tokenizer("对比原始的分词和最新的分词器", return_tensors="pt")
print(inputs['input_ids'])# -------------------- 使用 AutoTokenizer ---------------
auto_tokenizer = AutoTokenizer.from_pretrained(pretrained_model_path) # 使用一样的
auto_inputs = auto_tokenizer('对比原始的分词和最新的分词器', return_tensors='pt')
print(auto_inputs['input_ids'])
输出的结果一样。
参考:https://blog.csdn.net/qq_41458274/article/details/131175991
四:模型详解
以ner模型为例
# Load model directly
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipelinetokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-cluener2020-chinese")
model = AutoModelForTokenClassification.from_pretrained("uer/roberta-base-finetuned-cluener2020-chinese")ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer)
ner_pipeline("马云是阿里巴巴的创始人,他住在中国杭州。")
tokenizer = AutoTokenizer.from_pretrained(“uer/roberta-base-finetuned-cluener2020-chinese”)
model = AutoModelForTokenClassification.from_pretrained(“uer/roberta-base-finetuned-cluener2020-chinese”)
这两行代码是用于加载一个预训练的模型和对应的分词器,它们属于 Hugging Face 的 transformers 库。这些代码的作用是:
1. tokenizer = AutoTokenizer.from_pretrained(“uer/roberta-base-finetuned-cluener2020-chinese”)
这行代码用于加载与模型匹配的分词器(tokenizer)。具体来说,它加载的是一个中文的 RoBERTa 模型,经过微调(fine-tuning)后用于 CLUENER 2020 数据集的命名实体识别任务。
- AutoTokenizer: 这是 Hugging Face 提供的一个自动化类,它会根据指定的模型名称自动选择合适的分词器。AutoTokenizer 可以根据模型的不同类型(如 BERT、RoBERTa、GPT 等)自动加载相应的分词器。
- from_pretrained(): 这个方法从 Hugging Face 的模型库中加载一个预训练的分词器(或者可以加载本地文件)。“uer/roberta-base-finetuned-cluener2020-chinese” 是模型的名称,它代表了一个已经微调过的 RoBERTa 模型,专门用于中文命名实体识别(NER)。
这个分词器会负责:
- 将文本转换为模型输入:它将输入的中文文本拆分为子词(tokens),并将其转换为模型可以理解的张量形式(如 input_ids 和 attention_mask)。
- 处理与模型相关的词汇表:例如,处理模型专用的 [CLS]、[SEP] 等特殊符号。
具体的文件来源:
AutoTokenizer 加载的是与模型匹配的分词器配置文件和词汇表文件。这些文件定义了如何将文本转换为模型所需的 token(子词单元)及其 ID,以及如何将 ID 转回为原始文本。对于该模型,它可能会加载类似于以下的文件:
- vocab.json(包含词汇表)
- tokenizer_config.json(分词器配置)
- special_tokens_map.json(特殊标记,如 [CLS], [SEP] 等)
- config.json
2. model = AutoModelForTokenClassification.from_pretrained(“uer/roberta-base-finetuned-cluener2020-chinese”)
这行代码用于加载一个预训练的模型,具体来说是一个基于 RoBERTa 的 Token Classification 模型,经过微调用于 命名实体识别(NER)。
- AutoModelForTokenClassification: 这个类用于加载预训练的、可以用于标记分类(Token Classification)任务的模型。例如,命名实体识别就是一个典型的 token classification 任务,每个 token 会被分配一个标签,如人名、地名、组织名等。
- from_pretrained(): 这个方法从 Hugging Face 的模型库中加载一个预训练的模型(同样也可以加载本地文件)。 “uer/roberta-base-finetuned-cluener2020-chinese” 是模型名称,它代表了一个经过微调的中文 RoBERTa 模型,专门用于 CLUENER 2020 数据集中的 NER 任务。
这个模型会负责:
- 对文本中的每个 token 进行分类:对于每个输入的 token,模型会预测它的标签。例如,模型可能会预测 “北京” 这个 token 的标签为 B-LOC(Location的开始)。
- 使用微调后的权重进行推理:这个模型已经在特定的中文命名实体识别任务上进行了微调,因此它能够识别中文文本中的不同命名实体,如人名、地名、组织名等。
具体的文件来源:
AutoModelForTokenClassification 加载的是模型本身,包括模型架构以及已微调的权重。这些文件包含了模型的所有参数(如 RoBERTa 网络的层、注意力头等),并且是针对特定任务(例如命名实体识别)进行了微调。对于该模型,它可能会加载类似以下的文件:
- pytorch_model.bin(包含模型的权重)
- config.json(包含模型配置,如网络结构)
3. 总结:
- AutoTokenizer 和 AutoModelForTokenClassification 都加载的是同一个模型资源,即 uer/roberta-base-finetuned-cluener2020-chinese。
- AutoTokenizer 加载的是分词器相关的文件(如词汇表、分词器配置等)。
- AutoModelForTokenClassification 加载的是微调后的模型文件(包含模型架构和权重)。
4. tf_model.h5 和 flax_model.msgpack
tf_model.h5 和 flax_model.msgpack 是两种不同框架和格式下的模型文件,它们分别与 TensorFlow 和 Flax 框架相关。每个文件类型用于不同的深度学习框架,并包含不同的内容。下面分别解释这两个文件的作用:
tf_model.h5
- 框架:TensorFlow
- 文件类型:HDF5 格式(即 .h5 文件)
- 用途:tf_model.h5 是 TensorFlow 训练后的模型文件,通常保存了整个模型的结构和训练得到的权重。它是 TensorFlow 中最常用的模型保存格式之一。
内容:
- 模型结构(Architecture):包括模型的层(Layer)和它们的连接方式,定义了神经网络的结构 (例如卷积层、全连接层、LSTM 等)。
- 模型权重(Weights):包括训练过程中学到的参数(权重和偏置),这些参数是模型根据数据学习得到的。
- 优化器状态(Optimizer state):包括优化器的状态(例如 Adam 优化器的动量信息),用于恢复模型训练的状态。
用途:
- 保存模型:在训练完成后,将模型保存为 tf_model.h5 格式,方便以后加载并进行预测或继续训练。
- 迁移学习:可以将 .h5 格式的模型加载到另一个环境中,进行微调(fine-tuning)或做迁移学习。
from tensorflow.keras.models import load_model# 加载保存的模型
model = load_model('tf_model.h5')# 进行推理或进一步训练
predictions = model.predict(input_data)
flax_model.msgpack
- 框架:Flax(基于 JAX)
- 文件类型:MessagePack 格式(即 .msgpack 文件)
- 用途:flax_model.msgpack 是使用 Flax 框架训练的模型文件。Flax 是一个基于 JAX 的深度学习库,JAX 提供了高效的数值计算支持,而 Flax 主要用于构建神经网络模型。msgpack 是一种高效的二进制序列化格式,Flax 用它来保存模型的参数。
内容:
- 模型参数(Model parameters):包括神经网络中的权重、偏置等参数,这些是模型在训练时学习得到的。
- 模型配置(Model configuration):Flax 的模型通常由不同的模块和层组合而成,.msgpack 文件保存了模型的具体参数和配置。
用途:
- 保存和加载 Flax 模型:.msgpack 文件用于保存 Flax 模型的参数。它是一个平台和框架无关的二进制文件,可以高效地存储和加载模型。
- 高效存储和传输:MessagePack 格式比 JSON 更小,因此它在存储和网络传输时会更加高效,适用于大规模的深度学习模型。
import flax
from flax.training import checkpoints# 加载模型
checkpoint = checkpoints.restore_checkpoint(ckpt_dir='.', target=None)# 使用加载的模型进行推理
params = checkpoint['model'] # 获取模型参数
五:将模型保存为 .pt 格式
他本来就是pt
加载模型
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipelinetokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-cluener2020-chinese")
model = AutoModelForTokenClassification.from_pretrained("uer/roberta-base-finetuned-cluener2020-chinese")
# 查看模型结构
model
保存为pt
import torch
torch.save(model, "./model.pt")
(1) torch.save(model.state_dict(), “model.pt”)
保存模型为 .pt 文件(保存的是模型的权重数据字典。state_dict 只包含模型的参数,不包括模型的结构定义。加载时你需要确保模型架构和参数相匹配。)
(2) torch.save(model, “model.pt”)
或者直接保存整个模型(保存整个模型,包括结构和权重。这种方式较为方便,因为加载时不需要重新定义模型结构。)
使用pt模型预测
import torch
from transformers import AutoTokenizer, pipelinemodel = torch.load("./model.pt")
tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-cluener2020-chinese")
# 确保模型在评估模式
model.eval()
ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer)
ner_pipeline("马云是阿里巴巴的创始人,他住在中国杭州。")
六、模型结构
print(model)
RobertaForTokenClassification((roberta): RobertaModel((embeddings): RobertaEmbeddings((word_embeddings): Embedding(21128, 768)(position_embeddings): Embedding(512, 768)(token_type_embeddings): Embedding(2, 768)(LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)(dropout): Dropout(p=0.1, inplace=False))(encoder): RobertaEncoder((layer): ModuleList((0): RobertaLayer((attention): RobertaAttention((self): RobertaSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): RobertaAttentionOutput((dense): Linear(in_features=768, out_features=768, bias=True)(layer_norm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)(dropout): Dropout(p=0.1, inplace=False)))(intermediate): RobertaIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True)(activation): GELUActivation())(output): RobertaOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(layer_norm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)(dropout): Dropout(p=0.1, inplace=False)))...))(pooler): RobertaPooler((dense): Linear(in_features=768, out_features=768, bias=True)(activation): Tanh()))(classifier): Linear(in_features=768, out_features=11, bias=True) # NER分类头
)
- RobertaForTokenClassification: 这是一个用于标注任务(例如命名实体识别,NER)的模型,继承自RobertaModel,同时增加了用于分类的 classifier 层。
- roberta: 这是底层的 RoBERTa 模型,它包括:
(1) embeddings: 词嵌入层(word embeddings),包括词嵌入、位置嵌入和token类型嵌入。
(2) encoder: 由多个 RobertaLayer 组成的编码器,它包含了自注意力层(self-attention)和前馈神经网络层(feed-forward) - classifier: 这是一个线性分类头(Linear),用于对每个token进行分类,输出层的维度是 11,即针对NER任务的实体类别数量(具体类别数量取决于任务)。
如果你想查看模型的更多详细层次结构,或检查特定层的参数,可以使用如下方式:
# 查看模型的所有层
for name, module in model.named_modules():print(name, ":", module)