【深度学习】四种归一化方式对比:| 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

相关文章

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼