Функция torch.nn.GroupNorm в PyTorch
Справочное руководство PyTorch torch.nn
torch.nn.GroupNormЭто модуль групповой нормализации в PyTorch.
Он делит каналы на группы для нормализации, не зависит от размера пакета и подходит для небольших пакетов или последовательностей переменной длины.
Определение функции
torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
Параметры:
num_groups: Количество группnum_channels: Количество каналов, должно делиться на num_groups
Примеры использования
Пример 1: Базовое использование
Пример
import torch
import torch.nn as nn
# GroupNorm: 4 группы, 32 канала
gn = nn.GroupNorm(num_groups=4, num_channels=32)
# Вход: (batch, channels, height, width)
x = torch.randn(8, 32, 16, 16)
output = gn(x)
print("Форма входа:", x.shape)
print("Форма выхода:", output.shape)
import torch.nn as nn
# GroupNorm: 4 группы, 32 канала
gn = nn.GroupNorm(num_groups=4, num_channels=32)
# Вход: (batch, channels, height, width)
x = torch.randn(8, 32, 16, 16)
output = gn(x)
print("Форма входа:", x.shape)
print("Форма выхода:", output.shape)
Пример 2: Особый случай - InstanceNorm
Пример
import torch
import torch.nn as nn
# InstanceNorm — особый случай, когда num_groups=num_channels
inorm = nn.InstanceNorm2d(32)
# Эквивалентно 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 — особый случай, когда num_groups=num_channels
inorm = nn.InstanceNorm2d(32)
# Эквивалентно 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())
Пример 3: GroupNorm в ResNet
Пример
import torch
import torch.nn as nn
# Структура ResNet использует 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)))
блок = ConvBlock(64, 128)
x = torch.randn(2, 64, 32, 32)
выходной = блок(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
import torch.nn as nn
# Структура ResNet использует 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)))
блок = ConvBlock(64, 128)
x = torch.randn(2, 64, 32, 32)
выходной = блок(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
Пример 4: Влияние различных num_groups
Пример
import torch
import torch.nn as nn
# 32 канала, используя разное количество групп
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"groups={num_groups}, среднее значение выхода: {out.mean().item():.4f}")
import torch.nn as nn
# 32 канала, используя разное количество групп
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"groups={num_groups}, среднее значение выхода: {out.mean().item():.4f}")
Сценарии использования
- Малый батч: всё ещё работает при batch=1
- Видео/3D: BatchNorm нестабилен
- MobileNet: GroupNorm заменяет BatchNorm
Примечание: num_channels должно делиться на num_groups.
Другие расширения