简介

RNN(循环神经网络)是处理序列数据的经典模型,在文本分类任务中表现优异。以下是一个使用Python实现的简单案例,包含数据预处理、模型构建和训练流程。

代码框架

import torch
from torch import nn
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator

# 数据预处理
tokenizer = get_tokenizer('basic_english')
vocab = build_vocab_from_iterator([tokenizer(text) for text in train_data])
vocab.set_default_index(unk_token)

# 模型定义
class TextClassifier(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.rnn = nn.RNN(embedding_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, num_classes)
    
    def forward(self, text, text_lengths):
        embedded = self.embedding(text)
        out, hidden = self.rnn(embedded, text_lengths=text_lengths)
        return self.fc(out[:, -1, :])  # 使用最后一个时间步的输出

# 训练流程
model = TextClassifier(vocab_size=len(vocab), embedding_dim=100, hidden_dim=128, num_classes=2)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练循环
for epoch in range(10):
    model.train()
    outputs = model(text_batch, text_lengths)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

关键步骤解析

  1. 文本分词:使用basic_english分词器处理英文文本
  2. 词向量构建:通过build_vocab_from_iterator创建词汇表
  3. RNN结构:包含嵌入层、循环层和全连接层
  4. 动态序列处理:通过text_lengths参数实现变长序列输入
RNN Structure

扩展学习

Text Classification Steps