Fonction torch.nn.GroupNorm de PyTorch
Manuel de référence torch.nn de PyTorch
torch.nn.GroupNormIl s'agit du module de normalisation de groupe dans PyTorch.
Il divise les canaux en groupes pour la normalisation, ne dépend pas de la taille du lot et convient aux petits lots ou aux séquences de longueur variable.
Définition de fonction
torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
Paramètres :
num_groups: Nombre de groupesnum_channels: Nombre de canaux, doit être divisible par num_groups
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
import torch.nn as nn
# GroupNorm: 4 groupes, 32 canaux
gn = nn.GroupNorm(num_groups=4, num_channels=32)
# Entrée: (batch, channels, height, width)
x = torch.randn(8, 32, 16, 16)
output = gn(x)
print("Forme d'entrée :", x.shape)
print("Forme de sortie :", output.shape)
import torch.nn as nn
# GroupNorm: 4 groupes, 32 canaux
gn = nn.GroupNorm(num_groups=4, num_channels=32)
# Entrée: (batch, channels, height, width)
x = torch.randn(8, 32, 16, 16)
output = gn(x)
print("Forme d'entrée :", x.shape)
print("Forme de sortie :", output.shape)
Exemple 2: Cas particulier - InstanceNorm
Exemple
import torch
import torch.nn as nn
# InstanceNorm est un cas particulier où num_groups=num_channels
inorm = nn.InstanceNorm2d(32)
# Équivalent à GroupNorm, num_groups=32, num_channels=32
gn_equiv = nn.GroupNorm(32, 32)
x = torch.randn(4, 32, 16, 16)
print("InstanceNorm2d:", inorm(x).mean().item())
print("GroupNorm:", gn_equiv(x).mean().item())
import torch.nn as nn
# InstanceNorm est un cas particulier où num_groups=num_channels
inorm = nn.InstanceNorm2d(32)
# Équivalent à GroupNorm, num_groups=32, num_channels=32
gn_equiv = nn.GroupNorm(32, 32)
x = torch.randn(4, 32, 16, 16)
print("InstanceNorm2d:", inorm(x).mean().item())
print("GroupNorm:", gn_equiv(x).mean().item())
Exemple 3 : GroupNorm dans ResNet
Exemple
import torch
import torch.nn as nn
# La structure ResNet utilise GroupNorm
class ConvBlock(nn.Module):
def __init__(self, in_ch, out_ch, num_groups=8):
super(ConvBlock, self).__init__()
self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=1)
self.gn = nn.GroupNorm(num_groups, out_ch)
self.relu = nn.ReLU()
def forward(self, x):
return self.relu(self.gn(self.conv(x)))
block = ConvBlock(64, 128)
x = torch.randn(2, 64, 32, 32)
output = block(x)
print("Entrée :", x.shape, "-> Sortie :", output.shape)
import torch.nn as nn
# La structure ResNet utilise GroupNorm
class ConvBlock(nn.Module):
def __init__(self, in_ch, out_ch, num_groups=8):
super(ConvBlock, self).__init__()
self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=1)
self.gn = nn.GroupNorm(num_groups, out_ch)
self.relu = nn.ReLU()
def forward(self, x):
return self.relu(self.gn(self.conv(x)))
block = ConvBlock(64, 128)
x = torch.randn(2, 64, 32, 32)
output = block(x)
print("Entrée :", x.shape, "-> Sortie :", output.shape)
Exemple 4 : Effet de différents num_groups
Exemple
import torch
import torch.nn as nn
# 32 canaux, en utilisant différents nombres de groupes
for num_groups in [1, 2, 4, 8, 32]:
gn = nn.GroupNorm(num_groups, 32)
x = torch.randn(4, 32, 8, 8)
out = gn(x)
print(f"groupes={num_groups}, moyenne de sortie: {out.mean().item():.4f}")
import torch.nn as nn
# 32 canaux, en utilisant différents nombres de groupes
for num_groups in [1, 2, 4, 8, 32]:
gn = nn.GroupNorm(num_groups, 32)
x = torch.randn(4, 32, 8, 8)
out = gn(x)
print(f"groupes={num_groups}, moyenne de sortie: {out.mean().item():.4f}")
Cas d'utilisation
- Petit lot: fonctionne toujours lorsque batch=1
- Vidéo/3D: BatchNorm est instable
- MobileNet: GroupNorm remplace BatchNorm
Remarque : num_channels doit être divisible par num_groups.
Autres extensions