网站没备案或与实际备案不符网址域名注册信息查询

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

网站没备案或与实际备案不符,网址域名注册信息查询,网站建设sem账户搭建,做自适应网站对设计稿的要求✨✨ 欢迎大家来访Srlua的博文#xff08;づ#xffe3;3#xffe3;#xff09;づ╭❤#xff5e;✨✨ #x1f31f;#x1f31f; 欢迎各位亲爱的读者#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢#xff0c;在这里我会分享我的知识和经验。づ3づ╭❤✨✨ 欢迎各位亲爱的读者感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢在这里我会分享我的知识和经验。 希望在这里我们能一起探索IT世界的奥妙提升我们的技能。 记得先点赞后阅读哦~ 所属专栏传知代码论文复现 欢迎访问我的主页Srlua小谢 获取更多信息和资源。✨✨ ​​ ​​ 目录 概述 语义分类 文本分类 情感分类 实现原理 核心逻辑 pre_deal.py train.py test_demo.py 实现方式演示效果 训练阶段 测试阶段 本文所有资源均可在该地址处获取。 概述 在之前的文章中我们介绍了BERT模型。BERT作为一种预训练语言模型它具有很好的兼容性能够运用在各种下游任务中本文的主要目的是利用数据集来对BERT进行训练从而实现一个语义分类的模型。 语义分类 语义分类是自然语言处理任务中的一种包含文本分类、情感分析 文本分类 文本分类是指给定文本a将文本分类为n个类别中的一个或多个。常见的应用包括文本话题分类情感分类具体的分类方向有有二分类多分类和多标签分类。 文本分类可以采用传统机器学习方法贝叶斯svm等和深度学习方法fastTextTextCNN等实现。 举例而言对于一个对话数据集我们可以用1、2、3表示他们的话题如家庭、学校、工作等而文本分类的目的则是把这些文本的话题划分到给定的三种类别中。 情感分类 情感分析是自然语言处理中常见的场景比如商品评价等。通过情感分析可以挖掘产品在各个维度的优劣。情感分类其实也是一种特殊的文本分类只是他更聚焦于情感匹配词典。 举例而言情感分类可以用0/1表示负面评价/正面评价例子如下 0,不好的319房间有故臭味。要求换房说满了我是3月去的。在路上认识了一个上海人他说他退房前也住的319也是一股臭味。而且这个去不掉特别是晚上很浓。不知道是厕所的还是窗外的。服务一般门前有绿皮公交去莫高窟不过敦煌宾馆也有下次住敦煌宾馆。再也不住这个酒店了热水要放半个小时才有。 1,不错的酒店大堂和餐厅的环境都不错。但由于给我的是一间走廊尽头的房间所以房型看上去有点奇怪。客厅和卧室是连在一起的面积偏小。服务还算到位总的来说性价比还是不错的。本文将以情感二分类为例实现如何利用BERT进行语义分析。 实现原理 首先基于BERT预训练模型能将一个文本转换成向量作为模型的输入。 在BERT预训练模型的基础上新增一个全连接层将输入的向量通过训练转化成一个tensor作为输出其中这个tensor的维度则是需要分类的种类具体的值表示每个种类的概率。例如 [0.25,0.75] 指代的是有0.25的概率属于第一类有0.75的概率属于第二类因此理论输出结果是把该文本分为第二类。 核心逻辑 pre_deal.py import csv import random from datasets import load_datasetdef read_file(file_path):csv_reader csv.reader(open(file_path, encodingUTF-8))num 0data []for row in csv_reader:if num 0:num 1continuecomment_data [row[1], int(row[0])]if len(comment_data[0]) 500:textcomment_data[0]sub_texts, start, length [], 0, len(text)while start length:piecedata[text[start: start 500], comment_data[1]]data.append(piecedata)start 500else:data.append(comment_data)random.shuffle(data)return data对输入的csv文件进行处理其中我们默认csv文件的格式是[label,text]将用于训练的内容读取出来转化为numpy格式其中如果遇到有些文本过长超过模型的输入将其截断分为多个文本段来输入。在最后会通过shuffle函数进行打乱。 train.py train.py定义了几个函数用于训练。 首先是Bertmodel类定义了基于Bert的训练模型 class Bertmodel(nn.Module):def init(self, output_dim, model_path):super(Bertmodel, self).init()# 导入bert模型self.bert BertModel.from_pretrained(model_path)# 外接全连接层self.layer1 nn.Linear(768, output_dim)def forward(self, tokens):res self.bert(**tokens)res self.layer1(res[1])res res.softmax(dim1)return res该模型由Bert和一个全连接层组成最后经过softmax激活函数。 其次是一个评估函数用来计算模型结果的准确性 def evaluate(net, comments_data, labels_data, device, tokenizer):ans 0 # 输出结果i 0step 8 # 每轮一次读取多少条数据tot len(comments_data)while i tot:print(i)comments comments_data[i: min(i step, tot)]tokens_X tokenizer(comments, paddingTrue, truncationTrue, return_tensorspt).to(devicedevice)res net(tokens_X) # 获得到预测结果y torch.tensor(labels_data[i: min(i step, tot)]).reshape(-1).to(devicedevice)ans (res.argmax(axis1) y).sum()i stepreturn ans / tot 原理就是将文本转化为tokens输入给模型而后利用返回的结果计算准确性 下面展示了开始训练的主函数在训练的过程中进行后向传播储存checkpoints模型 def training(net, tokenizer, loss, optimizer, train_comments, train_labels, test_comments, test_labels,device, epochs):max_acc 0.5 # 初始化模型最大精度为0.5for epoch in tqdm(range(epochs)):step 8i, sum_loss 0, 0totlen(train_comments)while i tot:comments train_comments[i: min(i step, tot)]tokens_X tokenizer(comments, paddingTrue, truncationTrue, return_tensorspt).to(devicedevice)res net(tokens_X)y torch.tensor(train_labels[i: min(i step, len(train_comments))]).reshape(-1).to(devicedevice)optimizer.zero_grad() # 清空梯度l loss(res, y) # 计算损失l.backward() # 后向传播optimizer.step() # 更新梯度sum_loss l.detach() # 累加损失i steptrain_acc evaluate(net, train_comments, train_labels)test_acc evaluate(net, test_comments, test_labels)print(\n–epoch, epoch 1, \t–loss:, sum_loss / (len(train_comments) / 8), \t–train_acc:, train_acc,\t–test_acc, test_acc)# 保存模型参数并重设最大值if test_acc max_acc:# 更新历史最大精确度max_acc test_acc# 保存模型max_acc test_acctorch.save({epoch: epoch,state_dict: net.state_dict(),optimizer: optimizer.state_dict()}, model/checkpoint_net.pth)训练结果表示如下 –epoch 0 –train_acc: tensor(0.6525, devicecuda:1) –test_acc tensor(0.6572, devicecuda:1)0%| | 0/20 [00:00?, ?it/s]5%|▌ | 120 [01:4834:28, 108.88s/it]10%|█ | 220 [03:3832:43, 109.10s/it]15%|█▌ | 320 [05:2730:56, 109.20s/it]20%|██ | 420 [07:1529:02, 108.93s/it]25%|██▌ | 520 [09:0627:23, 109.58s/it]30%|███ | 620 [10:5525:29, 109.26s/it]35%|███▌ | 720 [12:4423:40, 109.28s/it]40%|████ | 820 [14:3321:51, 109.29s/it]45%|████▌ | 920 [16:2320:04, 109.49s/it]50%|█████ | 1020 [18:1318:15, 109.59s/it]55%|█████▌ | 1120 [20:0316:27, 109.72s/it]60%|██████ | 1220 [21:5214:35, 109.45s/it]65%|██████▌ | 1320 [23:4112:45, 109.35s/it]70%|███████ | 1420 [25:3010:54, 109.14s/it]75%|███████▌ | 1520 [27:1909:05, 109.03s/it]80%|████████ | 1620 [29:0707:15, 108.84s/it]85%|████████▌ | 1720 [30:5605:26, 108.86s/it]90%|█████████ | 1820 [32:4403:37, 108.75s/it]95%|█████████▌| 1920 [34:3301:48, 108.73s/it] 100%|██████████| 2020 [36:2200:00, 108.71s/it] 100%|██████████| 2020 [36:2200:00, 109.11s/it]–epoch 1 –loss: tensor(1.2426, devicecuda:1) –train_acc: tensor(0.6759, devicecuda:1) –test_acc tensor(0.6789, devicecuda:1)–epoch 2 –loss: tensor(1.0588, devicecuda:1) –train_acc: tensor(0.8800, devicecuda:1) –test_acc tensor(0.8708, devicecuda:1)–epoch 3 –loss: tensor(0.8543, devicecuda:1) –train_acc: tensor(0.8988, devicecuda:1) –test_acc tensor(0.8887, devicecuda:1)–epoch 4 –loss: tensor(0.8208, devicecuda:1) –train_acc: tensor(0.9111, devicecuda:1) –test_acc tensor(0.8990, devicecuda:1)–epoch 5 –loss: tensor(0.8024, devicecuda:1) –train_acc: tensor(0.9206, devicecuda:1) –test_acc tensor(0.9028, devicecuda:1)–epoch 6 –loss: tensor(0.7882, devicecuda:1) –train_acc: tensor(0.9227, devicecuda:1) –test_acc tensor(0.9024, devicecuda:1)–epoch 7 –loss: tensor(0.7749, devicecuda:1) –train_acc: tensor(0.9288, devicecuda:1) –test_acc tensor(0.9036, devicecuda:1)–epoch 8 –loss: tensor(0.7632, devicecuda:1) –train_acc: tensor(0.9352, devicecuda:1) –test_acc tensor(0.9061, devicecuda:1)–epoch 9 –loss: tensor(0.7524, devicecuda:1) –train_acc: tensor(0.9421, devicecuda:1) –test_acc tensor(0.9090, devicecuda:1)–epoch 10 –loss: tensor(0.7445, devicecuda:1) –train_acc: tensor(0.9443, devicecuda:1) –test_acc tensor(0.9103, devicecuda:1)–epoch 11 –loss: tensor(0.7397, devicecuda:1) –train_acc: tensor(0.9480, devicecuda:1) –test_acc tensor(0.9128, devicecuda:1)–epoch 12 –loss: tensor(0.7321, devicecuda:1) –train_acc: tensor(0.9505, devicecuda:1) –test_acc tensor(0.9123, devicecuda:1)–epoch 13 –loss: tensor(0.7272, devicecuda:1) –train_acc: tensor(0.9533, devicecuda:1) –test_acc tensor(0.9140, devicecuda:1)–epoch 14 –loss: tensor(0.7256, devicecuda:1) –train_acc: tensor(0.9532, devicecuda:1) –test_acc tensor(0.9111, devicecuda:1)–epoch 15 –loss: tensor(0.7186, devicecuda:1) –train_acc: tensor(0.9573, devicecuda:1) –test_acc tensor(0.9123, devicecuda:1)–epoch 16 –loss: tensor(0.7135, devicecuda:1) –train_acc: tensor(0.9592, devicecuda:1) –test_acc tensor(0.9136, devicecuda:1)–epoch 17 –loss: tensor(0.7103, devicecuda:1) –train_acc: tensor(0.9601, devicecuda:1) –test_acc tensor(0.9128, devicecuda:1)–epoch 18 –loss: tensor(0.7091, devicecuda:1) –train_acc: tensor(0.9590, devicecuda:1) –test_acc tensor(0.9086, devicecuda:1)–epoch 19 –loss: tensor(0.7084, devicecuda:1) –train_acc: tensor(0.9626, devicecuda:1) –test_acc tensor(0.9123, devicecuda:1)–epoch 20 –loss: tensor(0.7038, devicecuda:1) –train_acc: tensor(0.9628, devicecuda:1) –test_acc tensor(0.9107, devicecuda:1) 最终训练结果在训练集上达到了96.28%的准确率在测试集上达到了91.07%的准确率 test_demo.py 这个函数提供了一个调用我们储存的checkpoint模型来进行预测的方式将input转化为berttokens而后输入给模型返回输出结果。 input_text[这里环境很好风光美丽下次还会再来的。] Bert_model_path xxxx output_pathxxxx device torch.device(cpu) checkpoint torch.load(output_path,map_locationcpu)model Bertmodel(output_dim2,model_pathBert_model_path) model.load_state_dict(checkpoint,False)

print(model)

tokenizer BertTokenizer.from_pretrained(Bert_model_path,model_max_length512)tokens_X tokenizer(input_text, paddingTrue, truncationTrue, return_tensorspt).to(devicecpu) model.eval() outputmodel(tokens_X) print(output) out torch.unsqueeze(output.argmax(dim1), dim1) result out.numpy() print(result) if result[0][0]1:print(positive) else:print(negative) 实现方式演示效果 训练阶段 首先找到能够拿来训练的数据运行pre_deal.py进行预处理而后可以在main.py修改模型的相关参数运行main.py开始训练。 这个过程可能会收到硬件条件的影响推荐使用cuda进行训练。如果实在训练不了可以直接调用附件中对应的训练好的模型来进行预测。 测试阶段 运行test_demo.py测试输入文本的分类结果 输入 input_text[这里环境很好风光美丽下次还会再来的。]输出 tensor([[0.3191, 0.6809]], grad_fnSoftmaxBackward0) [[1]] positive得出这句话的情感分类是positive正面 ​​ 希望对你有帮助加油 若您认为本文内容有益请不吝赐予赞同并订阅以便持续接收有价值的信息。衷心感谢您的关注和支持