【深度学习】四种归一化方式对比:| LayerNorm,BatchNorm,InstanceNorm,GroupNorm

文章目录

  • [1 四种归一化方式对比](#1 四种归一化方式对比)
  • [2 代码实践](#2 代码实践)
    • [2.1 BatchNorm(批归一化)](#2.1 BatchNorm(批归一化))
    • [2.2 LayerNorm(层归一化)](#2.2 LayerNorm(层归一化))
    • [2.3 InstanceNorm(实例归一化)](#2.3 InstanceNorm(实例归一化))
    • [2.4 GroupNorm(组归一化)](#2.4 GroupNorm(组归一化))

归一化技术可以很好地,缓解梯度消失/爆炸问题,并有助于更快地收敛,也是一种正则化技术防止过拟合

实际中会看到好多归一化

比如BatchNorm,LayerNorm,GroupNorm,InstanceNorm

1 四种归一化方式对比

这四种归一化方法在神经网络中都有各自的应用场景和特点:

  1. BatchNorm(批归一化)

    • 应用场景:通常用于卷积神经网络(CNN)和全连接神经网络(DNN)中。
    • 工作原理:对每个特征通道在每个训练批次上进行归一化,使得均值接近0,方差接近1。
    • 优点:加速训练收敛,减少梯度消失/爆炸问题,具有轻微的正则化效果。
    • 示例 :在训练图像分类模型时,可以使用nn.BatchNorm2d对卷积层的输出进行归一化。
  2. LayerNorm(层归一化)

    • 应用场景:适用于循环神经网络(RNN)和Transformer等序列模型中。
    • 工作原理:对每个样本的每个特征通道进行归一化,使得均值接近0,方差接近1。
    • 优点:不受批量大小影响,适用于小批量大小和单个样本的情况。
    • 示例 :在Transformer的每个注意力子层后应用nn.LayerNorm对特征进行归一化。
  3. GroupNorm(组归一化)

    • 应用场景:适用于通道较少的情况,例如较小的卷积神经网络或分组卷积中。
    • 工作原理:将通道分成多个组,在每个组内对通道进行归一化,每个组有自己的均值和方差。
    • 优点:不受批量大小影响,适用于小批量大小和通道较少的情况。
    • 示例 :在较小的卷积神经网络中,可以使用nn.GroupNorm对通道进行归一化。
  4. InstanceNorm(实例归一化)

    • 应用场景:适用于风格迁移、超分辨率等需要保留样本间信息的任务中。
    • 工作原理:对每个样本的每个通道进行归一化,使得每个样本的均值接近0,方差接近1。
    • 优点:不受批量大小影响,保留了样本间的信息。
    • 示例 :在风格迁移网络中,可以使用nn.InstanceNorm2d对特征进行归一化。

综上所述,选择适当的归一化方法取决于具体的神经网络架构、任务需求和数据特征。

2 代码实践

2.1 BatchNorm(批归一化)

nn.BatchNorm2d是PyTorch中用于实现批归一化(Batch Normalization)的类,适用于二维输入,通常用于卷积神经网络(CNN)中。它将输入沿着指定的维度(通常是通道维度)进行归一化,使得每个通道的均值接近0,方差接近1。

nn.BatchNorm2d的主要参数包括:

  • num_features:输入特征的数量,通常为输入数据的通道数。
  • eps:为保证数值稳定性而添加到方差的小值。
  • momentum:用于计算 running mean 和 running variance 的动量。

下面是一个示例代码,演示了如何使用nn.BatchNorm2d对输入张量进行归一化:

python 复制代码
import torch
import torch.nn as nn

# 创建一个输入张量,大小为(batch_size, num_channels, height, width)
input_tensor = torch.randn(2, 3, 3, 3)

# 创建一个BatchNorm2d层,对每个通道进行归一化
batch_norm = nn.BatchNorm2d(3)

# 对输入张量进行归一化
output = batch_norm(input_tensor)

print(output.shape)

在这个示例中,nn.BatchNorm2d(3)表示对输入张量的每个通道进行归一化,其中3是输入张量的通道数。最终输出的形状与输入张量相同。

2.2 LayerNorm(层归一化)

nn.LayerNorm是PyTorch中用于实现层归一化(Layer Normalization)的类,适用于多维输入。与批归一化不同,层归一化是在每个样本的每个通道上进行归一化,而不是在整个批次上。这使得它更适合用于循环神经网络(RNN)等序列模型中,因为它不依赖于批次大小,并且对单个样本也有效。

nn.LayerNorm的主要参数包括:

  • normalized_shape:输入张量的形状,通常是一个整数或整数元组,表示输入张量的特征维度。
  • eps:为保证数值稳定性而添加到方差的小值。

下面是一个示例代码,演示了如何使用nn.LayerNorm对输入张量进行归一化:

python 复制代码
import torch
import torch.nn as nn

# 创建一个输入张量,大小为(batch_size, num_channels, height, width)
input_tensor = torch.randn(2, 3, 3, 3)

# 创建一个LayerNorm层,对每个样本的每个通道进行归一化
layer_norm = nn.LayerNorm([3, 3, 3])

# 对输入张量进行归一化
output = layer_norm(input_tensor)

print(output.shape)

在这个示例中,nn.LayerNorm([3, 3, 3])表示对输入张量的每个样本的每个通道进行归一化,其中[3, 3, 3]是输入张量的特征维度。最终输出的形状与输入张量相同。

2.3 InstanceNorm(实例归一化)

nn.InstanceNorm2d是PyTorch中用于实现实例归一化(Instance Normalization)的类,适用于二维输入,通常用于风格迁移、超分辨率等需要保留样本间信息的任务中。与批归一化不同,实例归一化在每个样本的每个通道上进行归一化,而不是在整个批次上。这使得它更适合保留样本间的信息,并且不依赖于批次大小。

nn.InstanceNorm2d的主要参数包括:

  • num_features:输入特征的数量,通常为输入数据的通道数。
  • eps:为保证数值稳定性而添加到方差的小值。

下面是一个示例代码,演示了如何使用nn.InstanceNorm2d对输入张量进行归一化:

python 复制代码
import torch
import torch.nn as nn

# 创建一个输入张量,大小为(batch_size, num_channels, height, width)
input_tensor = torch.randn(2, 3, 3, 3)

# 创建一个InstanceNorm2d层,对每个样本的每个通道进行独立的归一化
instance_norm = nn.InstanceNorm2d(3)

# 对输入张量进行归一化
output = instance_norm(input_tensor)

print(output.shape)

在这个示例中,nn.InstanceNorm2d(3)表示对输入张量的每个样本的每个通道进行独立的归一化,其中3是输入张量的通道数。最终输出的形状与输入张量相同。

2.4 GroupNorm(组归一化)

torch.nn.GroupNorm是PyTorch中的一个归一化层,用于在神经网络中标准化输入。与torch.nn.BatchNorm(批标准化)不同,GroupNorm将输入分成多个组,并在每个组内进行标准化。这种归一化方法在小批量大小下也能保持性能,并且对于通道数较少的情况更有效。以下是GroupNorm的主要特点和参数:

  • num_groups(int):将输入通道分成多少组。每个组内的通道会被一起归一化。
  • num_channels(int):输入张量的通道数。
  • eps(float):用于数值稳定性的epsilon值,避免除以零的情况。

当分组数和通道数相同的时候,相当于调用InstanceNorm

当分组数为1的时候,相当于调用LayerNorm

python 复制代码
input = torch.randn(20, 6, 10, 10)
# 6个通道分为3个
m = nn.GroupNorm(3, 6)
#6个通道分为3个 (等价于InstanceNorm)
m = nn.GroupNorm(6, 6)
# 6个通道分为1个 (等价于LayerNorm)
m = nn.GroupNorm(1, 6)
output = m(input)

使用示例:

python 复制代码
import torch
import torch.nn as nn

# 创建一个输入张量,大小为(batch_size, num_channels, height, width)
input_tensor = torch.randn(2, 6, 3, 3)

# 创建一个GroupNorm层,将通道分成2组
group_norm = nn.GroupNorm(2, 6)

# 对输入张量进行标准化
output = group_norm(input_tensor)

print(output.shape)

在上面的示例中,GroupNorm层将输入张量的通道分成了2组,然后在每个组内进行标准化。

相关推荐
NAGNIP10 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab11 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab11 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP15 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年15 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼15 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS15 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区16 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈16 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang17 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx