基于transformer和相关预训练模型的任务调优

transformers自定义模型的保存和加载 保存静态字典,取出静态字典,加载静态字典,没了。 阅读详情

使用的环境依赖:

python3.9
'''
对应的依赖:
tensorflow==2.11.0
transformers==4.26.0
pandas==1.3.5
scikit-learn==1.0.2
'''

模型的训练代码如下:

from transformers import BertTokenizer,TFBertForSequenceClassification
import tensorflow as tf
from sklearn.model_selection import train_test_split
import pandas as pd
max_length = 40
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')


'''
对应的依赖:
tensorflow==2.11.0
transformers==4.26.0
pandas==1.3.5
scikit-learn==1.0.2
'''

def split_dataset(df):
    train_set, x = train_test_split(df,
        stratify=df['label'],
        test_size=0.1,
        random_state=42)
    val_set, test_set = train_test_split(x,
        stratify=x['label'],
        test_size=0.5,
        random_state=43)

    return train_set,val_set, test_set


df_raw = pd.read_csv("data/originalthuctcdata/THUCTC_subdata.txt",sep="\t",header=None,names=["text","label"])
# label
df_label = pd.DataFrame({"label":["财经","房产","股票","教育","科技","社会","时政","体育","游戏","娱乐"],"y":list(range(10))})
df_raw = pd.merge(df_raw,df_label,on="label",how="left")

train_data,val_data, test_data = split_dataset(df_raw)


def convert_example_to_feature(review):
    return tokenizer.encode_plus(review,
                                 add_special_tokens=True,  # add [CLS], [SEP]
                                 padding='max_length',
                                 max_length=max_length,  # max length of the text that can go to BERT
                                 # pad_to_max_length=True,
                                 return_attention_mask=True,  # add attention mask to not focus on pad tokens
                                 )


# map to the expected input to TFBertForSequenceClassification, see here
def map_example_to_dict(input_ids, attention_masks, token_type_ids, label):
    return {
        "input_ids": input_ids,
        "token_type_ids": token_type_ids,
        "attention_mask": attention_masks,
    }, label


def encode_examples(ds, limit=-1):
    # prepare list, so that we can build up final TensorFlow dataset from slices.
    input_ids_list = []
    token_type_ids_list = []
    attention_mask_list = []
    label_list = []
    if (limit > 0):
        ds = ds.take(limit)

    for index, row in ds.iterrows():
        review = row["text"]
        label = row["y"]
        bert_input = convert_example_to_feature(review)

        input_ids_list.append(bert_input['input_ids'])
        token_type_ids_list.append(bert_input['token_type_ids'])
        attention_mask_list.append(bert_input['attention_mask'])
        label_list.append([label])
    return tf.data.Dataset.from_tensor_slices(
        (input_ids_list, attention_mask_list, token_type_ids_list, label_list)).map(map_example_to_dict)

# train dataset
batch_size=100
ds_train_encoded = encode_examples(train_data).shuffle(10000).batch(batch_size)

# val dataset
ds_val_encoded = encode_examples(val_data).batch(batch_size)
# test dataset
ds_test_encoded = encode_examples(test_data).batch(batch_size)


# recommended learning rate for Adam 5e-5, 3e-5, 2e-5
learning_rate = 2e-5
# we will do just 1 epoch for illustration, though multiple epochs might be better as long as we will not overfit the model
number_of_epochs = 1

# model initialization
model = TFBertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=10)

# optimizer Adam recommended
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate,epsilon=1e-08, clipnorm=1)

# we do not have one-hot vectors, we can use sparce categorical cross entropy and accuracy
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
model.compile(optimizer=optimizer, loss=loss, metrics=[metric])

# fit model
bert_history = model.fit(ds_train_encoded, epochs=number_of_epochs, validation_data=ds_val_encoded)
# evaluate test set
model.evaluate(ds_test_encoded)
tf.keras.models.save_model(model,filepath="my_model")

其中,模型训练可以根据个人的设备适当调整batch大小。基于transformer的bert相关模型的输入是

{"input_ids":[[]],"token_type_ids":[[]],"attention_mask":[[]]}

  1. input_ids:表示的是输入文本进行分词处理并按照指定的长度要求进行padding或truncate后的结果

input_ids = tokenizer.convert_tokens_to_ids(tokenized)
  
# precalculation of pad length, so that we can reuse it later on
padding_length = max_length_test - len(input_ids)

# map tokens to WordPiece dictionary and add pad token for those text shorter than our max length
input_ids = input_ids + ([0] * padding_length)
  1. token_type_ids:表示的是当前词是第几个句子,一般在有多个句子作为模型输入时用来区分句子的

  1. attention_mask:表示的是为了区分input_ids的padding和非padding数据

# attention should focus just on sequence with non padded tokens
attention_mask = [1] * len(input_ids)

# do not focus attention on padded tokens
attention_mask = attention_mask + ([0] * padding_length)

基于训练好的模型的预测:

from transformers import BertTokenizer, TFBertForSequenceClassification
import tensorflow as tf
max_length = 40
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

my_model = tf.keras.models.load_model(filepath="my_model")
input_message = "82岁老太为学生做饭扫地44年获授港大荣誉院士"

bert_input = tokenizer.encode_plus(input_message,
                                   add_special_tokens=True,  # add [CLS], [SEP]
                                   padding='max_length',
                                   max_length=max_length,  # max length of the text that can go to BERT
                                   # pad_to_max_length=True,
                                   return_attention_mask=True,  # add attention mask to not focus on pad tokens
                                   )
predict_result = my_model({
    "input_ids":[bert_input['input_ids']],
    "token_type_ids":[bert_input['token_type_ids']],
    "attention_mask":[bert_input['attention_mask']],
          })

print(predict_result)

相关模型也可以部署到tf-serving中

其中模型返回的结果是一个logits结果,也就是没有经过softmax处理,所以如果要按照probability返回结果的话,可以手动增加一个soft计算tf.math.softmax(predict_result["logits"],axis=1)

相关完整代码:bert_related_task: 使用基于bert的预训练模型,对各个方向的任务进行二次训练,获取特定任务的模型 (gitee.com)

关于基于bert的模型二次封装和结构调整,下一次给大家介绍

❀资源帖❀ResNet,ConvNeXt,Transformer预训练模型等 resnet权重文件下载! 阅读详情

相关推荐

预训练模型简介和使用方法

ELMo的出现开创了一种上下文相关的文本表示方法,很好地处理了一词多义问题,并在多个典型任务上有了显著的效果提升。 其后,GPT和BERT等预训练语言模型相继被提出,自此便进入了动态预训练技术的时代。尤其是BERT的出现,横扫了自然语言处理领域的多个典型任务,极大地推动了自然语言处理领域的发展,成为预训练史上一个重要的里程碑模型。此后,基于BERT的改进模型、XLNet等大量新式预训练语言模型涌出,预训练技术在自然语言处理领域蓬勃发展。 在预训练模型的基础上,针对下游任务进行微...

升级打怪之路 8259

Transformers 如何保存并加载模型

由于自己经常忘记如何保存Transformers中的模型,故在此纪录一下官方提供的例子。 output_model_file = "./models/my_own_model_file.bin" output_config_file = "./models/my_own_config_file.bin" output_vocab_file = "./models/my_own_vocab_file.bin" # 步骤1:保存一个经过微调的模型、配置和词汇表 #如果我们有一个分布式模型,只保存封装的模型

Diobld的博客 4993

在机器问答任务上微调transformer模型

在机器问答任务上微调transformer模型

lw19155275856的博客 1013

Hugging Face 的 Transformers 库使用trainer.save_model()和model.save_pretrained()这两种模型保存方法有什么区别?

trainer.save_model() 和 model.save_pretrained()——都可以用来保存模型并且使用方法和代码是一样的。

每天八杯水的博客 4954

MATLAB/Simulink实战:三电平逆变器SVPWM调制从入门到精通(附完整仿真模型)

本文提供了一份详尽的MATLAB/Simulink实战指南,手把手教你从零搭建三电平逆变器的SVPWM调制系统。文章深入剖析了27个空间矢量的分区与分解算法,并完整实现了包含中点电位平衡控制的Simulink仿真模型,旨在帮助电力电子与电机控制领域的学习者和工程师跨越从理论到实践的鸿沟。

sugar的博客 1212

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

Transformer模型代码(详细注释,适合新手)

本文提供了transformer代码附带详细注释,要注意本文的transformer并非传统的encoder-decoder结构的,而是主流的gpt结构(decoder-only),不了解decoder-only的同学,可以参考我的另一篇文章,链接放在最后。我过几天会出一个介绍gpt模型结构的的文章,欢迎大家前来讨论。

SWZ156的博客 5075

语音数据标注工具与平台

最近在做语音深度学习的项目,整理了一下语音数据标注工具和语音标注平台,供大家参考 语音标注工具–Praat Praat是目前已经成为比较流行也比较专业的语音处理的软件,可以进行语音数据标注、语音录制、语音合成、语音分析等等,具有免费、占用空间小、通用性强、可移植性好等特点 官网链接 http://www.fon.hum.uva.nl/praat/ 汉化版下载 http://www.hejingzo...

qq_21379593的博客 1万+

论文笔记:CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models

最近,BERT和GPT等自然语言(NL)的预训练模型已被证明可以很好地转移到编程语言(PL),并在很大程度上使一系列与代码相关的任务受益。尽管取得了成功,但大多数当前的方法要么依赖于仅编码器(或仅解码器)的预训练,这种预训练对于生成(或理解)任务来说不是最优的,或者其(编码器-解码器)以与NL相同的方式处理代码片段,忽略了PL的特殊特征,如token类型。我们提出了CodeT5,这是一个统一的预训练编码器-解码器Transformer模型,可以更好地利用开发人员分配的标识符所传达的代码语义。我们的模型采用统

2301_80351584的博客 2221

关于Arduino中的常用函数

一、I/O函数 二、时间函数 三、数学函数 abs 返回其参数的无符号值 【abs(12)返回12,abs(-12)也返回12】 constrain 限制一个数字以阻止它超出范围。第一个参数是被限制的数字,第二个参数是范围区间的开始,第三个参数是允许的数字范围区间的结尾。 【constrain(8,1,10)返回8,constrain(11,1,10)返回10,constrain(0,1,10)返回1】 map 将一个范围内的数字映射到另一个范围。第一个参数是要映射到数字,第二个和第三个参数是from范围(

TREE的博客 7322

SolidWorks与Python二次开发实战:从宏录制到自动化脚本

本文详细介绍了利用Python对SolidWorks进行二次开发的实战方法。通过宏录制获取操作指令,再将其转换为Python脚本,工程师可以高效实现建模、出图等重复任务的自动化,显著提升设计效率。文章涵盖了环境搭建、代码转换、调试技巧及完整实战案例,为工程师提供了从入门到精通的完整路径。

weixin_29082143的博客 945

探索Transformer模型调优:策略、实践与前沿进展

Transformer模型主要由编码器(Encoder)和解码器(Decoder)两大部分构成,二者均基于多头自注意力(Multi-Head Attention)机制、前馈神经网络(Feed-Forward Neural Network)、层归一化(Layer Normalization)、残差连接(Residual Connection)以及位置编码(Positional Encoding)等核心组件搭建而成。编码器负责对输入序列进行特征提取与编码,将输入序列转换为包含丰富语义信息的上下文表示。

秋声工作室 2327

2023电视专用!安卓电子相册APP避坑指南(附开源代码)

本文针对2023年智能电视用户,提供安卓电子相册APP的避坑指南与实战教程。文章详细解析了电视端相册应用的常见广告与兼容性陷阱,并指导用户如何安全获取、部署纯净的APK应用,通过核心设置实现无广告的个性化图片轮播体验,最终打造专属的家庭回忆墙。

weixin_29012677的博客 494

预训练模型

1 预训练模型由来 预训练模型是深度学习架构,已经过训练以执行大量数据上的特定任务(例如,识别图片中的分类问题)。这种训练不容易执行,并且通常需要大量资源,超出许多可用于深度学习模型的人可用的资源,我就没有大批次GPU。在谈论预训练模型时,通常指的是在Imagenet上训练的CNN(用于视觉相关任务的架构)。ImageNet数据集包含超过1400万个图像,其中120万个图像分为1000个类别(大...

lucca的专栏 3万+

Twincat Scopeview录波中的Ringbuffer设置技巧与常见问题解决

本文深入解析了倍福Twincat Scopeview录波功能中Ringbuffer(环形缓冲区)的核心设置技巧与常见问题解决方案。针对数据丢失、触发时机不准等痛点,详细阐述了缓冲区大小、预触发样本、采样率等关键参数的优化配置,并提供了多通道同步、自动诊断等实战应用指南,帮助工程师高效捕捉和分析PLC数据。

rainy的博客 845

小程序数据采集(3):PC端微信小程序降维调试与流量数据获取详解

本文提出了一种针对PC端微信小程序的逆向分析方法,通过利用PC端基于Chromium架构的天然优势,实现无需Root的降维打击。文章详细介绍了如何开启CEF远程调试协议、基于DevTools Protocol实现流量劫持、对抗PC端安全防线以及获取小程序本地存储数据的技术方案。相比移动端严苛的环境,PC端小程序在调试接口、网络拦截和数据存储等方面存在显著漏洞,为爬虫开发提供了更便捷的突破口。

数据知道的博客 825

最新综述!NLP中的Transformer预训练模型

在如今的 NLP 领域,几乎每项任务中都能看见「基于 Transformer 的预训练语言模型(T-PTLM)」成功的身影。这些模型的起点是 GPT 和 BERT。而这些模型的技术基础包括...

Kaiyuan_sjtu的博客 6088

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

深度学习进阶篇-预训练模型[1]:预训练分词Subword、ELMo、Transformer模型原理;结构;技巧以及应用详解

机器无法理解文本。当我们将句子序列送入模型时,模型仅仅能看到一串字节,它无法知道一个词从哪里开始,到哪里结束,所以也不知道一个词是怎么组成的。所以,为了帮助机器理解文本,我们需要将文本分成一个个小片段然后将这些片段表示为一个向量作为模型的输入同时,我们需要将一个个小片段(token) 表示为向量,作为词嵌入矩阵, 通过在语料库上训练来优化token的表示,使其蕴含更多有用的信息,用于之后的任务。

丨汀、的博客 4326

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

8.1.3预训练语言模型BERT——预训练任务示例

因此模型蒸馏方向的模型或技术被提出来,其主要通过将性能好的大模型作为Teacher模型,将运行效率高的小模型作为Student模型,通过知识蒸馏的方式,将Teacher模型的知识逐步迁移至Student模型中。一样的预训练模型,其主要采用预训练+微调的策略进行使用,预训练主要是帮助BERT模型学习语言知识,在预训练完成后,可基于预训练后的模型,对下游任务进行微调训练,往往能够在下游任务中获得比较好的效果。基于预训练后的BERT模型进行下游任务微调,能够帮助下游任务获得更好的效果。里面,导致上下文碎片化。

我亦无他,唯手熟尔 1647

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【深度学习】预训练语言模型-BERT

BERT是一种预训练语言模型(pre-trained language model, PLM),其全称是Bidirectional Encoder Representations from Transformers。

Dong_ZH的博客 2万+

BERT(预训练Transformer模型)

Bert在18年提出,19年发表,Bert的目的是为了预训练Transformer模型encoder网络,从而大幅提高准确率Bert 的基本想法有两个,第一个想法:随机遮挡一个或者多个单词,让encoder网络根据上下文来预测被遮挡的单词。第二个想法:把两个句子放在一起让encoder网络判断两句话是不是原文里相邻的两句话Bert用这两个任务来预训练Transformer模型中的encoder网络。

teletubbies的博客 5137

第12章 Transformer与预训练模型

本文将Transformer架构及其衍生模型(如BERT、GPT)的核心机制与应用进行了系统梳理。首先介绍了注意力机制的原理,包括Query-Key-Value计算框架和加权求和过程。随后详细解析了Transformer的双向编码器-解码器结构,重点阐述了多头自注意力、位置编码等关键组件。文章还对比了BERT的双向预训练和GPT的自回归生成范式,并探讨了参数高效微调技术(如Adapter、LoRA)。最后通过Hugging Face库的BERT文本分类实例,展示了预训练模型微调的实际应用流程。全文揭示了Tr

1087

基于Transformer的图像处理预训练模型

本文介绍一篇发表在CVPR 2021上的文章,该文章提出了一种基于Transformer的图像处理预训练模型,可以在较小的数据集上进行微调后,直接应用到具体的图像处理任务(如去噪,超分,去雨等)。随着现代硬件计算能力的大幅提升,在大规模数据集上训练的预训练深度学习模型(如BERT、GPT-3)已经显示出比传统方法更好的效果。这一重大进展主要得益于Transformer及其变体架构的强大表示能力。

Python_cocola的博客 1796
上一篇: 从tf.math.log_softmax和tf.keras.losses.SparseCategoricalCrossentropy看softmax的上溢和下溢问题
下一篇: 基于tensorflow keras的simcse训练以及bert相关知识
会发paper的学渣
博客等级 码龄15年 171粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值