【笔记】BatchNorm 、LayerNorm 、InstanceNorm的区别:对 mini-batch 内的每个通道进行归一化;对每个样本的所有通道进行归一化;对每个样本的每个通道独立进行归一化

我现在建立一个张量 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:对每个样本的每个通道独立进行归一化,计算的是每个样本的每个通道的均值和标准差。适合图像生成任务和风格迁移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的探索之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值