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

本文主要是介绍【深度学习】四种归一化方式对比:| LayerNorm,BatchNorm,InstanceNorm,GroupNorm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 四种归一化方式对比
  • 2 代码实践
    • 2.1 BatchNorm(批归一化)
    • 2.2 LayerNorm(层归一化)
    • 2.3 InstanceNorm(实例归一化)
    • 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对输入张量进行归一化:

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对输入张量进行归一化:

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对输入张量进行归一化:

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

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)

使用示例:

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组,然后在每个组内进行标准化。

这篇关于【深度学习】四种归一化方式对比:| LayerNorm,BatchNorm,InstanceNorm,GroupNorm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807005

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认