当前位置:   article > 正文

训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类_bert接下游任务参与训练

bert接下游任务参与训练

基础介绍:

Bert模型是一个通用backbone,可以简单理解为一个句子的特征提取工具

更直观来看:我们的自然语言是用各种文字表示的,经过编码器,以及特征提取就可以变为计算机能理解的语言了

下游任务:

提取特征后,我们便可以自定义其他自然语言处理任务了,以下是一个简单的示例(效果可能不好,但算是一个基本流程)

数据格式:

模型训练:

我们来训练处理句子情感分类的模型,代码如下

  1. import torch
  2. from tqdm import tqdm # 进度条库
  3. from transformers import AdamW # 优化器
  4. import pandas as pd # 文件读取
  5. from transformers import BertTokenizer, BertModel # 导入分词器和模型
  6. # 导入数据
  7. data = pd.read_csv("data/data.csv")
  8. # 定义编码器
  9. token = BertTokenizer.from_pretrained("bert-base-chinese")
  10. # 加载预训练模型
  11. pretrained = BertModel.from_pretrained("bert-base-chinese")
  12. # 创建编码集
  13. encode = []
  14. # 编码句子
  15. for i in tqdm(data["sentence"]):
  16. out = token.batch_encode_plus(
  17. batch_text_or_text_pairs=[i],
  18. truncation=True,
  19. padding='max_length',
  20. max_length=17,
  21. return_tensors='pt',
  22. return_length=True
  23. )
  24. encode.append(out)
  25. # 定义模型
  26. class MODEL(torch.nn.Module):
  27. def __init__(self):
  28. super().__init__() # 确保调用父类构造函数
  29. self.linear1 = torch.nn.Linear(768, 2)
  30. def forward(self, input_ids, attention_mask, token_type_ids):
  31. result = pretrained(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
  32. result = self.linear1(result.last_hidden_state[:, 0])
  33. result = result.softmax(dim=1)
  34. return result
  35. # 创建模型对象
  36. model = MODEL()
  37. # 定义优化器
  38. optimizer = AdamW(model.parameters(), lr=5e-4)
  39. # 定义损失函数
  40. criterion = torch.nn.CrossEntropyLoss()
  41. # 模型训练
  42. for i in range(len(encode)):
  43. out = model(encode[i]["input_ids"], encode[i]["attention_mask"], encode[i]["token_type_ids"])
  44. loss = criterion(out, torch.LongTensor([data["label"][i]]))
  45. loss.backward()
  46. optimizer.step()
  47. optimizer.zero_grad()
  48. # 模型权重保存
  49. torch.save(model.state_dict(), 'model1_weights.pth')

运行后得到了训练后的模型权重文件

模型使用:

可用以下代码进行判断句子情感

  1. import torch
  2. from transformers import BertTokenizer, BertModel
  3. token = BertTokenizer.from_pretrained('bert-base-chinese')
  4. pretrained = BertModel.from_pretrained('bert-base-chinese')
  5. # 定义模型
  6. class Model(torch.nn.Module):
  7. def __init__(self):
  8. super().__init__()
  9. self.fc = torch.nn.Linear(768, 2)
  10. def forward(self, input_ids, attention_mask, token_type_ids):
  11. out = pretrained(
  12. input_ids=input_ids,
  13. attention_mask=attention_mask,
  14. token_type_ids=token_type_ids
  15. )
  16. out = self.fc(out.last_hidden_state[:, 0])
  17. out = out.softmax(dim=1)
  18. return out
  19. model = Model()
  20. # 加载训练好的模型权重
  21. model.load_state_dict(torch.load('model1_weights.pth'))
  22. sentence = ["衣服一点也不好,差评"]
  23. # 编码
  24. o = token.batch_encode_plus(
  25. batch_text_or_text_pairs=sentence,
  26. truncation=True,
  27. padding='max_length',
  28. max_length=17,
  29. return_tensors='pt'
  30. )
  31. out = model(o['input_ids'], o['attention_mask'], o['token_type_ids'])
  32. if out[0][0] > out[0][1]:
  33. print("好评")
  34. else:
  35. print("差评")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/356536
推荐阅读
相关标签
  

闽ICP备14008679号