第八节 BERT实战

news/2025/2/7 14:18:29/文章来源:https://www.cnblogs.com/jyp02/p/18702502

做下游分类任务,如何处理一句话的输入

  1. input_dis:输入哪些字 21128个汉字里编码
  2. mask:输入的话有多长. 模型输入固定,不够的话用padding补上
  3. Seq_ids:句子编码 segment

BERT输入

  1. token embedding 字编码(21128, 768)
  2. segment embedding 句子编码(2, 768)
  3. position embedding不用给 自动知道下标 最长长度不是句子长度,而是模型长度(512, 768)

    bert layer层每层都是一个self-attention
    hidden_size=768规定embedding到768维

data

#  data负责产生两个dataloader
from torch.utils.data import DataLoader, Dataset
from sklearn.model_selection import train_test_split   #给X,Y 和分割比例, 分割出来一个训练集和验证机的X, Y
import torchdef read_file(path):data = []label = []with open(path, "r", encoding="utf-8") as f:for i, line in enumerate(f):if i == 0:continueif i > 200 and i< 7500:continueline = line.strip("\n") #去掉\nline = line.split(",", 1)  #把这句话,按照,分割, 1表示分割次数data.append(line[1])label.append(line[0])print("读了%d的数据"%len(data))return data, label# file = "../jiudian.txt"
# read_file(file)
class jdDataset(Dataset):def __init__(self, data, label):self.X = dataself.Y = torch.LongTensor([int(i) for i in label])def __getitem__(self, item):return self.X[item], self.Y[item]def __len__(self):return len(self.Y)def get_data_loader(path, batchsize, val_size=0.2):          #读入数据,分割数据。data, label = read_file(path)train_x, val_x, train_y, val_y = train_test_split(data, label, test_size=val_size, shuffle=True, stratify=label)train_set = jdDataset(train_x, train_y)val_set = jdDataset(val_x, val_y)train_loader = DataLoader(train_set, batchsize, shuffle=True)val_loader = DataLoader(val_set, batchsize, shuffle=True)return train_loader, val_loaderif __name__ == "__main__":get_data_loader("../jiudian.txt", 2)

Model

import torch
import torch.nn as nn
from transformers import BertModel, BertTokenizer, BertConfigclass myBertModel(nn.Module):def __init__(self, bert_path, num_class, device):super(myBertModel, self).__init__()self.bert = BertModel.from_pretrained(bert_path)# config = BertConfig.from_pretrained(bert_path)# self.bert = BertModel(config)self.device = deviceself.cls_head = nn.Linear(768, num_class) #分类头self.tokenizer = BertTokenizer.from_pretrained(bert_path)def forward(self, text):input = self.tokenizer(text, return_tensors="pt", truncation=True, padding="max_length", max_length=128)input_ids = input["input_ids"].to(self.device) #以字典形式存放token_type_ids = input['token_type_ids'].to(self.device)attention_mask = input['attention_mask'].to(self.device)sequence_out, pooler_out = self.bert(input_ids=input_ids,token_type_ids=token_type_ids,attention_mask=attention_mask,return_dict=False)      #return_dictpred = self.cls_head(pooler_out)return predif __name__ == "__main__":model = myBertModel("../bert-base-chinese", 2)pred = model("今天天气真好")

在 Python 中,if __name__ == "__main__": 这部分代码起着重要作用。
__name__ 变量:
每个 Python 模块都有一个内置的 __name__ 变量。
当一个 Python 文件作为主程序直接运行时,该文件中 __name__ 的值会被设置为 "__main__"。
当一个 Python 文件被作为模块导入到其他文件中时,该文件中 __name__ 的值为模块名(即该文件的文件名,不包含 .py 后缀)。
if __name__ == "__main\a__": 的作用:
它可以用来区分该模块是被直接运行还是被导入。在 if __name__ == "__main__": 块中的代码只有在该模块作为主程序直接运行时才会被执行,而当该模块被导入到其他模块中时,这部分代码不会被执行。

import random
import torch
import torch.nn as nn
import numpy as np
import osfrom model_utils.data import get_data_loader
from model_utils.model import myBertModel
from model_utils.train import train_valdef seed_everything(seed):torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.deterministic = Truerandom.seed(seed)np.random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)
#################################################################
seed_everything(0)
###############################################lr = 0.0001
batchsize = 16
loss = nn.CrossEntropyLoss()
bert_path = "bert-base-chinese"
num_class = 2
data_path = "jiudian.txt"
max_acc= 0.6
device = "cuda" if torch.cuda.is_available() else "cpu"
model = myBertModel(bert_path, num_class, device).to(device)optimizer = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=0.00001)train_loader, val_loader = get_data_loader(data_path, batchsize)epochs = 5    #
save_path = "model_save/best_model.pth"scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=20, eta_min=1e-9) #改变学习率
val_epoch = 1para = {"model": model,"train_loader": train_loader,"val_loader": val_loader,"scheduler" :scheduler,"optimizer": optimizer,"loss": loss,"epoch": epochs,"device": device,"save_path": save_path,"max_acc": max_acc,"val_epoch": val_epoch   #训练多少轮验证一次
}train_val(para)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux X64函数参数传递过程研究

linux X64函数参数传递过程研究 - ZhaoKevin - 博客园 基础知识 函数传参存在两种方式,一种是通过栈,一种是通过寄存器。对于x64体系结构,如果函数参数不大于6个时,使用寄存器传参,对于函数参数大于6个的函数,前六个参数使用寄存器传递,后面的使用栈传递。参数传递的规律…

使用systemback封装Ubuntu系统iso镜像

25年小橘祝亲们钱财发发发,好运来来来。小橘初八就已经开工了,不知道家人们是不是也像小橘一样苦哈哈。今天给亲们分享使用systemback封装Ubuntu系统iso镜像。 一、环境部署 1.安装systembackecho "deb [arch=amd64] http://mirrors.bwbot.org/ stable main" > …

免费+数据安全!手把手教你在PC跑DeepSeek-R1大模型,小白也能秒变AI大神!

0 为啥本地部署? 在本地运行 AI 模型具有以下优势:隐私:你的数据保留在你的机器上 — — 不存在共享敏感信息的风险 成本: DeepSeek R1 可免费使用,无需订阅费或使用费 控制:无需外部依赖即可进行微调和实验1 使用Ollama 1.1 下载并运行应用程序 直达官网:1.2 选择你的平…

mkv和ass字幕文件合并

主要使用两种工具:ffmpeg和mkvmerge 操作系统:windows10及以上 ffmpeg下载:https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl-shared.zip mkvmerge下载:https://mkvtoolnix.download/windows/releases/89.0/mkvtoolnix-64-…

【日记】我已经穿越了那层屏障(1903 字)

正文每次节后都知道,能说 “节后再说” 这句话当时有多爽(笑。现在节后有好多好多事情要做——年后再说的事,袭来!昨天是收假之后第一天,开了个会,我没去。结果他们下来都一幅晴天霹雳的样子,我十分诧异。结果一问,基本上全部的人都要轮岗了。我三月份又要跑去业务线,…

洛谷题单指南-线段树的进阶用法-P5445 [APIO2019] 路灯

原题链接:https://www.luogu.com.cn/problem/P5445 题意解读:给定一个长度为n的01串,一共有q个时刻,对于每个时刻,可能有两种操作:1. 把第x个位置取反 2. 查询a ~ b - 1之间的串在过去有多少个时刻都为1。 解题思路: 一、朴素想法 每个时刻对路灯的状态建立线段树,可以…

[LLM] ZeRO-DP技术简析

[LLM] ZeRO-DP技术简析 本文对ZeRO: Memory Optimizations Toward Training Trillion Parameter Models中提出的ZeRO-DP进行简要总结。相关的讲解其实网上也有很多了,不过只看网上的终究还是有点走马观花,所以我还是决定自己写一篇博客,记录一下我自己的理解。这篇博客讲的不…

人工智能训练线上算力实验环境

语音识别,转文字。from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasksinference_pipeline = pipeline(task=Tasks.auto_speech_recognition,model=iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch,mo…

腾讯云HAI与DeepSeek携手打造私有化高效代码助手

今天,我们依然以DeepSeek-R1大模型为核心,继续探索其在实际场景中的可用性。今天的重点将放在基于DeepSeek-R1大模型,结合JetBrains IDEA 插件代码助手(CodeGPT)进行的场景应用探索。 我们将利用腾讯云HAI服务器进行私有化部署,以确保数据安全和模型的高效运行。让我们一…

技术博客架构升级:解锁高效写作新体验

最近我对自己的技术博客架构做了一次重要升级,实现了文章内容与静态网站生成器的完全解耦。这个方案让写作回归纯粹,同时保持了自动化部署的优势。以下是具体的实现方案: 🛠️ 方案架构主仓库:flowstone/flowstone.github.io​ 主仓库仅保留静态网站生成器的相关配置,果…

window10本地搭建DeepSeek R1(三) NoneType object has no attribute encode

上面两章介绍了在本地安装DeepSeek+OpenWebUI。这里介绍一下几个需要注意的地方。 1:文件上传失败,上传文件是报错:python "NoneType object has no attribute encode" 在网上找了个方法,能解决:设置语言模型:安装如图箭头的步骤安装一个语义向量模型:sentenc…

如何用sockpef测试实例之间的网络时延

本文分享自天翼云开发者社区《如何用sockpef测试实例之间的网络时延》,作者:j****n网络时延:指数据(报文/分组、比特流)从网络的一端发送到另一端所需的时间。也叫延迟或迟延。 操作步骤:分别在测试机和辅助测试机上执行一下命令,安装sockperfyum install -y autoconf a…