Функция PyTorch torch.nn.InstanceNorm2d
Справочное руководство PyTorch torch.nn
torch.nn.InstanceNorm2dЭто модуль нормализации по экземплярам в PyTorch.
Он нормализует каждый канал каждого образца независимо; обычно используется при переносе стиля.
Определение функции
torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
Parameters
num_features: количество каналовaffine: использовать ли обучаемые параметры
Примеры использования
Пример 1: Базовое использование
Пример
import torch
import torch.nn as nn
inorm = nn.InstanceNorm2d(64)
# Ввод
x = torch.randn(4, 64, 16, 16)
output = inorm(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
import torch.nn as nn
inorm = nn.InstanceNorm2d(64)
# Ввод
x = torch.randn(4, 64, 16, 16)
output = inorm(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
Пример 2: Перенос стиля
Пример
import torch
import torch.nn as nn
# В сетях переноса стиля обычно используется InstanceNorm
class StyleNet(nn.Module):
def __init__(self):
super(StyleNet, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.in1 = nn.InstanceNorm2d(32)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.in2 = nn.InstanceNorm2d(64)
def forward(self, x):
x = self.conv1(x)
x = self.in1(x)
x = torch.relu(x)
x = self.conv2(x)
x = self.in2(x)
return x
net = StyleNet()
x = torch.randn(1, 3, 256, 256)
output = net(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
import torch.nn as nn
# В сетях переноса стиля обычно используется InstanceNorm
class StyleNet(nn.Module):
def __init__(self):
super(StyleNet, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.in1 = nn.InstanceNorm2d(32)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.in2 = nn.InstanceNorm2d(64)
def forward(self, x):
x = self.conv1(x)
x = self.in1(x)
x = torch.relu(x)
x = self.conv2(x)
x = self.in2(x)
return x
net = StyleNet()
x = torch.randn(1, 3, 256, 256)
output = net(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
Пример 3: Сравнение с BatchNorm
Пример
import torch
import torch.nn as nn
bn = nn.BatchNorm2d(32)
inorm = nn.InstanceNorm2d(32)
x = torch.randn(4, 32, 8, 8)
print("Среднее BatchNorm:", bn(x).mean(dim=(0, 2, 3))[:5].tolist())
print("Среднее значение InstanceNorm:", inorm(x).mean(dim=(0, 2, 3))[:5].tolist())
import torch.nn as nn
bn = nn.BatchNorm2d(32)
inorm = nn.InstanceNorm2d(32)
x = torch.randn(4, 32, 8, 8)
print("Среднее BatchNorm:", bn(x).mean(dim=(0, 2, 3))[:5].tolist())
print("Среднее значение InstanceNorm:", inorm(x).mean(dim=(0, 2, 3))[:5].tolist())
Сценарии использования
- Перенос стиля: NIN、AdaIN
- Синтез текстуры
- Малый батч: подходит для batch=1
Примечание: по умолчанию affine=False, не содержит обучаемых параметров.
Другие расширения