Fonction torch.nn.GroupNorm de PyTorch

PyTorch torch.nn 参考手册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 groupes
  • num_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)

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())

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)

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}")

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.


PyTorch torch.nn 参考手册Manuel de référence torch.nn de PyTorch

Autres extensions