【深度学习 transformer】使用pytorch 训练transformer 模型,hugginface 来啦

Hugging Face是一个致力于开源自然语言处理(NLP)和机器学习项目的社区。它由几个关键组件组成:

  1. Transformers:这是一个基于PyTorch的库,提供了各种预训练的NLP模型,如BERT、GPT、RoBERTa、DistilBERT等。它还提供了一个简单易用的API来加载这些模型,并进行微调以适应特定的下游任务。
  2. Datasets:这是一个用于加载和预处理NLP数据集的库,与Transformers配合使用,可以轻松地加载常见的数据集,如GLUE、SuperGLUE、SQuAD等。
  3. Hub:这是一个模型和数据集的存储库,用户可以上传自己的模型和数据集,并分享给社区。这使得研究人员和开发者可以轻松地访问和重用现有的资源。
  4. Coqa:这是一个用于问答系统研究的平台,提供了一个开放的数据集和工具,用于评估和比较不同的问答系统。
  5. PreTrained:这是一个用于预训练NLP模型的库,提供了各种预训练模型和数据集。
  6. Trainer:这是一个用于训练和评估NLP模型的库,提供了自动调整学习率、保存最佳模型、生成报告等功能。
    Hugging Face社区致力于推动NLP和机器学习技术的发展,为研究人员和开发者提供了一个强大的工具和资源。通过这些工具和资源,研究人员可以更容易地构建和训练先进的NLP模型,而开发者可以更容易地将这些模型集成到他们的应用程序中。

使用PyTorch训练Transformer模型通常涉及以下步骤:

  1. 安装PyTorch
    如果您尚未安装PyTorch,可以使用以下命令进行安装:
    pip install torch
    pip install transformers 
    
  2. 准备数据
    • 加载数据集,例如使用pandas库读取CSV文件。
    • 对文本数据进行预处理,如分词、转换为小写、去除停用词等。
    • 准备标签数据,确保它们是数值化的。
  3. 定义模型
    • 使用PyTorch定义Transformer模型,包括编码器和解码器(如果需要)。
    • 定义损失函数和优化器。
  4. 数据加载
    • 使用PyTorch的DataLoader将数据集分割为训练集和验证集。
    • 设置批处理大小和采样器。
  5. 训练模型
    • 在训练循环中,将数据加载到GPU(如果可用)。
    • 执行前向传播,计算损失。
    • 反向传播,更新模型参数。
    • 使用学习率调度器调整学习率。
  6. 评估模型
    • 在验证集上评估模型的性能。
    • 计算准确率、召回率、F1分数等指标。
  7. 保存模型
    • 将训练好的模型保存到文件,以便将来使用。
      以下是一个简化的代码示例,展示了如何使用PyTorch训练一个文本分类的Transformer模型:

在这个代码示例中,我们首先定义了一个简单的Transformer文本分类模型,它使用了预训练的BERT模型作为编码器。然后,我们定义了一个数据集类,用于处理文本数据和标签。接着,我们创建了一个数据加载器,它将数据集分割为训练集和验证集。在训练循环中,我们使用优化器来更新模型参数,并使用学习率调度器来调整学习率。在评估循环中,我们计算模型的准确率。最后,我们将训练好的模型状态保存到文件中。

请注意,这只是一个简化的示例,实际代码可能会更复杂,具体取决于您选择的模型和配置。您还需要根据实际情况调整数据预处理和模型定义的步骤。此外,您可能需要根据您的硬件配置(如GPU可用性)来调整代码。

import torch
from torch import nn
from torch.optim import Adam
from torch.utils.data import DataLoader, Dataset
from transformers import BertTokenizer, BertModel, BertForSequenceClassification# 定义Transformer模型
class TransformerTextClassifier(nn.Module):def __init__(self, num_classes):super(TransformerTextClassifier, self).__init__()self.bert = BertModel.from_pretrained('bert-base-uncased')self.classifier = nn.Linear(self.bert.config.hidden_size, num_classes)def forward(self, input_ids, attention_mask):outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)pooled_output = outputs.pooler_outputlogits = self.classifier(pooled_output)return logits# 定义数据集
class TextDataset(Dataset):def __init__(self, texts, labels, tokenizer, max_len):self.texts = textsself.labels = labelsself.tokenizer = tokenizerself.max_len = max_lendef __len__(self):return len(self.texts)def __getitem__(self, idx):text = self.texts[idx]label = self.labels[idx]encoding = self.tokenizer.encode_plus(text,add_special_tokens=True,max_length=self.max_len,return_token_type_ids=False,pad_to_max_length=True,return_attention_mask=True,return_tensors='pt',)return {'input_ids': encoding['input_ids'],'attention_mask': encoding['attention_mask'],'label': torch.tensor(label, dtype=torch.long)}# 加载数据集
texts = ["这是一个测试文本。", "这是另一个测试文本。"]
labels = [0, 1]
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
max_len = 128
dataset = TextDataset(texts, labels, tokenizer, max_len)
dataloader = DataLoader(dataset, batch_size=16)# 定义模型
num_classes = 2
model = TransformerTextClassifier(num_classes)# 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=2e-5)# 检查CUDA是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)# 训练模型
model.train()
for epoch in range(num_epochs):for batch in dataloader:optimizer.zero_grad()input_ids = batch['input_ids'].to(device)attention_mask = batch['attention_mask'].to(device)labels = batch['label'].to(device)outputs = model(input_ids, attention_mask)loss = loss_fn(outputs, labels)loss.backward()optimizer.step()# 评估模型
model.eval()
with torch.no_grad():for batch in dataloader:input_ids = batch['input_ids'].to(device)attention_mask = batch['attention_mask'].to(device)labels = batch['label'].to(device)outputs = model(input_ids, attention_mask)predictions = outputs.argmax(dim=1)accuracy += (predictions == labels).sum().item()print(f"Accuracy: {accuracy / len(dataset)}")# 保存模型
torch.save(model.state_dict(), "model.pth")

在这个代码示例中,我们首先定义了一个简单的Transformer文本分类模型,它使用了预训练的BERT模型作为编码器。然后,我们定义了一个数据集类,用于处理文本数据和标签。接着,我们创建了一个数据加载器,它将数据集分割为训练集和验证集。在训练循环中,我们使用优化器来更新模型参数,并使用学习率调度器来调整学习率。在评估循环中,我们计算模型的准确率。最后,我们将训练好的模型状态保存到文件中。

提高Transformer模型准确率的方法有很多,以下是一些常见的策略:

  1. 数据预处理
    • 确保数据预处理步骤正确无误,包括文本清洗、分词、词干提取、词形还原等。
    • 使用预训练的词向量(如BERT使用的预训练词向量),这可以提高模型对未见词汇的泛化能力。
  2. 模型设计
    • 调整模型结构,如增加或减少Transformer层的数量,改变自注意力机制的参数等。
    • 使用注意力机制、多头注意力等高级特性来捕捉文本中的复杂关系。
  3. 训练策略
    • 使用更长的训练时间或更多的训练数据来提高模型对数据的拟合能力。
    • 使用学习率调度器,如余弦退火(cosine annealing)或ReduceLROnPlateau,以避免过拟合并提高模型的收敛性。
    • 采用dropout、正则化等技术来防止过拟合。
  4. 优化器选择
    • 尝试不同的优化器,如AdamW、SGD等,以找到最适合您模型的优化器。
    • 调整学习率、动量、权重衰减等参数。
  5. 超参数调整
    • 调整批大小、学习率、权重衰减、正则化强度等超参数。
    • 使用网格搜索、随机搜索或贝叶斯优化等技术自动搜索最佳超参数。
  6. 使用增强数据
    • 通过数据增强(如回译、同义词替换、句子混合等)来增加训练数据的多样性。
    • 使用伪标签技术来扩充训练数据。
  7. 模型集成
    • 训练多个模型,并将它们的预测结果进行平均或投票,以提高准确率。
    • 使用集成学习技术,如Bagging或Boosting。
  8. 特征工程
    • 考虑使用其他特征(如词频、词性等)来增强模型的表现。
    • 探索文本数据的结构化表示,如词嵌入、向量空间模型等。
  9. 后处理
    • 考虑使用阈值调整、模型融合等技术来提高最终预测的准确率。
  10. 模型评估
    • 使用不同的评估指标来全面评估模型的性能,如精确率、召回率、F1分数等。
    • 分析错误案例,了解模型在哪些情况下表现不佳,并针对性地进行改进。
      通过上述方法,您可以逐步提高Transformer模型的准确率。需要注意的是,这些方法并不是孤立的,而是可以相互结合使用的。在实际应用中,您可能需要进行多次实验和调整,以找到最适合您任务的模型配置。

以下是一个简单的预测代码实例,展示了如何使用Hugging Face的Transformers库进行文本分类模型的预测:

from transformers import BertTokenizer, BertForSequenceClassification# 加载模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')# 假设您有一段新的文本摘要
new_text = "这是一个新的测试摘要。"# 使用tokenizer对文本进行编码
encoded_input = tokenizer.encode_plus(new_text,add_special_tokens=True,max_length=512,return_token_type_ids=False,pad_to_max_length=True,return_attention_mask=True,return_tensors='pt',truncation=True
)# 获取编码后的结果
input_ids = encoded_input['input_ids']
attention_mask = encoded_input['attention_mask']# 设置模型为评估模式
model.eval()# 预测
with torch.no_grad():outputs = model(input_ids=input_ids, attention_mask=attention_mask)# 获取预测结果
predicted_label = outputs.logits.argmax(dim=1).item()# 打印预测结果
print(f"Predicted Label: {predicted_label}")

对于 加载模型和分词器,如果你已经拥有了自己的模型训练文件,把模型训练文件放在文件夹,填写文件夹路径即可。
在这里插入图片描述
如下使用GPU 开始预测:

import torch
from transformers import BertTokenizer, BertForSequenceClassification
import warnings
warnings.filterwarnings('ignore')
import pandas as pd# 设置模型路径和类别数量
model_path='D:/yolov8Project/transformer_txtclass/'
class_num=219# 检查是否有可用的 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加载模型和分词器
tokenizer = BertTokenizer.from_pretrained(model_path)
model = BertForSequenceClassification.from_pretrained(model_path, num_labels=class_num).to(device)  # 将模型移到 GPUdef predict(new_text):try:# 使用tokenizer对文本进行编码encoded_input = tokenizer.encode_plus(new_text,add_special_tokens=True,max_length=512,return_token_type_ids=False,pad_to_max_length=True,return_attention_mask=True,return_tensors='pt',truncation=True)# 获取编码后的结果,并将它们移到 GPUinput_ids = encoded_input['input_ids'].to(device)attention_mask = encoded_input['attention_mask'].to(device)# 设置模型为评估模式model.eval()# 预测with torch.no_grad():outputs = model(input_ids=input_ids, attention_mask=attention_mask)# 获取预测结果predicted_label = outputs.logits.argmax(dim=1).item()# 打印预测结果print(f"Predicted Label: {predicted_label}")return predicted_labelexcept Exception as e:predicted_label='error'return predicted_labeldata2 = pd.read_csv('comb.csv', encoding='gbk')
# 在 DataFrame 上应用 predict 函数,并将结果存储在 'label' 列
data2['label'] = data2['Abstract'].apply(predict)
# print(data2)
data2.to_csv('comb-result.csv', index=False, encoding='gbk')
print('预测完毕,结束!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1522951.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SEO之网站结构优化(十四-内部链接及权重分配3)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 7、锚文字分布及变化 前面…

WebGIS与WebGL是什么,两者之间的关系?

WebGL和 WebGlS 都是 web 技术领域的重要内容,特别是这几年webgis开发领域,和webgl打交道是必然的,常见的WebGL开发的基础上,比如二维的Leaflet、三维的Cesium也都是热门。 WebGL是一种基于 HTML5 Canvas 元素的 JavaScriptAPI&a…

RLHF(带有人类反馈的强化学习)初探

我的目标是,在决策游戏上学习某人风格,可以让人对战“带有某人风格”的AI,比如你可以在这里对战“sky风格的AI”,这样的效果。 我最开始受到的启发来源于xbox的广告《爸爸的幽灵车》,已故人在游戏中留下的速度记录的固定轨迹。 …

IOS17.0安装巨魔:TrollRestore巨魔发布

👻 TrollRestore 17.0 巨魔发布 15.0 - 16.7 RC(20H18)和17.0。 官网:https://trollrestore.com/ 下载:https://pan.metanetdisk.com/IOS/%E5%B7%A8%E9%AD%94%E7%8E%A9%E5%AE%B6/TrollRestore.com 使用:ht…

【数字人】Facevid2vid:用于视频会议的一次性自由视图说话头合成

论文:https://arxiv.org/pdf/2011.15126 github:GitHub - zhanglonghao1992/One-Shot_Free-View_Neural_Talking_Head_Synthesis: Pytorch implementation of paper "One-Shot Free-View Neural Talking-Head Synthesis for Video Conferencing" 一种新颖…

缓存分布式一致性问题

缓存一致性问题发生的原因,是在更新数据时数据库和缓存数据的不一致。我们要做到保证缓存的最终一致性。如果数据需要强一致性建议直接查询数据库。 双写模式 双写模式为先写数据库,在写缓存。 进来两个请求,先执行“请求1”的操作写入数据…

装WebVideoCreator记录

背景,需要在docker容器内配置WebVideoCreator环境,配置npm、node.js https://github.com/Vinlic/WebVideoCreatorWebVideoCreator地址:https://github.com/Vinlic/WebVideoCreator 配置环境,使用这个教程: linux下安…

Spring Boot-自定义banner

在 Spring Boot 应用中,你可以自定义启动时显示的 banner。这些 banner 可以包括图形、文字或者其他形式的标识。如图所示: 1. 使用 banner.txt 文件 默认情况下,Spring Boot 使用项目的 banner.txt 文件中的内容作为启动时的 banner。你可以…

文献阅读:对区域间皮层投射神经元命运多样性的时间控制

文献介绍 文献题目: 对区域间皮层投射神经元命运多样性的时间控制 研究团队: Denis Jabaudon(瑞士日内瓦大学) 发表时间: 2021-11-09 发表期刊: Nature 影响因子: 49.9(2021年&am…

关于电力系统的几个疑问

非电力专业人员对于电力中的某些知识不能够形成系统的认识,接下有空也有补充下这方面知识,吹水时候才有水可以吹,嘻嘻!这里舍不得删掉下边chatgpt这几张图片,暂时先保留着。因为一直有个因为在电网里边用发电端和用电端…

EmguCV学习笔记 C# 9.3 移动检测类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

爬取图片保存为pdf

本文章想借着爬虫给大家介绍一下图片转pdf,有需要的友友们可以看看参考参考,有帮助到友友的可以收藏+关注。下面以爬取初中7年级数学上册为例给大家演示一下。网址是这个 https://mp.weixin.qq.com/s?__bizMzAxOTE4NjI1Mw&mid2650214000&idx…

智慧医院是什么?建设智慧医院的关键步骤

智慧医院是什么? 智慧医院是一种新型的医疗机构,它利用先进的信息技术、数据分析和智能化系统,优化医院的管理和服务流程,提高医疗质量和效率。在智慧医院中,所有的运营和管理环节都可以通过数据驱动的方式来实现优化…

Trollspeed网速悬浮窗,精简且强大

我很喜欢iOS的界面UI,它的设计哲学是以人为本,简约而不简单。不过有时候,我也会觉得iOS简约过头了。人类是很没安全感的动物,获取的信息量足够多,我们才会感觉到安全。 在iOS16中,苹果加入了电量百分比显示…

一种快速edit的方法

后端的CURD,通过chatgpt很容易。 前端的CURD,编辑操作稍微有点复杂。 我一开始的想法是编辑的时候使用一个模态框,但是发现不舒服,为了快速实现,我决定点击编辑的时候,直接打开新的页面,这样开…

[数据集][目标检测]街头摊贩识别检测数据集VOC+YOLO格式758张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):758 标注数量(xml文件个数):758 标注数量(txt文件个数):758 标注类别…

航电系统,无人机的核心!!!

一、核心组成部分 飞控系统 定义:无人机飞行控制系统,负责接收来自传感器的数据,并根据飞行任务指令,通过算法计算出无人机的姿态和位置信息,进而控制无人机的飞行状态。 组成:通常由主控制器、姿态传感…

深度学习助力病理切片虚拟组织染色|文献精析·24-09-03

小罗碎碎念 这篇文章综述了深度学习技术在生物样本虚拟组织染色领域的最新研究进展,探讨了其在提高病理诊断效率和降低成本方面的潜力。 作者角色作者姓名单位名称(英文)单位名称(中文)第一作者Bijie BaiElectrical an…

Flutter App名称跟随手机语言改变而改变

Android 1.修改android/app/src/main/AndroidManifest.xml中的android:lable的值为string/app_name 2.在android/app/src/main/res/values/styles.xml文件中添加App的名称,如果没有这个文件请自行添加。 这里说明一下,如果没有手机语言对应的App名称&a…

Linux之nginx部署项目【前后端分离】(外加redis安装)

nginx安装和访问 1.使用apt安装Nginx apt install -y nginx 用whereis nginx找到和nginx相关目录 nginx目录结构 /usr/sbin/nginx 服务文件 /etc/nginx 配置目录 /usr/share/nginx/html 发部项目 服务名: nginx.service ps -ef | grep nginx apt install -y net-tools …