0
respostas

[Projeto] exemplo de classificação com GRU de 2 camadas

output = self.linear(hidden[-1])

import torch
import torch.nn as nn

--------------------------------------------------

Configuração do dispositivo

--------------------------------------------------

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

--------------------------------------------------

Classe da rede

Exemplo: classificação de sequências com Embedding + GRU

--------------------------------------------------

class GRUClassifier(nn.Module):
def init(self, vocab_size, tam_embedding, hidden_size, num_classes):
super(GRUClassifier, self).init()

    # Salva tamanho do estado oculto
    self.hidden_size = hidden_size

    # Camada de embedding
    # Converte índices de tokens em vetores densos
    self.embedding = nn.Embedding(vocab_size, tam_embedding)

    # GRU com 2 camadas
    # input_size = tam_embedding
    # hidden_size = hidden_size
    # num_layers = 2
    self.rnn = nn.GRU(
        input_size=tam_embedding,
        hidden_size=hidden_size,
        num_layers=2
    )

    # Camada linear final para classificação
    self.linear = nn.Linear(hidden_size, num_classes)

def forward(self, X):
    """
    X: tensor de índices com shape (seq_len, batch_size)
    """

    # ------------------------------------------
    # 1) Embedding
    # Entrada:  (S, B)
    # Saída:    (S, B, E)
    # ------------------------------------------
    emb = self.embedding(X)

    # ------------------------------------------
    # 2) Inicialização do hidden state
    # Shape: (num_layers, batch_size, hidden_size)
    # Como temos 2 camadas:
    # hidden -> (2, B, H)
    # ------------------------------------------
    hidden = torch.zeros(2, X.size(1), self.hidden_size).to(device)

    # ------------------------------------------
    # 3) Forward na GRU
    # saida  -> (S, B, H)
    # hidden -> (2, B, H)
    # ------------------------------------------
    saida, hidden = self.rnn(emb, hidden)

    # ------------------------------------------
    # 4) Pegar a memória da ÚLTIMA camada
    # hidden[-1] -> (B, H)
    # Isso é o que vai para a camada linear
    # ------------------------------------------
    output = self.linear(hidden[-1])

    return output

--------------------------------------------------

Exemplo de uso

--------------------------------------------------

if name == "main":
# Parâmetros do exemplo
vocab_size = 1000 # tamanho do vocabulário
tam_embedding = 50 # dimensão do embedding
hidden_size = 256 # tamanho da feature oculta
num_classes = 3 # número de classes
seq_len = 12 # tamanho da sequência
batch_size = 64 # tamanho do batch

# Instancia o modelo
model = GRUClassifier(
    vocab_size=vocab_size,
    tam_embedding=tam_embedding,
    hidden_size=hidden_size,
    num_classes=num_classes
).to(device)

# Exemplo de entrada:
# tensor de índices inteiros no formato (seq_len, batch_size)
X = torch.randint(0, vocab_size, (seq_len, batch_size)).to(device)

# Forward
y_pred = model(X)

# Mostra shapes importantes
print("Entrada X:", X.shape)              # (12, 64)
print("Saída final:", y_pred.shape)       # (64, 3)