PyTorch torch.nn.GroupNorm Funktion
PyTorch torch.nn Referenzhandbuch
torch.nn.GroupNormEs ist das Gruppennormalisierungsmodul in PyTorch.
Es unterteilt Kanäle zur Normalisierung in Gruppen, ist nicht von der Batch-Größe abhängig und eignet sich für kleine Batches oder Sequenzen variabler Länge.
Funktionsdefinition
torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
Parameter:
num_groups: Anzahl der Gruppennum_channels: Anzahl der Kanäle, muss durch num_groups teilbar sein
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Beispiel
import torch
import torch.nn as nn
# GroupNorm: 4 Gruppen, 32 Kanäle
gn = nn.GroupNorm(num_groups=4, num_channels=32)
# Eingabe: (batch, channels, height, width)
x = torch.randn(8, 32, 16, 16)
output = gn(x)
print("Eingabeform:", x.shape)
print("Ausgabeform:", output.shape)
import torch.nn as nn
# GroupNorm: 4 Gruppen, 32 Kanäle
gn = nn.GroupNorm(num_groups=4, num_channels=32)
# Eingabe: (batch, channels, height, width)
x = torch.randn(8, 32, 16, 16)
output = gn(x)
print("Eingabeform:", x.shape)
print("Ausgabeform:", output.shape)
Beispiel 2: Sonderfall - InstanceNorm
Beispiel
import torch
import torch.nn as nn
# InstanceNorm ist ein Sonderfall, bei dem num_groups=num_channels
inorm = nn.InstanceNorm2d(32)
# Entspricht 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 ist ein Sonderfall, bei dem num_groups=num_channels
inorm = nn.InstanceNorm2d(32)
# Entspricht 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())
Beispiel 3: GroupNorm in ResNet
Beispiel
import torch
import torch.nn as nn
# ResNet-Struktur verwendet 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("Eingabe:", x.shape, "-> Ausgabe:", output.shape)
import torch.nn as nn
# ResNet-Struktur verwendet 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("Eingabe:", x.shape, "-> Ausgabe:", output.shape)
Beispiel 4: Auswirkung unterschiedlicher num_groups
Beispiel
import torch
import torch.nn as nn
# 32 Kanäle, mit unterschiedlichen Anzahlen von Gruppen
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"Gruppen={num_groups}, Ausgabemittelwert: {out.mean().item():.4f}")
import torch.nn as nn
# 32 Kanäle, mit unterschiedlichen Anzahlen von Gruppen
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"Gruppen={num_groups}, Ausgabemittelwert: {out.mean().item():.4f}")
Anwendungsfälle
- Kleiner Batch: funktioniert weiterhin, wenn batch=1
- Video/3D: BatchNorm ist instabil
- MobileNet: GroupNorm ersetzt BatchNorm
Hinweis: num_channels muss durch num_groups teilbar sein.
Weitere Erweiterungen