Функция torch.nn.GroupNorm в PyTorch

PyTorch torch.nn 参考手册Справочное руководство 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)

Пример 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())

Пример 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)

Пример 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}")

Сценарии использования

  • Малый батч: всё ещё работает при batch=1
  • Видео/3D: BatchNorm нестабилен
  • MobileNet: GroupNorm заменяет BatchNorm

Примечание: num_channels должно делиться на num_groups.


PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn

Другие расширения