LoslegenKostenlos loslegen

Ein RNN-Modell mit Attention erstellen

Bei PyBooks untersucht das Team verschiedene Deep-Learning-Architekturen. Nach etwas Recherche entscheidest du dich, ein RNN mit Attention-Mechanismus zu implementieren, um das nächste Wort in einem Satz vorherzusagen. Du bekommst einen Datensatz mit Sätzen und ein daraus erzeugtes Vokabular.

Folgende Pakete wurden für dich importiert: torch, nn.

Folgendes wurde für dich vorab geladen:

  • vocab und vocab_size: das Vokabular und seine Größe
  • word_to_ix und ix_to_word: Wörterbuch für Wort-zu-Index- und Index-zu-Wort-Zuordnungen
  • input_data und target_data: in Eingabe-Ausgabe-Paare umgewandelter Datensatz
  • embedding_dim und hidden_dim: Dimensionen für Embedding und den versteckten Zustand des RNN

Du kannst die Variable data in der Konsole inspizieren, um die Beispielsätze zu sehen.

Diese Übung ist Teil des Kurses

Deep Learning für Text mit PyTorch

Kurs anzeigen

Anleitung zur Übung

  • Erstelle eine Embedding-Schicht für das Vokabular mit dem gegebenen embedding_dim.
  • Wende eine lineare Transformation auf die RNN-Sequenzausgabe an, um die Attention-Scores zu erhalten.
  • Erzeuge die Aufmerksamkeitsgewichte aus den Scores.
  • Berechne den Kontextvektor als gewichtete Summe der RNN-Ausgaben und der Aufmerksamkeitsgewichte.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

class RNNWithAttentionModel(nn.Module):
    def __init__(self):
        super(RNNWithAttentionModel, self).__init__()
        # Create an embedding layer for the vocabulary
        self.embeddings = nn.____(vocab_size, embedding_dim)
        self.rnn = nn.RNN(embedding_dim, hidden_dim, batch_first=True)
        # Apply a linear transformation to get the attention scores
        self.attention = nn.____(____, 1)
        self.fc = nn.____(hidden_dim, vocab_size)
    def forward(self, x):
        x = self.embeddings(x)
        out, _ = self.rnn(x)
        #  Get the attention weights
        attn_weights = torch.nn.functional.____(self.____(out).____(2), dim=1)
        # Compute the context vector 
        context = torch.sum(____.____(2) * out, dim=1)
        out = self.fc(context)
        return out
      
attention_model = RNNWithAttentionModel()
optimizer = torch.optim.Adam(attention_model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
print("Model Instantiated")
Code bearbeiten und ausführen