基于HF transformers的AI建模和训练实战

news2024/11/20 15:37:18

我们经常使用 scikit-learn 对监督学习和无监督学习任务的数据进行建模。 我们熟悉面向对象的设计,例如启动类并从类中调用子函数。 然而,当我个人使用 PyTorch 时,我发现与 scikit-learn 类似但又不一样的设计模式。
在这里插入图片描述

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

1、PyTorch和transformers

要使用 PyTorch 训练模型,你必须为数据集和模型创建一个类,并添加每个类的继承。 例如,你需要创建一个名为 TextDataset(Dataset) 的类,并且该 Dataset 是 torch.utils.Dataset 中的一个类。 要创建模型,也必须创建一个类例如 Classifier(nn.Module) ,与scikit-learn 相比,PyTorch 允许你构建自己的类并在类中执行一些操作。

我们来谈谈Hugging Face开发的 transformers。 当我看到一位在LinkedIn上和我有联系的研究科学家发布的有关添加的新功能的帖子时,我注意到了这个库。 但是,当时我并没有考虑立即尝试。 然后,就到了我对 BERT 架构感到好奇并想要实现它的时候。

如果你是 PyTorch 的新手。 尝试使用它构建一些模型,例如构建用于文本分类或图像分类的模型以开始。 PyTorch 有一个很棒的文档。 在你熟悉使用 PyTorch 来训练和评估模型后。 可以轻松使用 transformers。

我开始仅从 Transformers 的文档中探索它们。 我关注 Hugging Face 推特帐户,该帐户经常发布有关库和开发的最新更新的推文。 这让我更容易了解他们的更新。 查看 Transformers 文档中的使用页面。 它解释了如何在自然语言处理中使用各种应用程序,从序列分类到神经机器翻译。

在深度学习社区中,我们经常强调预训练模型。 一个经过预先训练的模型,可以将其用于另一个类似的任务,也称为迁移学习。 Hugging Face 托管来自各个开发人员的预训练模型。 他们创建了一个共享预训练模型的平台,你也可以将其用于自己的任务。

之后,我想知道,如果我想使用 BERT 架构训练自己的模型而不使用预训练模型(这意味着从头开始训练模型)怎么办? 因为大多数人从博客文章或研究论文中以 BERT-base-uncased 为例讨论预训练模型。 然后我想起来,PyTorch 与 Keras 相比有很大不同,Keras 具有 fit 和 Predict 函数。
在这里插入图片描述

2、使用transformers训练文本分类BERT模型

我开始使用 PyTorch 从 Kaggle 竞赛数据集训练文本分类, Real or Not? NLP with Disaster Tweets 是一个不错的开始选择。 我使用了 XGBoost 和 CatBoost,并在数据清理和特征提取方面做了一些神奇的事情,但分数上不去。 然后,我认为 BERT 会将分数添加到排行榜中。 事实证明,使用 bert-base-uncased 后,平均 F 分数提高到了 83%,并进入排行榜前 12%!

为了从头开始训练模型,我创建了一个函数来生成管线:

def generate_model(args, num_labels):
    
    config = AutoConfig.from_pretrained(
        args.model_name_or_path,
        num_labels=num_labels,
        finetuning_task=args.task_name,
        )
    tokenizer = AutoTokenizer.from_pretrained(
        args.model_name_or_path,
        do_lower_case=args.do_lower_case
    )
    model = AutoModelForSequenceClassification.from_config(
        config
    )
    
    return config, tokenizer, model

如你所知, Transformers 需要三个组件来推断或训练你的模型。 AutoConfig 用于设置模型和分词器配置。 可以将 AutoConfig 更改为 BertConfig 或 Transformers 中可用的任何其他架构。 AutoTokenizer 的应用与配置相同。 但这里的分词器使用预先训练的,这意味着我使用来自 bert-base-uncased 的分词器。 它已经加载了自己的词汇表,你可以查看 vocab.txt 中的每个token, 所以我没有建立自己的词汇表。 最后一个组件 AutoModelForSequenceClassification 是从配置加载的,因为我想从头开始训练。 AutoModel 可以更改为 BertForSequenceClassification 。

第二步,我创建 DisasterDataset 类来加载数据集:

class DisasterDataset():
    def __init__(self, data_path, eval_path, tokenizer):
        d_data = pd.read_table(data_path, sep=',')
        d_eval = pd.read_table(eval_path, sep=',')
        
        row, col = d_data.shape
        d_train = d_data[:int(row * 0.8)]
        d_test = d_data[int(row*0.8):]

        d_train.reset_index(drop=True, inplace=True)
        d_test.reset_index(drop=True, inplace=True)
        
        self.tokenizer = tokenizer
        self.dataset = {'train': (d_train, len(d_train)),
                       'test': (d_test, len(d_test)),
                       'eval': (d_eval, len(d_eval))}
        self.num_labels = len(d_train.target.unique().tolist())
        self.set_split('train')
    
    def get_vocab(self):
        text = " ".join(self.data.text.tolist())
        text = text.lower()
        vocab = text.split(" ")
        with open('vocab.txt', 'w') as file:
            for word in vocab:
                file.write(word)
                file.write('\n')
        file.close()
        return 'vocab.txt'
        
    
    def set_split(self, split = 'train'):
        self.split = split
        self.data, self.length = self.dataset[split]
    
    def __getitem__(self, idx):
        x = self.data.loc[idx, "text"].lower()
        x = self.tokenizer.encode(x, return_tensors="pt")[0]
    
        if self.split != 'eval':
            y = self.data.loc[idx, "target"]
            return {'id': idx, 'x': x, 'y': y}
        else:
            id_ = self.data.loc[idx, "id"]
            return {'id': id_, 'x': x}
    
    def __len__(self):
        return self.length

上面的脚本用于构建类数据集。 我没有使用任何预处理,任何清洁。 只需使用纯文本并使用 Tokenizers 库中的 BertWordPiece 进行标记化:

for epoch in range(1, 101):
    running_loss = 0
    running_accuracy = 0
    running_loss_val = 0
    running_accuracy_val = 0
    
    start_time = time.time()
    # dataset class is assigned to dd variable
    dd.set_split('train')
    dataset = DataLoader(dd, batch_size=64, shuffle=True, collate_fn=padded)
    model.train()
    for batch_index, batch_dict in enumerate(dataset, 1):
        optimizer.zero_grad()

        x = batch_dict['x'].permute(1, 0)
        x = x.to(device)
        y = batch_dict['y'].to(device)

        output = model(x)[0]
        output = torch.softmax(output.squeeze(), dim=1)
        loss = criterion(output, y.type(torch.LongTensor).to(device))

        running_loss += (loss.item() - running_loss) / batch_index

        accuracy = compute_accuracy(y, output)
        running_accuracy += (accuracy - running_accuracy) / batch_index

        loss.backward()

        optimizer.step()
        
    dd.set_split('test')
    dataset = DataLoader(dd, batch_size=64, shuffle=True, collate_fn=padded)
    model.eval()        
    for batch_index, batch_dict in enumerate(dataset, 1):

        x = batch_dict['x'].permute(1, 0)
        x = x.to(device)
        y = batch_dict['y'].to(device)

        output = model(x)[0]
        output = torch.softmax(output.squeeze(), dim=1)
        loss = criterion(output, y.type(torch.LongTensor).to(device))

        running_loss_val += (loss.item() - running_loss_val) / batch_index

        accuracy = compute_accuracy(y, output)
        running_accuracy_val += (accuracy - running_accuracy_val) / batch_index

最后,上面的脚本是训练模型的。 我使用 Adam 优化器,学习率为 0.0001,并使用 PyTorch 的调度程序 StepLR(), step_size 为 20, gamma 为 0.01。 对于标准,我使用 CrossEntropyLoss() 。 即使任务是二进制的,假设使用二进制交叉熵。 但模型返回类别的概率,使用softmax 作为激活函数。

我使用 GPU Nvidia K-80 在计算引擎上运行脚本,得到结果的速度相当快,因为我设置 running_accuracy > 90 并且 running_accuracy_val > 90 将被停止。 该脚本不会运行 100 个周期才能完成。

3、结束语

最后,BERT 架构比 Transformers 库更加有用且易于使用。 在雅加达人工智能研究中心,一个位于雅加达的人工智能研究社区,主要使用 PyTorch 和 Transformers 来开发和运行项目实验。 我们还尝试构建自己的编码器来超越现有的编码器,例如 GPT 和 BERT 架构。


原文链接:HF transformers建模 — BimAnt

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

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

相关文章

11个最受欢迎的3D打印AI软件【2023】

如今,人工智能(AI)似乎已经成为每个人都在谈论的话题。 尽管围绕该技术的伦理问题存在着重要的讨论,但不可否认的是,人工智能可能成为包括 3D 打印在内的许多不同行业的重要工具。 事实上,人工智能在 3D 打…

【Java王大师王天师】关注有礼博客模板

【点我-这里送书】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的…

单片机启动流程

存储器 ​ 一个单片机中存在rom和ram,Soc也有rom和ram(ddrx),部分Soc还包含MMU(Memory Manage Unit 内存管理单元)— (用于系统内存管理,比如说虚拟内存空间,内存区间的…

YOLOV5改进:RefConv | 即插即用重参数化重聚焦卷积替代常规卷积,无额外推理成本下涨点明显

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点 3.涨点效果:RefConv,实现有效涨点! 论文地址 …

响应式婴幼儿早教启蒙网站模板源码

模板信息: 模板编号:6830 模板编码:UTF8 模板颜色:红色 模板分类:学校、教育、培训、科研 适合行业:培训机构类企业 模板介绍: 本模板自带eyoucms内核,无需再下载eyou系统&#xf…

AI批量剪辑矩阵托管系统----源码技术开发

AI批量剪辑矩阵托管系统----源码技术开发 抖音账号矩阵系统是基于抖音开放平台研发的用于管理和运营多个抖音账号的平台。它可以帮助用户管理账号、发布内容、营销推广、分析数据等多项任务,从而提高账号的曝光度和影响力。 具体来说,抖音账号矩阵系统可…

如何通过命令查看某一文件的内容改动和提交记录

1. 查看最近10条的提交记录 一行显示 git log --oneline -102.查看某一个文件的提交记录 git log --oneline -10 文件路径3.查看某个文件的修改内容 查看某次提交的修改 内容 git show bcd9299 查看某次提交某个文件的修改内容git show bcd9299 文件路径4.对比两次提交内容的…

2011年09月21日 Go生态洞察:Go图像处理包

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

3.0 熟悉IDAPro静态反汇编器

IDA Pro 是一种功能强大且灵活的反汇编工具,可以在许多领域中发挥作用,例如漏洞研究、逆向工程、安全审计和软件开发等,被许多安全专家和软件开发者用于逆向工程和分析二进制代码。它支持大量的二进制文件格式和CPU架构,并提供了强…

C++入门篇3(类和对象【重点】)

文章目录 C入门篇3(类和对象【重点】)1、面向过程和面向对象2、类的引入3、类的定义4、类的访问限定符及封装4.1、访问限定符4.2、封装 5、类的作用域6、类的实例化(对象)7、类对象模型7.1、类对象的存储方式7.2、结构体&#xff…

评国青、优青、杰青,到底需要什么级别的文章?五篇代表作如何选?

一到年底就听同事们讨论到底申报“杰青”、“优青”还是“国青”,那么,“杰青”到底是什么呢?它和“优青”、“国青”又有什么区别呢? 杰青,全称“国家杰出青年基金获得者”,是国家自然科学基金里人才资助…

便利与健康共赢:社区便民奶柜行业的广阔前景

随着生活节奏的加快,人们对便利性的需求不断增加,社区便民奶柜将迎来广阔的市场前景。首先,现代人的生活节奏快速增长,对便利性的需求也日益迫切,这为社区便民奶柜提供了广阔的市场空间。其次,随着健康意识…

PyGWalker :数据分析中最优秀工具库!

假设你在 Jupyter Notebook 中有一堆数据需要分析和可视化。PyGWalker 就像一个神奇的工具,使这一切变得非常容易。它接受你的数据并将其转换成一种特殊的表格,你可以像使用 Tableau 一样与之交互。 你可以通过视觉方式探索数据,进行互动&am…

Linux离线安装cuda以及配置其环境

cuda安装 cuda版本适配 查看自己电脑所支持的cuda版本号 【若安装超算平台上的cuda toolkit这一步骤可以跳过】 CUDA toolkit Download官网下载cuda toolkit 下载好的.run可执行文件上传到平台进行离线安装 $ cd /上传的目录 $ chmod x cuda_12.2.2_535.104.05_linux.run /…

如何更好的使用Copilot

Copilot从诞生到现在过去了挺长时间了,大家对Copilot的评价算是褒贬不一吧。有些人觉得Copilot高效且神奇,可以对自己的工作大大提效;有些觉得也就那样,为什么要花那么多钱做这个事情,钱它不香吗? 从最开始…

ECharts修改tooltip样式

tooltip不支持rich&#xff0c;formatter返回的是html片段&#xff0c;可以在这个返回的片段里面增加类名。以达到更改tooltip文字格式的效果。所以&#xff0c;直接写html的样式就可以 静态数据 formatter: (params) > {console.log(params, params)return <h2 style&q…

Azure 机器学习 - 使用 Jupyter Notebook 探索 Azure 机器学习

目录 一、前言二、创建跳转盒 (VM)为 VM 启用 Azure Bastion 三、创建工作区四、连接到 VM 桌面五、连接到机器学习工作室允许工作室访问存储 六、停止计算实例七、清理资源 本文介绍如何创建并连接到安全的 Azure 机器学习工作区。 本文中的步骤使用 Azure 机器学习托管虚拟网…

线性代数-Python-05:矩阵的逆+LU分解

文章目录 1 矩阵的逆1.1 求解矩阵的逆 2 初等矩阵2.1 初等矩阵和可逆性 3 矩阵的LU分解3.1 LU分解的实现 1 矩阵的逆 1.1 求解矩阵的逆 def inv(A):if A.row_num() ! A.col_num():return Nonen A.row_num()"""矩阵A单位矩阵"""ls LinearSyste…

无梯度强化学习:使用遗传算法进化代理

一、说明 我想提高我的强化学习技能。由于对这个领域一无所知&#xff0c;我参加了一门课程&#xff0c;接触到了 Q 学习及其“深度”等效项&#xff08;深度 Q 学习&#xff09;。在那里我接触到了 OpenAI 的Gym&#xff0c;他们有多种环境可供代理玩耍和学习。 课程仅限于 De…

OpenCV-Python小应用(八):判断是否有深色线条

OpenCV-Python小应用&#xff08;八&#xff09;&#xff1a;判断是否有深色线条 前言前提条件相关介绍实验环境判断是否有深色线条思路一&#xff1a;通过图像梯度直方图判断思路二&#xff1a;通过图像灰度值变化判断 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&am…