Construindo um modelo RNN para texto
Como analista de dados na PyBooks, você frequentemente lida com conjuntos de dados que contêm informações sequenciais, como interações de clientes, séries temporais ou documentos de texto. RNNs conseguem analisar e extrair insights desse tipo de dado com eficiência. Neste exercício, você vai explorar o conjunto de dados Newsgroup, que já foi processado e codificado para você. Esse conjunto inclui artigos de diferentes categorias. Sua tarefa é aplicar uma RNN para classificar esses artigos em três categorias:
rec.autos, sci.med e comp.graphics.
Os seguintes itens já foram carregados: torch, nn, optim.
Além disso, os parâmetros input_size, hidden_size (32), num_layers (2) e num_classes já estão pré-carregados para você.
Este e os próximos exercícios usam o conjunto de dados fetch_20newsgroups do sklearn.
Este exercício faz parte do curso
Deep Learning para Texto com PyTorch
Instruções do exercício
- Complete a classe RNN com uma camada RNN e uma camada Linear totalmente conectada.
- Inicialize o modelo.
- Treine o modelo RNN por dez épocas zerando os gradientes.
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
# Complete the RNN class
class RNNModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, num_classes):
super(RNNModel, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.rnn = ____.____(input_size, hidden_size, num_layers, batch_first=True)
self.fc = ____.____(hidden_size, num_classes)
def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)
out, _ = self.rnn(x, h0)
out = out[:, -1, :]
out = self.fc(out)
return out
# Initialize the model
rnn_model = ____(input_size, hidden_size, num_layers, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(rnn_model.parameters(), lr=0.01)
# Train the model for ten epochs and zero the gradients
for epoch in ____:
optimizer.____()
outputs = ____(X_train_seq)
loss = criterion(outputs, y_train_seq)
loss.backward()
optimizer.step()
print(f'Epoch: {epoch+1}, Loss: {loss.item()}')