Hugging Face是一个致力于开源自然语言处理(NLP)和机器学习项目的社区。它由几个关键组件组成:
使用PyTorch训练Transformer模型通常涉及以下步骤:
pip install torch
pip install transformers
pandas
库读取CSV文件。在这个代码示例中,我们首先定义了一个简单的Transformer文本分类模型,它使用了预训练的BERT模型作为编码器。然后,我们定义了一个数据集类,用于处理文本数据和标签。接着,我们创建了一个数据加载器,它将数据集分割为训练集和验证集。在训练循环中,我们使用优化器来更新模型参数,并使用学习率调度器来调整学习率。在评估循环中,我们计算模型的准确率。最后,我们将训练好的模型状态保存到文件中。
请注意,这只是一个简化的示例,实际代码可能会更复杂,具体取决于您选择的模型和配置。您还需要根据实际情况调整数据预处理和模型定义的步骤。此外,您可能需要根据您的硬件配置(如GPU可用性)来调整代码。
import torch
from torch import nn
from torch.optim import Adam
from torch.utils.data import DataLoader, Dataset
from transformers import BertTokenizer, BertModel, BertForSequenceClassification
# 定义Transformer模型
class TransformerTextClassifier(nn.Module):
def __init__(self, num_classes):
super(TransformerTextClassifier, self).__init__()
self.bert = BertModel.from_pretrained('bert-base-uncased')
self.classifier = nn.Linear(self.bert.config.hidden_size, num_classes)
def forward(self, input_ids, attention_mask):
outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
pooled_output = outputs.pooler_output
logits = self.classifier(pooled_output)
return logits
# 定义数据集
class TextDataset(Dataset):
def __init__(self, texts, labels, tokenizer, max_len):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = self.texts[idx]
label = self.labels[idx]
encoding = self.tokenizer.encode_plus(
text,
add_special_tokens=True,
max_length=self.max_len,
return_token_type_ids=False,
pad_to_max_length=True,
return_attention_mask=True,
return_tensors='pt',
)
return {
'input_ids': encoding['input_ids'],
'attention_mask': encoding['attention_mask'],
'label': torch.tensor(label, dtype=torch.long)
}
# 加载数据集
texts = ["这是一个测试文本。", "这是另一个测试文本。"]
labels = [0, 1]
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
max_len = 128
dataset = TextDataset(texts, labels, tokenizer, max_len)
dataloader = DataLoader(dataset, batch_size=16)
# 定义模型
num_classes = 2
model = TransformerTextClassifier(num_classes)
# 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=2e-5)
# 检查CUDA是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
# 训练模型
model.train()
for epoch in range(num_epochs):
for batch in dataloader:
optimizer.zero_grad()
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['label'].to(device)
outputs = model(input_ids, attention_mask)
loss = loss_fn(outputs, labels)
loss.backward()
optimizer.step()
# 评估模型
model.eval()
with torch.no_grad():
for batch in dataloader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['label'].to(device)
outputs = model(input_ids, attention_mask)
predictions = outputs.argmax(dim=1)
accuracy += (predictions == labels).sum().item()
print(f"Accuracy: {accuracy / len(dataset)}")
# 保存模型
torch.save(model.state_dict(), "model.pth")
在这个代码示例中,我们首先定义了一个简单的Transformer文本分类模型,它使用了预训练的BERT模型作为编码器。然后,我们定义了一个数据集类,用于处理文本数据和标签。接着,我们创建了一个数据加载器,它将数据集分割为训练集和验证集。在训练循环中,我们使用优化器来更新模型参数,并使用学习率调度器来调整学习率。在评估循环中,我们计算模型的准确率。最后,我们将训练好的模型状态保存到文件中。
提高Transformer模型准确率的方法有很多,以下是一些常见的策略:
以下是一个简单的预测代码实例,展示了如何使用Hugging Face的Transformers库进行文本分类模型的预测:
from transformers import BertTokenizer, BertForSequenceClassification
# 加载模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
# 假设您有一段新的文本摘要
new_text = "这是一个新的测试摘要。"
# 使用tokenizer对文本进行编码
encoded_input = tokenizer.encode_plus(
new_text,
add_special_tokens=True,
max_length=512,
return_token_type_ids=False,
pad_to_max_length=True,
return_attention_mask=True,
return_tensors='pt',
truncation=True
)
# 获取编码后的结果
input_ids = encoded_input['input_ids']
attention_mask = encoded_input['attention_mask']
# 设置模型为评估模式
model.eval()
# 预测
with torch.no_grad():
outputs = model(input_ids=input_ids, attention_mask=attention_mask)
# 获取预测结果
predicted_label = outputs.logits.argmax(dim=1).item()
# 打印预测结果
print(f"Predicted Label: {predicted_label}")
对于 加载模型和分词器,如果你已经拥有了自己的模型训练文件,把模型训练文件放在文件夹,填写文件夹路径即可。
如下使用GPU 开始预测:
import torch
from transformers import BertTokenizer, BertForSequenceClassification
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
# 设置模型路径和类别数量
model_path='D:/yolov8Project/transformer_txtclass/'
class_num=219
# 检查是否有可用的 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 加载模型和分词器
tokenizer = BertTokenizer.from_pretrained(model_path)
model = BertForSequenceClassification.from_pretrained(model_path, num_labels=class_num).to(device) # 将模型移到 GPU
def predict(new_text):
try:
# 使用tokenizer对文本进行编码
encoded_input = tokenizer.encode_plus(
new_text,
add_special_tokens=True,
max_length=512,
return_token_type_ids=False,
pad_to_max_length=True,
return_attention_mask=True,
return_tensors='pt',
truncation=True
)
# 获取编码后的结果,并将它们移到 GPU
input_ids = encoded_input['input_ids'].to(device)
attention_mask = encoded_input['attention_mask'].to(device)
# 设置模型为评估模式
model.eval()
# 预测
with torch.no_grad():
outputs = model(input_ids=input_ids, attention_mask=attention_mask)
# 获取预测结果
predicted_label = outputs.logits.argmax(dim=1).item()
# 打印预测结果
print(f"Predicted Label: {predicted_label}")
return predicted_label
except Exception as e:
predicted_label='error'
return predicted_label
data2 = pd.read_csv('comb.csv', encoding='gbk')
# 在 DataFrame 上应用 predict 函数,并将结果存储在 'label' 列
data2['label'] = data2['Abstract'].apply(predict)
# print(data2)
data2.to_csv('comb-result.csv', index=False, encoding='gbk')
print('预测完毕,结束!')