请给我用Python写一段,使用GPT2进行文本分类的非常详细的代码
时间: 2024-02-13 21:01:51 浏览: 227
文本分类的python代码
好的,下面是使用GPT2进行文本分类的Python代码,具体解释见注释:
```python
import torch
from transformers import GPT2Tokenizer, GPT2Model
from torch.utils.data import Dataset, DataLoader
# 定义分类任务数据集
class MyDataset(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]
# 将文本转换成token
inputs = self.tokenizer(text, add_special_tokens=True, max_length=self.max_len, padding='max_length', truncation=True, return_tensors='pt')
inputs['labels'] = torch.tensor(label)
return inputs
# 加载GPT2模型和分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2Model.from_pretrained('gpt2')
# 定义分类任务数据
texts = ['I love playing football.', 'I hate studying.', 'I enjoy watching movies.']
labels = [1, 0, 1]
# 定义分类任务数据集
dataset = MyDataset(texts, labels, tokenizer, max_len=20)
# 定义分类任务数据加载器
loader = DataLoader(dataset, batch_size=2)
# 定义分类任务训练函数
def train():
model.train()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
criterion = torch.nn.CrossEntropyLoss()
for batch in loader:
optimizer.zero_grad()
inputs = {k: v.reshape(-1, v.size(-1)) for k, v in batch.items()}
outputs = model(**inputs)
logits = outputs.last_hidden_state[:, -1, :] # 取最后一个token的输出作为分类结果
labels = inputs['labels'].reshape(-1)
loss = criterion(logits, labels)
loss.backward()
optimizer.step()
# 进行分类任务训练
for i in range(10):
train()
```
该代码使用GPT2模型进行文本分类,首先定义了一个分类任务数据集`MyDataset`,其中将文本转换成token,再将token和标签打包成一个输入。
然后加载GPT2模型和分词器,定义了分类任务数据和数据集,再定义了分类任务数据加载器,将数据分批次加载。最后定义了分类任务训练函数,使用Adam优化器和交叉熵损失函数进行训练。
最后通过多次训练,得到分类任务的结果。
阅读全文