Fonction torch.nn.ModuleList de PyTorch
Manuel de référence torch.nn de PyTorch
torch.nn.ModuleListC'est un conteneur dans PyTorch utilisé pour stocker une liste de modules.
Il est similaire à une liste Python, mais enregistre automatiquement tous les modules enfants.
Définition de fonction
torch.nn.ModuleList(modules=None)
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layers = nn.ModuleList([
nn.Linear(10, 20),
nn.Linear(20, 20),
nn.Linear(20, 5)
])
def forward(self, x):
for layer in self.layers:
x = couche(x)
return x
model = Net()
x = torch.randn(4, 10)
output = model(x)
print("Entrée :", x.shape)
print("Sortie :", output.shape)
print("Nombre de paramètres :", sum(p.numel() for p in model.parameters()))
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layers = nn.ModuleList([
nn.Linear(10, 20),
nn.Linear(20, 20),
nn.Linear(20, 5)
])
def forward(self, x):
for layer in self.layers:
x = couche(x)
return x
model = Net()
x = torch.randn(4, 10)
output = model(x)
print("Entrée :", x.shape)
print("Sortie :", output.shape)
print("Nombre de paramètres :", sum(p.numel() for p in model.parameters()))
Exemple 2 : Construction dynamique des couches
Exemple
import torch
import torch.nn as nn
class DynamicNet(nn.Module):
def __init__(self, num_layers, dim):
super(DynamicNet, self).__init__()
self.layers = nn.ModuleList()
for i in range(num_layers):
in_dim = dim if i == 0 else dim
self.layers.append(nn.Linear(in_dim, dim))
def forward(self, x):
for i, layer in enumerate(self.layers):
x = couche(x)
if i < len(self.layers) - 1:
x = torch.relu(x)
return x
model = DynamicNet(num_layers=5, dim=64)
print("Nombre de couches :", len(model.layers))
print("Nombre total de paramètres :", sum(p.numel() for p in model.parameters()))
import torch.nn as nn
class DynamicNet(nn.Module):
def __init__(self, num_layers, dim):
super(DynamicNet, self).__init__()
self.layers = nn.ModuleList()
for i in range(num_layers):
in_dim = dim if i == 0 else dim
self.layers.append(nn.Linear(in_dim, dim))
def forward(self, x):
for i, layer in enumerate(self.layers):
x = couche(x)
if i < len(self.layers) - 1:
x = torch.relu(x)
return x
model = DynamicNet(num_layers=5, dim=64)
print("Nombre de couches :", len(model.layers))
print("Nombre total de paramètres :", sum(p.numel() for p in model.parameters()))
Exemple 3 : Comparaison avec Sequential
Exemple
import torch
import torch.nn as nn
# ModuleList - Flexible
mlist = nn.ModuleList([nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5)])
# Sequential - Ordre fixe
seq = nn.Sequential(nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5))
print("Accès par index à ModuleList :", mlist[0])
print("Accès par index à Sequential :", seq[0])
print("nModuleList est itérable mais n'a pas de forward")
print("Sequential peut être appelé directement")
import torch.nn as nn
# ModuleList - Flexible
mlist = nn.ModuleList([nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5)])
# Sequential - Ordre fixe
seq = nn.Sequential(nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5))
print("Accès par index à ModuleList :", mlist[0])
print("Accès par index à Sequential :", seq[0])
print("nModuleList est itérable mais n'a pas de forward")
print("Sequential peut être appelé directement")
Cas d'utilisation
- Réseaux multicouches: construction dynamique
- Structures récurrentes: couches partagées
- Modèles complexes: nécessitent un flux de contrôle personnalisé
Remarque : vous devez utiliser nn.ModuleList au lieu d'une liste Python.
Autres extensions