简介
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()
关键步骤解析
- 文本分词:使用
basic_english
分词器处理英文文本 - 词向量构建:通过
build_vocab_from_iterator
创建词汇表 - RNN结构:包含嵌入层、循环层和全连接层
- 动态序列处理:通过
text_lengths
参数实现变长序列输入