Fonction torch.nn.InstanceNorm2d de PyTorch
Manuel de référence torch.nn de PyTorch
torch.nn.InstanceNorm2dIl s'agit du module de normalisation d'instance dans PyTorch.
Il normalise chaque canal de chaque échantillon indépendamment, couramment utilisé dans le transfert de style.
Définition de fonction
torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
Parameters
num_features: nombre de canauxaffine: indique si des paramètres apprenables sont utilisés
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
import torch.nn as nn
inorm = nn.InstanceNorm2d(64)
# Entrée
x = torch.randn(4, 64, 16, 16)
output = inorm(x)
print("Entrée :", x.shape, "-> Sortie :", output.shape)
import torch.nn as nn
inorm = nn.InstanceNorm2d(64)
# Entrée
x = torch.randn(4, 64, 16, 16)
output = inorm(x)
print("Entrée :", x.shape, "-> Sortie :", output.shape)
Exemple 2 : Transfert de style
Exemple
import torch
import torch.nn as nn
# Les réseaux de transfert de style utilisent couramment 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("Entrée :", x.shape, "-> Sortie :", output.shape)
import torch.nn as nn
# Les réseaux de transfert de style utilisent couramment 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("Entrée :", x.shape, "-> Sortie :", output.shape)
Exemple 3 : Comparaison avec BatchNorm
Exemple
import torch
import torch.nn as nn
bn = nn.BatchNorm2d(32)
inorm = nn.InstanceNorm2d(32)
x = torch.randn(4, 32, 8, 8)
print("Moyenne BatchNorm :", bn(x).mean(dim=(0, 2, 3))[:5].tolist())
print("InstanceNorm moyenne :", 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("Moyenne BatchNorm :", bn(x).mean(dim=(0, 2, 3))[:5].tolist())
print("InstanceNorm moyenne :", inorm(x).mean(dim=(0, 2, 3))[:5].tolist())
Cas d'utilisation
- Transfert de style: NIN、AdaIN
- Synthèse de texture
- Petit lot: convient pour batch=1
Remarque : par défaut affine=False, ne contient aucun paramètre apprenable.
Autres extensions