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

news2024/9/20 14:25:09

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_output
        logits = self.classifier(pooled_output)
        return logits

# 定义数据集
class TextDataset(Dataset):
    def __init__(self, texts, labels, tokenizer, max_len):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __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)  # 将模型移到 GPU

def 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
        )
        # 获取编码后的结果,并将它们移到 GPU
        input_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_label
    except Exception as e:
        predicted_label='error'
        return predicted_label


data2 = 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.coloradmin.cn/o/2103464.html

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

相关文章

【陪诊系统-PC管理端】动态路由

先说说这里为什么要使用动态路由? 因为前面的菜单管理功能模块中,可以创建或修改不同权限,当前登录账号可以绑定不同的权限,不同权限能访问的功能页面不同,所以使用动态路由来控制。 而登录成功后,服务器…

Sentence-BERT实现文本匹配【对比损失函数】

引言 还是基于Sentence-BERT架构,或者说Bi-Encoder架构,但是本文使用的是参考2中提出的对比损失函数。 架构 如上图,计算两个句嵌入 u \pmb u u和 v \pmb v v​之间的距离(1-余弦相似度),然后使用参考2中提出的对比损失函数作为…

docker 安装 rabbitmq

参考文档: https://hub.docker.com/_/rabbitmq/ https://www.rabbitmq.com/docs/download https://www.kuangstudy.com/zl/rabbitmq#1366643532940484610 执行下面的命令 docker run -d -it --name myrabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PA…

“解决 Docker 启动失败:排查和修复 overlay2 存储驱动与网络模块问题”。

目录 1.报错如下 2.报错详解 1. ” 表明 overlay2 存储驱动挂载失败,找不到相应设备。 2.表明在路径中找不到 fuse-overlayfs 可执行文件。 3.表明加载 bridge 和 br_netfilter 模块失败。 4.及后续一系列关于停止服务的信息,是由于前面的错误导致的…

硬件生产厂家运维系统思路

当前硬件生产厂家运维已经逐渐摆脱原有的现场调试,初步诊断和运维已经进化为远程运维;主要方式为厂家建立运维系统,使用人员只需要关注厂家公众号或者登录官网,即可完成原来必须到现场才能解决的问题; 原弊端&#xff…

探讨 | 大模型在传统NLP任务的使用姿势

写在前面 今天给大家带来一篇震宇兄(知乎邱震宇)探讨大模型技术在提升传统NLP类任务效果上的应用方式的文章,主要从文本分类任务出发。 知乎:https://zhuanlan.zhihu.com/p/704983302PS:长文警告!建议收藏…

Burp Suite Professional 2024.8 发布下载,新增功能概览

Burp Suite Professional 2024.8 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接:https://sysin.org/blog/burp-suite-pro/,查看最新版。原创作品&#xff0…

退火吗?C#/WinForm演示退火算法

退火模型:模拟退火算法(Simulated Annealing, SA)是一种概率型全局优化算法,灵感来源于物理学中的退火过程。它通过模拟金属退火过程中的加热和缓慢冷却,来寻找问题的近似全局最优解。算法开始时,初始温度设…

70万个哺乳动物功能基因集!这个数据库值得重视

生信碱移 Rummagene数据库 Rummagene 从 PubMed Central (PMC) 出版物提取了超70万个基因集,用于各类基因功能关联注释。 组学技术的引入逐渐将生物和生物医学研究从研究单个基因和蛋白质转向研究基因集、基因簇、分子复合物和基因表达模块。许多生物医学和生物研究…

log4j 清除MDC上下文 MDC分类日志

在项目里需要分类收集处理日志信息,使用 log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况,具体来说,就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的…

【nnUNet】环境安装

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享医疗分割模型nnUNet的环境安装教程,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享&#xff0…

数据中台 | 数据智能平台产品系列文章,企业开发和盘活数据资产的利器!(上篇)

引言 发展数字经济,实现数字中国是我国的国家战略,坚定且不可动摇,近期随着《数据二十条》、《“数据要素”三年行动计划》、《关于加强数据资产管理的指导意见》等重磅政策的发布,使数字化转型成为越来越多企业增强竞争、扩大营收…

LabVIEW程序员错误排查思路

当LabVIEW程序员在开发过程中遇到难以解决的错误且网上搜不到答案时,需要采取系统性的方法进行排查和解决。这包括回顾代码逻辑、深入理解LabVIEW的底层机制、参考专业文献和求助社区等方式。下面将从多角度详细解读专业程序员在面对这种困境时的应对策略&#xff0…

【系统分析师】-面向对象方法

目录 1、基本概念 2、UML 2.1、基本结构 2.1.1.构造块 2.1.1.1、事物 2.1.1.2、关系 2.1.1.3、图形 2.1.2.规则 2.1.3.公共机制 2.2、41视图 3、面向对象分析OOA 3.1、用例模型 3.2、分析模型 4、面向对象设计OOD 4.1、细分 4.2、设计原则 5、面向对象的程序设…

一字线模组厂家的选择与使用技巧

在当今自动化与智能制造的浪潮中,一字线模组作为精密定位与传输的核心部件,其性能与质量直接关系到整个生产线的效率与稳定性。因此,选择合适的一字线模组厂家并掌握其使用技巧,对于提升企业竞争力至关重要。接下来我们跟着鑫优威…

四、配置三层交换实验组网

一、实验拓扑 二、实验目的 通过配置交换机&#xff0c;令不同vlan间的主机能够互相通信 三、实验步骤 SW12 <Huawei>undo terminal monitor Info: Current terminal monitor is off. <Huawei>system-view Enter system view, return user view with CtrlZ. [H…

Spring 学习笔记

概述 Spring 是一个企业级 J2EE 应用开发一站式解决方案&#xff0c;其提供的功能贯穿了项目开发的表现层、业务层和持久化层&#xff0c;同时&#xff0c;Spring 可以和其他应用框架无缝整合 Spring 的特性包括以下几个方面&#xff1a; 轻量&#xff1a;Spring 是一个轻量…

CISAW软件安全开发模型的核心思想

在软件安全开发的领域中&#xff0c;采用的模型与信息安全保障体系紧密相连&#xff0c;它们共同构成了一个坚实的防御机制。 这种模型不仅注重程序、数据和文档三个实体对象的全生命周期管理&#xff0c;还强调实现这些对象的可用性、完整性、真实性、机密性和不可否认性等关…

Cesium 展示——绘制等值线图

文章目录 需求分析资料需求 分析 首先需要开启地形数据 开启方式见:地形开启否则会遇到以下问题直接上实例代码export function getPoints

mysql 8.0 的 建表 和八种 建表引擎实例

文章目录 MySQL 8.0 中&#xff0c;主要有以下八种常见的建表引擎一、InnoDB 引擎建表注意点建表知识点 二、MyISAM 引擎建表使用场景 三、Memory 引擎使用场景 四、Archive 引擎五、BLACKHOLE 引擎一、特点二、适用场景三、注意事项 六、MRG_MyISAM 引擎MRG_MyISAM 和 MyISAM …