我现在建立一个张量 input_tensor: (2,3,4,4)
import torch
input_tensor = torch.tensor([
[
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]],
[[17, 18, 19, 20], [21, 22, 23, 24], [25, 26, 27, 28], [29, 30, 31, 32]],
[[33, 34, 35, 36], [37, 38, 39, 40], [41, 42, 43, 44], [45, 46, 47, 48]]
],
[
[[49, 50, 51, 52], [53, 54, 55, 56], [57, 58, 59, 60], [61, 62, 63, 64]],
[[65, 66, 67, 68], [69, 70, 71, 72], [73, 74, 75, 76], [77, 78, 79, 80]],
[[81, 82, 83, 84], [85, 86, 87, 88], [89, 90, 91, 92], [93, 94, 95, 96]]
]
], dtype=torch.float32)
print("Input Tensor:\n", input_tensor)
BatchNorm:
# 计算每个通道的均值和标准差。
# 使用这些均值和标准差对整个 mini-batch 进行归一化。
# 通道1的均值和标准差
mu_c1 = (1+2+...+16 + 49+50+...+64) / 32
sigma_c1 = sqrt( [(1-mu_c1)^2 + (2-mu_c1)^2 + ... + (64-mu_c1)^2] / 32 )
# 归一化后的值
normalized_c1 = (input_tensor[:, 0, :, :] - mu_c1) / sigma_c1
Pytorch 实现:
import torch.nn as nn
# 创建 BatchNorm 层
batch_norm = nn.BatchNorm2d(num_features=3)
output = batch_norm(input_tensor)
print("BatchNorm Output:\n", output)
Layer Norm:
# 对每个样本的所有通道计算均值和标准差。
# 使用这些均值和标准差对该样本的所有通道进行归一化。
# 样本1的均值和标准差
mu_s1 = (1+2+...+16 + 17+18+...+32 + 33+34+...+48) / 48
sigma_s1 = sqrt( [(1-mu_s1)^2 + (2-mu_s1)^2 + ... + (48-mu_s1)^2] / 48 )
# 归一化后的值
normalized_s1 = (input_tensor[0, :, :, :] - mu_s1) / sigma_s1
Pytorch 实现:
layer_norm = nn.LayerNorm([3, 4, 4])
output = layer_norm(input_tensor)
print("LayerNorm Output:\n", output)
Instance Norm:
# 对每个样本的每个通道独立计算均值和标准差。
# 使用这些均值和标准差对每个通道独立进行归一化。
# 样本1通道1的均值和标准差
mu_s1_c1 = (1+2+...+16) / 16
sigma_s1_c1 = sqrt( [(1-mu_s1_c1)^2 + (2-mu_s1_c1)^2 + ... + (16-mu_s1_c1)^2] / 16 )
# 归一化后的值
normalized_s1_c1 = (input_tensor[0, 0, :, :] - mu_s1_c1) / sigma_s1_c1
Pytorch 实现:
instance_norm = nn.InstanceNorm2d(num_features=3)
output = instance_norm(input_tensor)
print("InstanceNorm Output:\n", output)
BatchNorm:对 mini-batch 内的每个通道进行归一化,计算的是整个 mini-batch 的每个通道的均值和标准差。适合卷积神经网络(CNN)。
LayerNorm:对每个样本的所有通道进行归一化,计算的是每个样本的所有通道的均值和标准差。适合循环神经网络(RNN)和 transformer。
InstanceNorm:对每个样本的每个通道独立进行归一化,计算的是每个样本的每个通道的均值和标准差。适合图像生成任务和风格迁移。