基础介绍:
Bert模型是一个通用backbone,可以简单理解为一个句子的特征提取工具
更直观来看:我们的自然语言是用各种文字表示的,经过编码器,以及特征提取就可以变为计算机能理解的语言了
下游任务:
提取特征后,我们便可以自定义其他自然语言处理任务了,以下是一个简单的示例(效果可能不好,但算是一个基本流程)
数据格式:
模型训练:
我们来训练处理句子情感分类的模型,代码如下
import torch from tqdm import tqdm # 进度条库 from transformers import AdamW # 优化器 import pandas as pd # 文件读取 from transformers import BertTokenizer, BertModel # 导入分词器和模型 # 导入数据 data = pd.read_csv("data/data.csv") # 定义编码器 token = BertTokenizer.from_pretrained("bert-base-chinese") # 加载预训练模型 pretrained = BertModel.from_pretrained("bert-base-chinese") # 创建编码集 encode = [] # 编码句子 for i in tqdm(data["sentence"]): out = token.batch_encode_plus( batch_text_or_text_pairs=[i], truncation=True, padding='max_length', max_length=17, return_tensors='pt', return_length=True ) encode.append(out) # 定义模型 class MODEL(torch.nn.Module): def __init__(self): super().__init__() # 确保调用父类构造函数 self.linear1 = torch.nn.Linear(768, 2) def forward(self, input_ids, attention_mask, token_type_ids): result = pretrained(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids) result = self.linear1(result.last_hidden_state[:, 0]) result = result.softmax(dim=1) return result # 创建模型对象 model = MODEL() # 定义优化器 optimizer = AdamW(model.parameters(), lr=5e-4) # 定义损失函数 criterion = torch.nn.CrossEntropyLoss() # 模型训练 for i in range(len(encode)): out = model(encode[i]["input_ids"], encode[i]["attention_mask"], encode[i]["token_type_ids"]) loss = criterion(out, torch.LongTensor([data["label"][i]])) loss.backward() optimizer.step() optimizer.zero_grad() # 模型权重保存 torch.save(model.state_dict(), 'model1_weights.pth')
运行后得到了训练后的模型权重文件
模型使用:
可用以下代码进行判断句子情感
import torch from transformers import BertTokenizer, BertModel token = BertTokenizer.from_pretrained('bert-base-chinese') pretrained = BertModel.from_pretrained('bert-base-chinese') # 定义模型 class Model(torch.nn.Module): def __init__(self): super().__init__() self.fc = torch.nn.Linear(768, 2) def forward(self, input_ids, attention_mask, token_type_ids): out = pretrained( input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids ) out = self.fc(out.last_hidden_state[:, 0]) out = out.softmax(dim=1) return out model = Model() # 加载训练好的模型权重 model.load_state_dict(torch.load('model1_weights.pth')) sentence = ["衣服一点也不好,差评"] # 编码 o = token.batch_encode_plus( batch_text_or_text_pairs=sentence, truncation=True, padding='max_length', max_length=17, return_tensors='pt' ) out = model(o['input_ids'], o['attention_mask'], o['token_type_ids']) if out[0][0] > out[0][1]: print("好评") else: print("差评")