请用python写一个深度学习模型,用于预训练模型BERT微调分类模型
时间: 2024-02-07 11:03:31 浏览: 134
以下是一个使用PyTorch实现的BERT微调分类模型的示例:
```python
import torch
import torch.nn as nn
from transformers import BertModel
class BertClassifier(nn.Module):
def __init__(self, num_classes):
super(BertClassifier, self).__init__()
self.bert = BertModel.from_pretrained('bert-base-uncased')
self.dropout = nn.Dropout(0.1)
self.fc1 = nn.Linear(768, 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
pooled_output = self.dropout(pooled_output)
logits = self.fc1(pooled_output)
return logits
```
在这个模型中,我们使用了PyTorch的nn.Module类来定义一个包含BERT预训练模型的分类器。在__init__方法中,我们首先使用transformers库中的BertModel类从预训练的BERT模型中加载权重。然后,我们定义了一个dropout层和一个全连接层,将BERT的输出转换成我们需要的类别数。
在forward方法中,我们将输入的数据传递给BERT模型,然后使用pooler_output属性来获取BERT输出的池化表示。我们应用了一层dropout,然后将池化表示传递给全连接层,得到最终的分类结果。
最后,我们可以使用这个模型来微调BERT模型,以执行特定的文本分类任务。例如,我们可以使用以下代码来微调模型并进行预测:
```python
model = BertClassifier(num_classes=2)
optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)
criterion = nn.CrossEntropyLoss()
for epoch in range(num_epochs):
for batch in train_data_loader:
input_ids, attention_mask, labels = batch
optimizer.zero_grad()
outputs = model(input_ids, attention_mask)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# Evaluate the model
model.eval()
with torch.no_grad():
for batch in test_data_loader:
input_ids, attention_mask, labels = batch
outputs = model(input_ids, attention_mask)
_, predicted = torch.max(outputs, 1)
accuracy = (predicted == labels).sum().item() / len(labels)
print('Test accuracy:', accuracy)
```
阅读全文