返回

从零开始用 PyTorch 自定义一个文本分类器,打造自己的 NLP 模型

人工智能

引言

文本分类是自然语言处理 (NLP) 的一项基本任务,它涉及将文本数据分配到预定义的类别中。它在各种应用中都至关重要,例如垃圾邮件检测、情绪分析和主题建模。

PyTorch 模型架构

我们使用 PyTorch 搭建一个简单但有效的文本分类器模型:

import torch
import torch.nn as nn
import torch.nn.functional as F

class TextClassifier(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
        super(TextClassifier, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)

    def forward(self, text):
        # 嵌入层
        embedded = self.embedding(text)

        # LSTM 层
        output, (hn, cn) = self.lstm(embedded)

        # 全连接层
        logits = self.fc(output[:, -1, :])

        # 返回对数几率
        return logits

训练模型

训练文本分类器涉及以下步骤:

  • 定义损失函数和优化器
  • 创建数据加载器
  • 迭代训练周期,进行前向传播、计算损失和更新权重

评估模型

评估模型的性能至关重要:

  • 计算准确率、召回率和 F1 分数
  • 使用验证集或测试集进行评估
  • 根据需要微调模型以提高性能

示例代码

为了进一步理解,这里提供一个 PyTorch 文本分类器的示例代码段:

import torch
from torchtext.datasets import IMDB

# 加载 IMDB 数据集
train_data, test_data = IMDB.splits(root='.data')

# 创建文本分类器模型
model = TextClassifier(vocab_size=10000, embedding_dim=300, hidden_dim=256, output_dim=2)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(10):
    # 训练周期
    for batch in train_data:
        # 前向传播
        logits = model(batch.text)

        # 计算损失
        loss = criterion(logits, batch.label)

        # 反向传播
        loss.backward()

        # 更新权重
        optimizer.step()

    # 验证模型
    accuracy = evaluate(model, test_data)
    print(f"Epoch {epoch}: Accuracy = {accuracy}")

结论

通过本文,你已经了解了如何使用 PyTorch 从零开始构建和训练文本分类器。通过自定义你的模型,你可以深入探索 NLP 领域,并根据你的特定需求和应用程序调整模型。