深度学习笔记(8)预训练模型

深度学习笔记(8)预训练模型

文章目录

  • 深度学习笔记(8)预训练模型
  • 一、预训练模型构建
  • 一、微调模型,训练自己的数据
    • 1.导入数据集
    • 2.数据集处理方法
    • 3.完形填空训练
  • 使用分词器将文本转换为模型的输入格式
  • 参数 return_tensors="pt" 表示返回PyTorch张量格式
  • 执行模型预测


一、预训练模型构建

加载模型和之前一样,用别人弄好的

# 导入warnings模块,用于忽略后续代码中可能出现的警告信息
import warnings
# 设置warnings模块,使其忽略所有警告
warnings.filterwarnings("ignore")# 从transformers库中导入AutoModelForMaskedLM类,该类用于预训练的掩码语言模型
from transformers import AutoModelForMaskedLM# 指定模型检查点,这里使用的是distilbert-base-uncased模型
model_checkpoint = "distilbert-base-uncased"
# 使用from_pretrained方法加载预训练的模型,该方法将从指定的检查点加载模型
model = AutoModelForMaskedLM.from_pretrained(model_checkpoint)

咱们的任务就是去预测MASK到底是个啥

text = "This is a great "  # 定义一个文本字符串# 从指定的模型检查点加载分词器
# model_checkpoint 是之前定义的模型检查点路径,用于加载与模型配套的分词器
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)# 使用分词器将文本转换为模型的输入格式
# 参数 return_tensors="pt" 表示返回PyTorch张量格式
inputs = tokenizer(text, return_tensors="pt")# inputs 现在是一个包含模型输入的张量或字典,可以用于模型推理
{'input_ids': tensor([[ 101, 2023, 2003, 1037, 2307,  103, 1012,  102]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])}

下面的代码可以看到mask的id是103

tokenizer.mask_token_id
103

一、微调模型,训练自己的数据

1.导入数据集

from datasets import load_dataset  # 从datasets库中导入load_dataset函数imdb_dataset = load_dataset("imdb")  # 使用load_dataset函数加载IMDB数据集

这段代码是使用 datasets 库来加载 IMDB 数据集。IMDB 数据集是一个用于情感分析的经典数据集,包含了两类电影评论:正面和负面。
本身是带标签的 正面和负面

  • 0 表示negative
  • 1表示positive

先查看下数据集的数据

 sample = imdb_dataset["train"].shuffle(seed=42).select(range(3))  # 从训练数据中随机选择3个样本for row in sample:print(f"\n'>>> Review: {row['text']}'")  # 打印样本的文本内容print(f"'>>> Label: {row['label']}'")   # 打印样本的标签

其中一个如下

'>>> Review: This movie is a great. The plot is very true to the book which is a classic written by Mark Twain. The movie starts of with a scene where Hank sings a song with a bunch of kids called "when you stub your toe on the moon" It reminds me of Sinatra's song High Hopes, it is fun and inspirational. The Music is great throughout and my favorite song is sung by the King, Hank (bing Crosby) and Sir "Saggy" Sagamore. OVerall a great family movie or even a great Date movie. This is a movie you can watch over and over again. The princess played by Rhonda Fleming is gorgeous. I love this movie!! If you liked Danny Kaye in the Court Jester then you will definitely like this movie.'
'>>> Label: 1'

但是我们要做完形填空,标签是没用的

2.数据集处理方法

这里文本长度要统一

  • 计算每一个文本的长度(word_ids)
  • 指定chunk_size,然后将所有数据按块进行拆分,比如每块128个,句子是700字节,要分成128,128,。。。。这种

先定义个函数,这样下面使用可以直接调用

def tokenize_function(examples):# 调用分词器(tokenizer)的函数,传入输入的文本数据集result = tokenizer(examples["text"])# 如果分词器支持快速模式,则生成单词索引(word_ids)if tokenizer.is_fast:result["word_ids"] = [result.word_ids(i) for i in range(len(result["input_ids"]))]# 返回转换后的结果return result

进行文本处理

tokenized_datasets = imdb_dataset.map(tokenize_function,  # 应用tokenize_function函数到每个样本batched=True,       # 是否将数据分成批次处理remove_columns=["text", "label"]  # 要从数据集中移除的列
)

首先,imdb_dataset.map() 方法被用来应用 tokenize_function 函数到 imdb_dataset 的 train 部分。这个方法会对数据集中的每个样本应用指定的函数,并返回一个新的数据集,其中包含应用函数后的结果。

batched=True 参数告诉 map 方法将输入数据分成批次进行处理。这通常是为了提高效率,尤其是在处理大型数据集时。

remove_columns=[“text”, “label”] 参数告诉 map 方法在处理数据时移除指定的列。在这个例子中,它移除了 text 和 label 列,因为 text 列已经被处理为模型的输入,而 label 列不再需要,因为咱们是完形填空任务,不需要标签。

然后进行切分

tokenizer.model_max_length
chunk_size = 128

tokenizer.model_max_length 是一个属性,它表示模型能够接受的最大输入长度。这个属性通常用于序列标注任务,以确保输入的长度不超过模型的最大接受长度。

chunk_size 是一个参数,用于指定将输入序列分割成小块的大小。这个参数通常用于处理过长的输入序列,以便将其分割成多个小块,然后分别处理这些小块。
因为上限是512 所以你切分要是64 128 256这种

切分的时候也可以先看下文本长度

# 看看每一个都多长
tokenized_samples = tokenized_datasets["train"][:3]for idx, sample in enumerate(tokenized_samples["input_ids"]):print(f"'>>> Review {idx} length: {len(sample)}'")
'>>> Review 0 length: 363'
'>>> Review 1 length: 304'
'>>> Review 2 length: 133'

这里看出128切分比较合适
先拿着三个试试

concatenated_examples = {k: sum(tokenized_samples[k], []) for k in tokenized_samples.keys()#计算拼一起有多少个,
}
total_length = len(concatenated_examples["input_ids"])
print(f"'>>> Concatenated reviews length: {total_length}'")
'>>> Concatenated reviews length: 800'

下面进行切分

chunks = {# 使用字典推导式(dict comprehension)创建一个新的字典,其中键是序列的键(k),值是分割后的块k: [t[i : i + chunk_size] for i in range(0, total_length, chunk_size)]# 遍历concatenated_examples字典中的每个键值对for k, t in concatenated_examples.items()
}for chunk in chunks["input_ids"]:# 打印每个chunk的长度print(f"'>>> Chunk length: {len(chunk)}'")
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 32'

最后那个不够数,直接给他丢弃

def group_texts(examples):# 将所有的文本实例拼接到一起concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}# 计算拼接后的总长度total_length = len(concatenated_examples[list(examples.keys())[0]])# 使用整除运算符(//)计算每个chunk的长度,然后乘以chunk_size,以确保不会出现多余的文本total_length = (total_length // chunk_size) * chunk_size# 根据计算出的总长度,对拼接后的文本进行切分result = {# 使用字典推导式(dict comprehension)创建一个新的字典,其中键是原始字典的键(k),值是切分后的块k: [t[i : i + chunk_size] for i in range(0, total_length, chunk_size)]# 遍历concatenated_examples字典中的每个键值对for k, t in concatenated_examples.items()}# 如果完型填空任务需要使用标签,则将标签复制到结果字典中result["labels"] = result["input_ids"].copy()# 返回分割后的结果return result

使用整除运算符(//)计算每个chunk的长度,然后乘以chunk_size这个就是说如果小于128 整除后就得0,就没了

  train: Dataset({features: ['input_ids', 'attention_mask', 'word_ids', 'labels'],num_rows: 61291})test: Dataset({features: ['input_ids', 'attention_mask', 'word_ids', 'labels'],num_rows: 59904})unsupervised: Dataset({features: ['input_ids', 'attention_mask', 'word_ids', 'labels'],num_rows: 122957})
})

会发现数据量大了

3.完形填空训练

from transformers import DataCollatorForLanguageModeling  # 从transformers库中导入DataCollatorForLanguageModeling类data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm_probability=0.15)  # 创建一个数据收集器

然后再举个例子看看mask长啥样

samples = [lm_datasets["train"][i] for i in range(2)]  # 从训练数据中选择2个样本
for sample in samples:_ = sample.pop("word_ids")  # 移除样本中的"word_ids"键,因为发现没啥用print(sample)for chunk in data_collator(samples)["input_ids"]:print(f"\n'>>> {tokenizer.decode(chunk)}'")#tokenizer.decode(chunk)是为了让被隐藏的更明显点,所以直接decode出来print(len(chunk))

训练过程

from transformers import TrainingArguments  # 从transformers库中导入TrainingArguments类batch_size = 64  # 定义训练和评估时的批次大小
# 计算每个epoch打印结果的步数
logging_steps = len(downsampled_dataset["train"]) // batch_size
model_name = model_checkpoint.split("/")[-1]  # 从模型检查点路径中提取模型名称training_args = TrainingArguments(output_dir=f"{model_name}-finetuned-imdb",  # 指定输出目录,其中包含微调后的模型和日志文件overwrite_output_dir=True,  # 是否覆盖现有的输出目录evaluation_strategy="epoch",  # 指定评估策略,这里为每个epoch评估一次learning_rate=2e-5,  # 学习率weight_decay=0.01,  # 权重衰减系数per_device_train_batch_size=batch_size,  # 每个GPU的训练批次大小per_device_eval_batch_size=batch_size,  # 每个GPU的评估批次大小logging_steps=logging_steps,  # 指定每个epoch打印结果的步数num_train_epochs=1,  # 指定训练的epoch数量save_strategy='epoch',  # 指定保存策略,这里为每个epoch保存一次模型
)

生成的模型在这里插入图片描述

from transformers import Trainer  # 从transformers库中导入Trainer类trainer = Trainer(model=model,  # 指定要训练的模型实例args=training_args,  # 指定训练参数对象train_dataset=downsampled_dataset["train"],  # 指定训练数据集eval_dataset=downsampled_dataset["test"],  # 指定评估数据集data_collator=data_collator,  # 指定数据收集器
)

评估标准使用困惑度

import math  # 导入math模块,用于计算对数和指数eval_results = trainer.evaluate()  # 使用Trainer的evaluate方法评估模型print(f">>> Perplexity: {math.exp(eval_results['eval_loss']):.2f}")  # 打印评估结果中的对数

人话就是你不得在mask那挑啥词合适吗,平均挑了多少个才能答对

训练模型

trainer.train() 
eval_results = trainer.evaluate()
print(f">>> Perplexity: {math.exp(eval_results['eval_loss']):.2f}")

发现困惑度降低了

from transformers import AutoModelForMaskedLMmodel_checkpoint  = "./distilbert-base-uncased"
model = AutoModelForMaskedLM.from_pretrained("./distilbert-base-uncased-finetuned-imdb/checkpoint-157")

加载自己的模型
import torch # 导入torch库,用于处理张量

使用分词器将文本转换为模型的输入格式

参数 return_tensors=“pt” 表示返回PyTorch张量格式

inputs = tokenizer(text, return_tensors=“pt”)

执行模型预测

# model 是一个预训练的BERT模型实例
# **inputs 表示将inputs字典中的所有键值对作为关键字参数传递给model
token_logits = model(**inputs).logits# 找到遮蔽词在输入中的索引
# inputs["input_ids"] 是模型输入的词汇索引张量
# tokenizer.mask_token_id 是遮蔽词的词汇索引
mask_token_index = torch.where(inputs["input_ids"] == tokenizer.mask_token_id)[1]# 获取遮蔽词的预测logits
# mask_token_index 是遮蔽词在输入中的索引张量
# token_logits 是模型输出的预测logits张量
mask_token_logits = token_logits[0, mask_token_index, :]# 找到前5个最可能的替换词
# torch.topk 函数用于找到最大k个值及其索引
# dim=1 表示在第二个维度(即词汇维度)上进行排序
top_5_tokens = torch.topk(mask_token_logits, 5, dim=1).indices[0].tolist()# 打印每个最可能的替换词及其替换后的文本
for token in top_5_tokens:# 使用 tokenizer.decode 方法将索引转换为文本# text 是原始文本# tokenizer.mask_token 是遮蔽词# [token] 是替换词的索引列表print(f"'>>> {text.replace(tokenizer.mask_token, tokenizer.decode([token]))}'")
'>>> This is a great deal.'
'>>> This is a great idea.'
'>>> This is a great adventure.'
'>>> This is a great film.'
'>>> This is a great movie.'

可以看到结果和上面的通用的不一样了,这里是film movie这些针对你的训练数据的了--------

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

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

相关文章

docker从容器提取镜像并上传至dockerhub

一、使用commit从容器中提取镜像 例如 //docker commit 容器名 想要创建的镜像名:版本号 docker commit epsilon_planner epsilon_planner:latest导出完成后镜像如图所示 二、登陆dockerhub并创建仓库 登陆dockerhub,点击Create repository创建仓库&#xff0c…

【机器学习(八)】分类和回归任务-因子分解机(Factorization Machines,FM)-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理(一) FM表达式(二)时间复杂度(三)回归和分类 三、算法优缺点(一)优点(二)缺点 四、FM分类任务实现对比(一&…

【ShuQiHere】 探索数据挖掘的世界:从概念到应用

🌐 【ShuQiHere】 数据挖掘(Data Mining, DM) 是一种从大型数据集中提取有用信息的技术,无论是在商业分析、金融预测,还是医学研究中,数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…

机械设备产品资料方案介绍小程序系统开发制作

设备产品资料介绍小程序系统,是一家工业机械设备生产厂家为了更好的服务客户而定制开发的一套小程序系统,让用户通过小程序就可以了解公司产品介绍的详细参数、售后服务和产品操作手持等。 该小程序系统里面主要开发的功能模块有: 1、产品目…

智慧课堂学生行为数据集

智慧校园数据集合集概述 智慧校园旨在通过整合先进的信息技术来提升教育环境的安全性、效率以及互动性。一个关键组成部分是利用计算机视觉技术对校园内的各种活动进行监控与分析。为此,构建了一个全面的数据集合集,包含了密集行人、头部检测、抽烟行为…

一个手机号注册3个抖音号的绿色方法?一个人注册多个抖音号的方法!

下面这是我注册的新账号,显示未实名,在手机号这里显示辅助手机号绑定,手机号绑定这里显示未绑定。如果你需要矩阵,那么,还需要设置好头像,以及介绍,这些都可以正常设置。 再好的方法&#xff0c…

C++笔记21•C++11的新特性•

相比于 C98/03,C11则带来了数量可观的变化,其中包含了约140个新特性,以及对C03标准中约600个缺陷的修正,这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言,C11能更好地用于系统开发和库开发、语法更加泛华和简…

VS code 创建与运行 task.json 文件

VS code 创建与运行 task.json 文件 引言正文创建 .json 文件第一步第二步第三步 运行 .json 文件 引言 之前在 VS code EXPLORER 中不显示指定文件及文件夹设置(如.pyc, pycache, .vscode 文件) 一文中我们介绍了 settings.json 文件,这里我…

唯徳知识产权管理系统 UploadFileWordTemplate 任意文件读取

0x01 漏洞描述: 唯徳于2014年成立,是专业提供企业、代理机构知识产权管理软件供应商,某公司凭借领先的技术实力和深厚的专利行业积累,产品自上市推广以来,已为1000多家企业及代理机构提供持续稳定的软件服务。其知识产…

安卓13长按电源按键直接关机 andriod13不显示关机对话框直接关机

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有些设备需要在长按电源键的时候,直接关机。不需要弹出对话框进行询问。 2.问题分析 过滤电源按键,需要在系统里面处理的话,那么我们需要熟悉android的事件分发,然后再…

L67 【哈工大_操作系统】操作系统历史 学习任务

L6 操作系统历史 线条一 1、上古神机 IBM7094 专注于计算批处理操作系统(Batch system) 2、OS/360 一台计算机干多种事,多道程序作业之间的 切换和调度 成为核心 (多进程结构和进程管理概念萌芽!) 3…

链式栈讲解

文章目录 🍊自我介绍🍊链式栈入栈和出栈linkstack.hlinkstack.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是小珑也要…

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…

考研数据结构——C语言实现有向图邻接矩阵

首先,定义了一些基本的数据结构和常量: VertexType:顶点的数据类型,这里定义为char。EdgeType:边的数据类型,这里定义为int,用于存储权重。MAXVEX:定义了图中最大顶点数为100。INFIN…

详细解读,F5服务器负载均衡的技术优势

在现代大规模、高流量的网络使用场景中,为应对高并发和海量数据的挑战,服务器负载均衡技术应运而生。但凡知道服务器负载均衡这一名词的,基本都对F5有所耳闻,因为负载均衡正是F5的代表作,换句通俗易懂的话来说&#xf…

前端vue-关于标签切换的实现

首先是循环,使用v-for“(item,index) in list” :key“item.id” 然后当点击哪个的时候再切换,使用v-bind:class" "或者是:class" ",如果都是用active的话,那么每一个标签都是被选中的状态,…

Android IME输入法启动显示隐藏流程梳理

阅读Android AOSP 12版本代码,对输入法IME整体框架模块进行学习梳理,内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程,以及常见问题和调试技巧。 1. IME整体框架​​​​​​​ IME整体分为三个部分&#xf…

Log4j2—漏洞分析(CVE-2021-44228)

文章目录 Log4j2漏洞原理漏洞根因调用链源码分析调用链总结 漏洞复现dnsrmi Log4j2漏洞原理 前排提醒:本篇文章基于我另外一篇总结的JNDI注入后写的,建议先看该文章进行简单了解JNDI注入: https://blog.csdn.net/weixin_60521036/article/de…

茴香豆:企业级知识问答工具实践闯关任务

基础任务 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手,并使用 Gradio 界面完成 2 轮问答(问题不可与教程重复,作业截图需包括 gradio 界面问题和茴香豆回答)。知识库可根据根据自己工作、学习或感兴趣的内容调…

50页PPT麦肯锡精益运营转型五步法

读者朋友大家好,最近有会员朋友咨询晓雯,需要《 50页PPT麦肯锡精益运营转型五步法》资料,欢迎大家下载学习。 知识星球已上传的资料链接: 企业架构 企业架构 (EA) 设计咨询项目-企业架构治理(EAM)现状诊断 105页PPTHW企业架构设…