当前位置: 首页 > news >正文

宽屏大气网站模板番禺高端网站建设公司

宽屏大气网站模板,番禺高端网站建设公司,建筑方案设计案例,程序员自己建站赚钱这是一个经典的文本分类问题#xff0c;使用google的预训练模型BERT中文版bert-base-chinese来做中文文本分类。可以先在Huggingface上下载预训练模型备用。https://huggingface.co/google-bert/bert-base-chinese/tree/main 我使用的训练环境是 pip install torch2.0.0; pi…这是一个经典的文本分类问题使用google的预训练模型BERT中文版bert-base-chinese来做中文文本分类。可以先在Huggingface上下载预训练模型备用。https://huggingface.co/google-bert/bert-base-chinese/tree/main 我使用的训练环境是 pip install torch2.0.0; pip install transformers4.30.2; pip install gensim4.3.3; pip install huggingface-hub0.15.1; pip install modelscope1.20.1; 一、准备训练数据 1.1 准备中文文本分类任务的训练数据 这里Demo数据如下 各银行信用卡挂失费迥异 北京银行收费最高 0 莫泰酒店流拍 大摩叫价或降至6亿美元 4 乌兹别克斯坦议会立法院主席获连任 6 德媒披露鲁能引援关键人物 是他力荐德甲亚洲强人 7 辉立证券给予广汽集团持有评级 2 图文-业余希望赛海南站第二轮 球场的菠萝蜜 7 陆毅鲍蕾近乎完美的爱情(组图)(2) 9 7000亿美元救市方案将成期市毒药 0 保诚启动210亿美元配股交易以融资收购AIG部门 2 分类class类别文件 finance realty stocks education science society politics sports game entertainment 1.2 数据读取和截断使满足BERT模型输入 读取训练数据对文本进行处理如截取过长的文本、补齐较短的文本加上起始标示、对文本进行编码、添加掩码、转为tensor等操作。 import os from config import parsers from transformers import BertTokenizer from torch.utils.data import Dataset, DataLoader import torchfrom transformers import AutoTokenizer, AutoModelForMaskedLMdef read_data(file):# 读取文件all_data open(file, r, encodingutf-8).read().split(\n)# 得到所有文本、所有标签、句子的最大长度texts, labels, max_length [], [], []for data in all_data:if data:text, label data.split(\t)max_length.append(len(text))texts.append(text)labels.append(label)# 根据不同的数据集返回不同的内容if os.path.split(file)[1] train.txt:max_len max(max_length)return texts, labels, max_lenreturn texts, labels,class MyDataset(Dataset):def __init__(self, texts, labels, max_length):self.all_text textsself.all_label labelsself.max_len max_lengthself.tokenizer BertTokenizer.from_pretrained(parsers().bert_pred) # self.tokenizer AutoTokenizer.from_pretrained(bert-base-chinese)def __getitem__(self, index):# 取出一条数据并截断长度text self.all_text[index][:self.max_len]label self.all_label[index]# 分词text_id self.tokenizer.tokenize(text)# 加上起始标志text_id [[CLS]] text_id# 编码token_id self.tokenizer.convert_tokens_to_ids(text_id)# 掩码 -》mask [1] * len(token_id) [0] * (self.max_len 2 - len(token_id))# 编码后 -》长度一致token_ids token_id [0] * (self.max_len 2 - len(token_id))# str -》 intlabel int(label)# 转化成tensortoken_ids torch.tensor(token_ids)mask torch.tensor(mask)label torch.tensor(label)return (token_ids, mask), labeldef __len__(self):# 得到文本的长度return len(self.all_text) 将文本处理后就可以使用torch.utils.data中自带的DataLoader模块来加载训练数据了。 二、微调BERT模型 我们是微调BERT模型需要获取BERT最后一个隐藏层的输出作为输入到下一个全连接层。 至于选择BERT模型的哪个输出作为linear层的输入可以通过实验尝试或者遵循常理。 pooler_output这是通过将最后一层的隐藏状态的第一个token通常是[CLS] token通过一个线性层和激活函数得到的输出常用于分类任务。 last_hidden_state这是模型所有层的最后一个隐藏状态的输出包含了整个序列的上下文信息适用于序列级别的任务。 简单调用下BERT模型打印出来最后一层看下 import torch import time import torch.nn as nn from transformers import BertTokenizer from transformers import BertModel from transformers import AutoTokenizer, AutoModelForMaskedLMdef process_text(text, bert_pred):tokenizer BertTokenizer.from_pretrained(bert_pred)token_id tokenizer.convert_tokens_to_ids([[CLS]] tokenizer.tokenize(text))mask [1] * len(token_id) [0] * (38 2 - len(token_id))token_ids token_id [0] * (38 2 - len(token_id))token_ids torch.tensor(token_ids).unsqueeze(0)mask torch.tensor(mask).unsqueeze(0)x torch.stack([token_ids, mask])return xdevice cpu bert BertModel.from_pretrained(./bert-base-chinese/) texts [沈腾和马丽的电影《独行月球》挺好看] for text in texts:x process_text(text, ./bert-base-chinese/)input_ids, attention_mask x[0].to(device), x[1].to(device)hidden_out bert(input_ids, attention_maskattention_mask,output_hidden_statesFalse) print(hidden_out) 输出结果 2.1 文本分类任务选择使用pooler_output作为线性层的输入。 import torch.nn as nn from transformers import BertModel from transformers import AutoTokenizer, AutoModelForMaskedLM from config import parsers import torchclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.args parsers()self.device cuda:0 if torch.cuda.is_available() else cpu self.bert BertModel.from_pretrained(self.args.bert_pred) # bert 模型进行微调for param in self.bert.parameters():param.requires_grad True# 一个全连接层self.linear nn.Linear(self.args.num_filters, self.args.class_num)def forward(self, x):input_ids, attention_mask x[0].to(self.device), x[1].to(self.device)hidden_out self.bert(input_ids, attention_maskattention_mask,output_hidden_statesFalse) # 是否输出所有encoder层的结果# shape (batch_size, hidden_size) pooler_output -- hidden_out[0]pred self.linear(hidden_out.pooler_output)# 返回预测结果return pred 2.2 优化器使用Adam、损失函数使用交叉熵损失函数 device cuda:0 if torch.cuda.is_available() else cpu model MyModel().to(device) opt AdamW(model.parameters(), lrargs.learn_rate) loss_fn nn.CrossEntropyLoss() 三、训练模型 3.1 参数配置 def parsers():parser argparse.ArgumentParser(descriptionBert model of argparse)parser.add_argument(tx_date,nargs?) #可选输入参数计算日期parser.add_argument(--train_file, typestr, defaultos.path.join(./data_all, train.txt))parser.add_argument(--dev_file, typestr, defaultos.path.join(./data_all, dev.txt))parser.add_argument(--test_file, typestr, defaultos.path.join(./data_all, test.txt))parser.add_argument(--classification, typestr, defaultos.path.join(./data_all, class.txt))parser.add_argument(--bert_pred, typestr, default./bert-base-chinese)parser.add_argument(--class_num, typeint, default12)parser.add_argument(--max_len, typeint, default38)parser.add_argument(--batch_size, typeint, default32)parser.add_argument(--epochs, typeint, default10)parser.add_argument(--learn_rate, typefloat, default1e-5)parser.add_argument(--num_filters, typeint, default768)parser.add_argument(--save_model_best, typestr, defaultos.path.join(model, all_best_model.pth))parser.add_argument(--save_model_last, typestr, defaultos.path.join(model, all_last_model.pth))args parser.parse_args()return args 3.2 模型训练 import torch from torch.utils.data import DataLoader from torch.optim import AdamW import torch.nn as nn from sklearn.metrics import accuracy_score import timeif __name__ __main__:start time.time()args parsers()device cuda:0 if torch.cuda.is_available() else cpuprint(device:, device)train_text, train_label, max_len read_data(args.train_file)dev_text, dev_label read_data(args.dev_file)args.max_len max_lentrain_dataset MyDataset(train_text, train_label, args.max_len)train_dataloader DataLoader(train_dataset, batch_sizeargs.batch_size, shuffleTrue)dev_dataset MyDataset(dev_text, dev_label, args.max_len)dev_dataloader DataLoader(dev_dataset, batch_sizeargs.batch_size, shuffleFalse)model MyModel().to(device)opt AdamW(model.parameters(), lrargs.learn_rate)loss_fn nn.CrossEntropyLoss()acc_max float(-inf)for epoch in range(args.epochs):loss_sum, count 0, 0model.train()for batch_index, (batch_text, batch_label) in enumerate(train_dataloader):batch_label batch_label.to(device)pred model(batch_text)loss loss_fn(pred, batch_label)opt.zero_grad()loss.backward()opt.step()loss_sum losscount 1# 打印内容if len(train_dataloader) - batch_index len(train_dataloader) % 1000 and count len(train_dataloader) % 1000:msg [{0}/{1:5d}]\tTrain_Loss:{2:.4f}print(msg.format(epoch 1, batch_index 1, loss_sum / count))loss_sum, count 0.0, 0if batch_index % 1000 999:msg [{0}/{1:5d}]\tTrain_Loss:{2:.4f}print(msg.format(epoch 1, batch_index 1, loss_sum / count))loss_sum, count 0.0, 0model.eval()all_pred, all_true [], []with torch.no_grad():for batch_text, batch_label in dev_dataloader:batch_label batch_label.to(device)pred model(batch_text)pred torch.argmax(pred, dim1).cpu().numpy().tolist()label batch_label.cpu().numpy().tolist()all_pred.extend(pred)all_true.extend(label)acc accuracy_score(all_pred, all_true)print(fdev acc:{acc:.4f})if acc acc_max:print(acc, acc_max)acc_max acctorch.save(model.state_dict(), args.save_model_best)print(f以保存最佳模型)torch.save(model.state_dict(), args.save_model_last)end time.time()print(f运行时间{(end-start)/60%60:.4f} min)模型保存为 -rw-rw-r--  1 gaoToby gaoToby 391M Dec 24 14:02 all_best_model.pth -rw-rw-r--  1 gaoToby gaoToby 391M Dec 24 14:02 all_last_model.pth 四、模型推理预测 准备预测文本文件加载模型进行文本的类别预测。 def text_class_name(pred):result torch.argmax(pred, dim1)print(torch.argmax(pred, dim1).cpu().numpy().tolist())result result.cpu().numpy().tolist()classification open(args.classification, r, encodingutf-8).read().split(\n)classification_dict dict(zip(range(len(classification)), classification))print(f文本{text}\t预测的类别为{classification_dict[result[0]]})if __name__ __main__:start time.time()args parsers()device cuda:0 if torch.cuda.is_available() else cpumodel load_model(device, args.save_model_best)texts [沈腾和马丽的新电影《独行月球》好看, 最近金融环境不太好投资需谨慎]print(模型预测结果)for text in texts:x process_text(text, args.bert_pred)with torch.no_grad():pred model(x)text_class_name(pred)end time.time()print(f耗时为{end - start} s) 以上基本流程完成。当然模型还需要调优来改进预测效果的。 代码是实际跑通的我训练和预测均使用的是GPU。如果是使用GPU做模型训练再使用CPU做推理预测的情况推理预测加载模型的时候注意修改下 myModel.load_state_dict(torch.load(model_path, map_locationtorch.device(cpu))) Done
http://www.zqtcl.cn/news/479337/

相关文章:

  • 如何使用模板做网站php精品网站建设
  • 建设一个网站的具体流程职业培训机构需要什么资质
  • 网站怎么做弹幕播放器自助免费网站制作
  • 网站咨询弹窗是怎么做的网站建设的目标客户
  • 搞好姓氏源流网站建设Wordpress 商城主题过于臃肿
  • 如何网站客户案例上海网站备案查询
  • 沈阳大熊网站建设制作北京门户网站制作公司
  • 如何制作自己的网站免费最好的建站平台
  • 自己网站做电子签章有效么网站的规划与建设案例分析
  • 945新开传奇网站深圳动画营销推广的原因
  • 网站制作加盟网站推广 知乎
  • 广西东晋建设有限公司网站电商详情页模板免费套用
  • dedecms 做影网站商丘家居网站建设
  • 七里港网站建设商城购物网站有哪些模块
  • 中英网站怎么做网站域名的作用是什么
  • 网站建设开题报告ppt模板重庆建设工程信息网址
  • 做个什么类型网站百度云资源链接分享群组
  • 商务网站建设的主流程西安建设局网站
  • 邢台营销型网站建设做网站的保证承诺
  • 关于茶叶的网站模板免费下载wordpress多边形按钮
  • 贵阳市网站建设手工制作花
  • 娄底哪里做网站免费永久不限空间
  • 网站标签怎么做wordpress 后台模板
  • 内江移动网站建设网站内部链接的作用有哪些
  • 阿里云的wordpress建站wordpress 批量定时发布
  • 网站院长信箱怎么做海报设计制作网站
  • 办网站如何备案怎么制作微信链接网页
  • 聊城门户网站建设怎样能有个人网站
  • 营销网站建设资料创意网站 模板
  • 免费的短网址生成器深圳外贸网站优化