Fonction torch.nn.GRU de PyTorch
Manuel de référence torch.nn de PyTorch
torch.nn.GRUEst le module Gated Recurrent Unit dans PyTorch.
GRU est une version simplifiée de LSTM, avec moins de paramètres, un calcul plus rapide et des performances similaires.
Définition de fonction
torch.nn.GRU(input_size, hidden_size, num_layers=1, bias=True, batch_first=True, dropout=0, bidirectional=False)
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
import torch.nn as nn
# GRU : entrée de dimension 256, caché de dimension 256, 2 couches
gru = nn.GRU(input_size=256, hidden_size=256, num_layers=2, batch_first=True)
# Entrée : batch=4, séquence=10, caractéristiques=256
x = torch.randn(4, 10, 256)
output, hidden = gru(x)
print("Forme d'entrée :", x.shape)
print("Forme de sortie :", output.shape)
print("Forme de l'état caché :", hidden.shape)
import torch.nn as nn
# GRU : entrée de dimension 256, caché de dimension 256, 2 couches
gru = nn.GRU(input_size=256, hidden_size=256, num_layers=2, batch_first=True)
# Entrée : batch=4, séquence=10, caractéristiques=256
x = torch.randn(4, 10, 256)
output, hidden = gru(x)
print("Forme d'entrée :", x.shape)
print("Forme de sortie :", output.shape)
print("Forme de l'état caché :", hidden.shape)
Exemple 2 : Comparaison avec LSTM
Exemple
import torch
import torch.nn as nn
import time
# LSTM et GRU avec la même configuration
lstm = nn.LSTM(256, 256, 1, batch_first=True)
gru = nn.GRU(256, 256, 1, batch_first=True)
x = torch.randn(32, 100, 256)
# Comparaison des performances
for model, name in [(lstm, "LSTM"), (gru, "GRU")]:
start = time.time()
for _ in range(100):
_ = model(x)
print(f"{name} Temps : {time.time()-start:.3f}s")
import torch.nn as nn
import time
# LSTM et GRU avec la même configuration
lstm = nn.LSTM(256, 256, 1, batch_first=True)
gru = nn.GRU(256, 256, 1, batch_first=True)
x = torch.randn(32, 100, 256)
# Comparaison des performances
for model, name in [(lstm, "LSTM"), (gru, "GRU")]:
start = time.time()
for _ in range(100):
_ = model(x)
print(f"{name} Temps : {time.time()-start:.3f}s")
Exemple 3 : Tâche de classification
Exemple
import torch
import torch.nn as nn
class GRUClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
super(GRUClassifier, self).__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True, bidirectional=True)
self.fc = nn.Linear(hidden_dim * 2, num_classes)
def forward(self, x):
embedded = self.embedding(x)
_, hidden = self.gru(embedded)
# Concaténer les états cachés finaux du bidirectionnel
hidden = torch.cat([hidden[-2], hidden[-1]], dim=1)
return self.fc(hidden)
model = GRUClassifier(10000, 128, 128, 2)
x = torch.randint(0, 10000, (8, 50))
output = model(x)
print("Entrée :", x.shape, "-> Sortie :", output.shape)
import torch.nn as nn
class GRUClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
super(GRUClassifier, self).__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True, bidirectional=True)
self.fc = nn.Linear(hidden_dim * 2, num_classes)
def forward(self, x):
embedded = self.embedding(x)
_, hidden = self.gru(embedded)
# Concaténer les états cachés finaux du bidirectionnel
hidden = torch.cat([hidden[-2], hidden[-1]], dim=1)
return self.fc(hidden)
model = GRUClassifier(10000, 128, 128, 2)
x = torch.randint(0, 10000, (8, 50))
output = model(x)
print("Entrée :", x.shape, "-> Sortie :", output.shape)
LSTM vs GRU
| Aspect | LSTM | GRU |
|---|---|---|
| Nombre de paramètres | Plus | Moins |
| Portes | 3 portes | 2 portes |
| Calcul | Plus lent | Plus rapide |
Cas d'utilisation
- Modélisation de séquences: Texte, audio
- Prototypage rapide: lorsque les ressources sont limitées
- Traduction automatique: côté encodeur
Autres extensions