赞
踩
- import torch
- import torch.nn as nn
- from torch.utils.data import DataLoader
- from transformers import BertTokenizer, BertModel, AdamW, get_linear_schedule_with_warmup
- import numpy as np
-
- # 加载和预处理数据
- tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
-
- def encode_sentence(s):
- tokens = list(tokenizer.tokenize(s))
- tokens.append('[SEP]')
- return tokenizer.convert_tokens_to_ids(tokens)
-
- df['input_ids'] = df.text.apply(encode_sentence)
-
- # 定义模型
- class SentimentClassifier(nn.Module):
- def __init__(self, n_classes):
- super(SentimentClassifier, self).__init__()
- self.bert = BertModel.from_pretrained('bert-base-chinese')
- self.drop = nn.Dropout(p=0.3)
- self.out = nn.Linear(self.bert.config.hidden_size, n_classes)
-
- def forward(self, input_ids, attention_mask):
- _, pooled_output = self.bert(
- input_ids=input_ids,
- attention_mask=attention_mask
- )
- output = self.drop(pooled_output)
- return self.out(output)
-
- # 训练模型
- device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
- model = SentimentClassifier(len(df.label.unique()))
- model = model.to(device)
-
- EPOCHS = 10
- optimizer = AdamW(model.parameters(), lr=2e-5, correct_bias=False)
- total_steps = len(DataLoader) * EPOCHS
-
- scheduler = get_linear_schedule_with_warmup(
- optimizer,
- num_warmup_steps=0,
- num_training_steps=total_steps
- )
-
- loss_fn = nn.CrossEntropyLoss().to(device)
-
- def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples):
- model = model.train()
- losses = []
- correct_predictions = 0
- for d in data_loader:
- input_ids = d["input_ids"].to(device)
- attention_mask = d["attention_mask"].to(device)
- targets = d["targets"].to(device)
- outputs = model(input_ids=input_ids, attention_mask=attention_mask)
- _, preds = torch.max(outputs, dim=1)
- loss = loss_fn(outputs, targets)
- correct_predictions += torch.sum(preds == targets)
- losses.append(loss.item())
- loss.backward()
- nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
- optimizer.step()
- scheduler.step()
- optimizer.zero_grad()
- return correct_predictions.double() / n_examples, np.mean(losses)
-
- # 评估模型
- def eval_model(model, data_loader, loss_fn, device, n_examples):
- model = model.eval()
- losses = []
- correct_predictions = 0
- with torch.no_grad():
- for d in data_loader:
- input_ids = d["input_ids"].to(device)
- attention_mask = d["attention_mask"].to(device)
- targets = d["targets"].to(device)
- outputs = model(input_ids=input_ids, attention_mask=attention_mask)
- _, preds = torch.max(outputs, dim=1)
- loss = loss_fn(outputs, targets)
- correct_predictions += torch.sum(preds == targets)
- losses.append(loss.item())
- return correct_predictions.double() / n_examples, np.mean(losses)
-
- # 运行训练和评估
- for epoch in range(EPOCHS):
- print('Epoch {}/{}'.format(epoch + 1, EPOCHS))
- print('-' * 10)
- train_acc, train_loss = train_epoch(
- model,
- train_data_loader,
- loss_fn,
- optimizer,
- device,
- scheduler,
- len(df_train)
- )
- print('Train loss {} accuracy {}'.format(train_loss, train_acc))
- val_acc, val_loss = eval_model(
- model,
- val_data_loader,
- loss_fn,
- device,
- len(df_val)
- )
- print('Val loss {} accuracy {}'.format(val_loss, val_acc))
- print()
-
- # 保存和加载模型
- def save_model(model, path):
- torch.save(model.state_dict(), path)
-
- def load_model(path):
- model = SentimentClassifier(len(df.label.unique()))
- model.load_state_dict(torch.load(path))
- return model
-
- save_model(model, "model_weights.pth")
- model = load_model("model_weights.pth")
这段代码主要是用BERT模型进行中文情感分类任务,使用了PyTorch和Hugging Face的Transformers库。
一、加载所需的库
二、加载数据
首先,使用pandas的read_csv函数读取CSV数据集。然后,使用dropna函数删除所有文本字段为空的行。
三、预处理和编码数据
这段代码主要是用BERT模型进行中文情感分类任务,使用了PyTorch和Hugging Face的Transformers库。
一、加载所需的库
二、加载数据
首先,使用pandas的read_csv函数读取CSV数据集。然后,使用dropna函数删除所有文本字段为空的行。
三、预处理和编码数据
四、划分数据集
使用train_test_split函数将数据集划分为训练集和验证集。
五、定义PyTorch Dataset
六、创建DataLoader
使用PyTorch的DataLoader类创建训练集和验证集的DataLoader,设置batch_size和shuffle。
七、定义模型
定义一个SentimentClassifier类,该模型基于BERT模型进行情感分类。其中,BERT模型部分用于提取文本特征,然后通过一个线性层进行分类。在这个类中,需要实现forward方法,用于前向传播。
八、定义训练和验证函数
九、训练模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。