Chapter 08
文本分类实例
Notebooktransformers23 cells
文本分类实例
Step1 导入相关包
In [ ]python · cell 3
python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from datasets import load_datasetStep2 加载数据集
In [ ]python · cell 5
python
dataset = load_dataset("csv", data_files="./ChnSentiCorp_htl_all.csv", split="train")
dataset = dataset.filter(lambda x: x["review"] is not None)
datasetStep3 划分数据集
In [ ]python · cell 7
python
datasets = dataset.train_test_split(test_size=0.1)
datasetsStep4 创建Dataloader
In [ ]python · cell 9
python
import torch
tokenizer = AutoTokenizer.from_pretrained("hfl/rbt3")
def process_function(examples):
tokenized_examples = tokenizer(examples["review"], max_length=128, truncation=True)
tokenized_examples["labels"] = examples["label"]
return tokenized_examples
tokenized_datasets = datasets.map(process_function, batched=True, remove_columns=datasets["train"].column_names)
tokenized_datasetsIn [ ]python · cell 10
python
from torch.utils.data import DataLoader
from transformers import DataCollatorWithPadding
trainset, validset = tokenized_datasets["train"], tokenized_datasets["test"]
trainloader = DataLoader(trainset, batch_size=32, shuffle=True, collate_fn=DataCollatorWithPadding(tokenizer))
validloader = DataLoader(validset, batch_size=64, shuffle=False, collate_fn=DataCollatorWithPadding(tokenizer))Step5 创建模型及优化器
In [ ]python · cell 12
python
from torch.optim import Adam
model = AutoModelForSequenceClassification.from_pretrained("hfl/rbt3")
if torch.cuda.is_available():
model = model.cuda()In [ ]python · cell 13
python
optimizer = Adam(model.parameters(), lr=2e-5)Step6 训练与验证
In [ ]python · cell 15
python
import evaluate
clf_metrics = evaluate.combine(["accuracy", "f1"])In [ ]python · cell 16
python
def evaluate():
model.eval()
with torch.inference_mode():
for batch in validloader:
if torch.cuda.is_available():
batch = {k: v.cuda() for k, v in batch.items()}
output = model(**batch)
pred = torch.argmax(output.logits, dim=-1)
clf_metrics.add_batch(predictions=pred.long(), references=batch["labels"].long())
return clf_metrics.compute()
def train(epoch=3, log_step=100):
global_step = 0
for ep in range(epoch):
model.train()
for batch in trainloader:
if torch.cuda.is_available():
batch = {k: v.cuda() for k, v in batch.items()}
optimizer.zero_grad()
output = model(**batch)
output.loss.backward()
optimizer.step()
if global_step % log_step == 0:
print(f"ep: {ep}, global_step: {global_step}, loss: {output.loss.item()}")
global_step += 1
clf = evaluate()
print(f"ep: {ep}, {clf}")Step7 模型训练
In [ ]python · cell 18
python
train()Step8 模型预测
In [ ]python · cell 20
python
sen = "我觉得这家酒店不错,饭很好吃!"
id2_label = {0: "差评!", 1: "好评!"}
model.eval()
with torch.inference_mode():
inputs = tokenizer(sen, return_tensors="pt")
inputs = {k: v.cuda() for k, v in inputs.items()}
logits = model(**inputs).logits
pred = torch.argmax(logits, dim=-1)
print(f"输入:{sen}\n模型预测结果:{id2_label.get(pred.item())}")In [ ]python · cell 21
python
from transformers import pipeline
model.config.id2label = id2_label
pipe = pipeline("text-classification", model=model, tokenizer=tokenizer, device=0)In [ ]python · cell 22
python
pipe(sen)In [ ]python · cell 23
python
