基础介绍:
Bert模型是一个通用backbone,可以简单理解为一个句子的特征提取工具
更直观来看:我们的自然语言是用各种文字表示的,经过编码器,以及特征提取就可以变为计算机能理解的语言了
下游任务:
提取特征后,我们便可以自定义其他自然语言处理任务了,以下是一个简单的示例(效果可能不好,但算是一个基本流程)
数据格式:
模型训练:
我们来训练处理句子情感分类的模型,代码如下
代码语言:javascript复制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')
运行后得到了训练后的模型权重文件
模型使用:
可用以下代码进行判断句子情感
代码语言:javascript复制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("差评")