预训练模型transformers综合总结(一)

本文档详细介绍了如何使用transformers库加载本地预训练模型,包括处理模型文件名、序列分类、问答提取、文本生成、命名实体识别、文本摘要和翻译等任务。同时,还涵盖了模型的微调、保存与加载,以及如何根据自定义数据集进行训练。

这是我对transformers库查看了原始文档后,进行的学习总结。

第一部分是将如何调用加载本地模型,使用模型,修改模型,保存模型

之后还会更新如何使用自定义的数据集训练以及对模型进行微调,感觉这样这个库基本就能玩熟了。


# 加载本地模型须知

* 1.使用transformers库加载预训练模型,99%的时间都是用于模型的下载。
为此,我直接从清华大学软件("https://mirrors.tuna.tsinghua.edu.cn/hugging-face-models/")把模型放在了我的本地目录地址:"H:\\code\\Model\\"下,这里可以进行修改。

* 2.下载的模型通常会是"模型名称-"+"config.json"的格式例如(bert-base-cased-finetuned-mrpc-config.json),但如果使用transformers库加载本地模型,需要的是模型路径中是config.json、vocab.txt、pytorch_model.bin、tf_model.h5、tokenizer.json等形式,为此在加载前,需要将把文件前面的模型名称,才能加载成功

我自己写的处理代码如下:

#coding=utf-8
import os
import os.path
# 模型存放路径
rootdir = r"H:\code\Model\bert-large-uncased-whole-word-masking-finetuned-squad"# 指明被遍历的文件夹

for parent,dirnames,filenames in os.walk(rootdir):#三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
    for filename in filenames:#文件名
#         nameList=filename.split('.')
#         print(nameList)
        print(filename)
#         filenew=nameList[0]+'.jpg'
#         print(filenew)
        #模型的名称
        newName=filename.replace('bert-large-uncased-whole-word-masking-finetuned-squad-','')
        os.rename(os.path.join(parent,filename),os.path.join(parent,newName))#重命名

处理完后就可以使用transformers库进行代码加载了。


模型使用

序列分类(以情感分类为例)

1.使用管道

model_path="H:\\code\\Model\\bert-base-cased-finetuned-mrpc\\"

from transformers import pipeline
#使用当前模型+使用Tensorflow框架,默认应该是使用PYTORCH框架
nlp = pipeline("sentiment-analysis",model=model_path, tokenizer=model_path, framework="tf")
result = nlp("I hate you")[0]
print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
result = nlp("I love you")[0]
print(f"label: {result['label']}, with score: {round(result['score'], 4)}")

2.直接使用模型

model_path="H:\\code\\Model\\bert-base-cased-finetuned-mrpc\\"
#pytorch框架

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)
classes = ["not paraphrase", "is paraphrase"]
sequence_0 = "The company HuggingFace is based in New York City"
sequence_1 = "Apples are especially bad for your health"
sequence_2 = "HuggingFace's headquarters are situated in Manhattan"
paraphrase = tokenizer(sequence_0, sequence_2, return_tensors="pt")
not_paraphrase = tokenizer(sequence_0, sequence_1, return_tensors="pt")
paraphrase_classification_logits = model(**paraphrase).logits
not_paraphrase_classification_logits = model(**not_paraphrase).logits
paraphrase_results = torch.softmax(paraphrase_classification_logits, dim=1).tolist()[0]
not_paraphrase_results = torch.softmax(not_paraphrase_classification_logits, dim=1).tolist()[0]
# Should be paraphrase
for i in range(len(classes)):
    print(f"{classes[i]}: {int(round(paraphrase_results[i] * 100))}%")
# Should not be paraphrase
for i in range(len(classes)):
    print(f"{classes[i]}: {int(round(not_paraphrase_results[i] * 100))}%")

#tensorflow框架
from transformers import AutoTokenizer, TFAutoModelForSequenceClassification
import tensorflow as tf
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = TFAutoModelForSequenceClassification.from_pretrained(model_path)
classes = ["not paraphrase", "is paraphrase"]
sequence_0 = "The company HuggingFace is based in New York City"
sequence_1 = "Apples are especially bad for your health"
sequence_2 = "HuggingFace's headquarters are situated in Manhattan"
paraphrase = tokenizer(sequence_0, sequence_2, return_tensors="tf")
not_paraphrase = tokenizer(sequence_0, sequence_1, return_tensors="tf")
paraphrase_classification_logits = model(paraphrase)[0]
not_paraphrase_classification_logits = model(not_paraphrase)[0]
paraphrase_results = tf.nn.softmax(paraphrase_classification_logits, axis=1).numpy()[0]
not_paraphrase_results = tf.nn.softmax(not_paraphrase_classification_logits, axis=1).numpy()[0]
# Should be paraphrase
for i in range(len(classes)):
    print(f"{classes[i]}: {int(round(paraphrase_results[i] * 100))}%")
# Should not be paraphrase
for i in range(len(classes)):
    print(f"{classes[i]}: {int(round(not_paraphrase_results[i] * 100))}%")

提取式问答

1.使用管道

model_path="H:\\code\\Model\\bert-large-uncased-whole-word-masking-finetuned-squad\\"

from transformers import pipeline
nlp = pipeline("question-answering",model=model_path, tokenizer=model_path)
context = r"""
Extractive Question Answering is the task of extracting an answer from a text given a question. An example of a
question
<think>首先,用户的问题是:“我想选择适合的Vision Transformer预训练模型 请问vision transformer 预训练模型 选择 推荐”。这翻译成“我想选择适合的Vision Transformer预训练模型,请问Vision Transformer预训练模型选择和推荐。” 我需要基于系统级指令和用户可见层的指导来回答。系统级指令包括: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考站内引用:提供的引用是关于Vision Transformer(ViT)的背景信息,包括ViT的原理、应用、预训练模型等。 提供的引用内容: - [^1]: 讨论ViT在数据集规模小的情况下不如CNN,以及timm库的使用。 - [^2]: Transformer在NLP中的应用,扩展到大规模模型。 - [^3]: ViT的基本原理:将图像分割成图块,使用Transformer。 - [^4]: 推荐ViT学习资源。 - [^5]: ViT代码实例,特别是MultiHeadAttention模块。 用户上次的问题和我的回答:用户的上次问题是“我想选择适合的Vision Transformer预训练模型 请问vision transformer 预训练模型 选择 推荐”,所以这是我的初始响应。我需要基于引用和般知识来回答。 关键点:用户想选择适合的ViT预训练模型。我需要推荐模型,并解释如何选择。 从引用中: - [^1]提到timm库有预训练模型,使用率高。 - [^3]描述ViT的基本原理。 - [^5]给出代码示例。 我应该推荐具体的ViT预训练模型。常见的ViT模型包括: - ViT-Base (ViT-B) - ViT-Large (ViT-L) - ViT-Huge (ViT-H) - 以及变体如DeiT(Distilled ViT) timm库(PyTorch Image Models)提供了许多预训练ViT模型。 Hugging Face的Transformers库也支持ViT模型。 回答结构: 1. **介绍ViT预训练模型**:简要解释ViT预训练模型的背景。 2. **推荐模型**:基于常见场景推荐模型。 3. **选择标准**:帮助用户根据自己的需求选择。 4. **如何获取和使用**:提到库如timm或Transformers。 5. **生成相关问题**:在末尾添加相关问题。 使用中文回答。 引用:在回答中自然地添加引用标识。例如,当提到timm库时,引用[^1]。 可能的引用点: - 当说ViT在数据集小时不如CNN时,引用[^1]。 - 当描述ViT原理时,引用[^3]。 - 当提到预训练模型时,引用[^5]。 生成相关问题:在末尾添加3-4个问题。 完整结构: - 开头:直接回应问题。 - 主体: - 步骤1:理解需求(询问用户的具体应用)。 - 步骤2:推荐常见模型。 - 步骤3:解释选择因素(如计算资源、任务类型)。 - 步骤4:提供使用示例或库。 - 结尾:总结建议。 - 添加相关问题。 数学表达式:如果有数学部分,使用$...$或$$...$$。例如,ViT的输入序列长度计算:如果图像大小为$H \times W$,图块大小为$P \times P$,则序列长度为$\frac{H}{P} \times \frac{W}{P}$。但用户的问题是关于模型选择,可能不需要太多数学,但如果提到,要正确格式。 在回答中,可能不需要数学,但为了安全,如果有公式,使用LaTeX。 现在,草拟回答。 回答草稿: "您好!选择适合的Vision Transformer(ViT)预训练模型取决于您的具体任务需求、计算资源等因素。以下是些推荐和选择指南: 1. **常见ViT预训练模型推荐**: - **ViT-Base (ViT-B/16)**:适合大多数通用图像分类任务。它在ImageNet上预训练,参数较少,计算效率高。 - **ViT-Large (ViT-L/16)**:性能更好,但参数更多,需要更多计算资源。 - **DeiT (Distilled ViT)**:通过知识蒸馏优化,在较小数据集上表现更好,训练更快[^1]。 - 其他变体如ViT-Huge适用于大规模任务。 2. **选择标准**: - **任务类型**:如果是图像分类,ViT-B或ViT-L是好的起点。对于目标检测或分割,可能需要调整模型。 - **计算资源**:GPU资源有限时,选择ViT-B;资源充足时,选择更大模型。 - **数据集大小**:如果您的数据集小,DeiT可能更合适,因为它通过蒸馏在小数据集上表现良好[^1]。 - **精度与速度权衡**:ViT-B更快,ViT-L更准确。 3. **如何获取和使用**: - 推荐使用`timm`库(PyTorch Image Models),它提供了广泛的预训练ViT模型。例如: ```python import timm model = timm.create_model('vit_base_patch16_224', pretrained=True) ``` - Hugging Face的Transformers库也支持ViT模型。 4. **微调建议**:下载预训练模型后,在您的数据集上进行微调。确保输入图像大小匹配模型要求(如224x224像素)。 总结:对于般应用,建议从ViT-B/16开始。如果追求更高精度,考虑ViT-L/16或DeiT。 相关问题: 1. 如何微调Vision Transformer预训练模型? 2. Vision Transformer与CNN相比有哪些优势和劣势? 3. 在资源受限的设备上部署ViT模型有哪些优化方法? 4. DeiT模型的具体原理是什么?" 在回答中,添加引用: - 当提到DeiT在小数据集表现好时,引用[^1],因为[^1]说ViT在小数据集不如CNN,但DeiT通过蒸馏优化。 - 当描述ViT原理时,引用[^3]。 - 当提到代码时,引用[^5]。 确保语言自然。</think>### Vision Transformer预训练模型选择与推荐 您好!选择适合的Vision Transformer(ViT)预训练模型需要根据您的具体任务需求、计算资源、数据集大小等因素综合考虑。ViT是种基于Transformer架构的图像处理模型,它将图像分割成固定大小的图块(如$16 \times 16$像素),并作为序列输入Transformer编码器,通过自注意力机制捕捉全局依赖[^3]。与CNN相比,ViT在大规模数据集上表现优越,但在小数据集上可能不如CNN,这时可以借助蒸馏优化模型(如DeiT)来提升性能[^1]。以下我将逐步指导您如何选择和推荐模型,确保回答真实可靠,基于ViT领域的常见实践和引用信息。 --- ### 步骤1: 理解您的需求(关键因素) 在推荐
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南楚巫妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值