新手深入浅出理解PyTorch归一化层全解析

news2024/11/19 21:25:51

目录

torch.nn子模块normal层详解

nn.BatchNorm1d

BatchNorm1d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.BatchNorm2d

BatchNorm2d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

 nn.BatchNorm3d

BatchNorm3d 函数简介

参数详解

使用技巧与注意事项

示例代码

nn.LazyBatchNorm1d

LazyBatchNorm1d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.LazyBatchNorm2d

LazyBatchNorm2d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.LazyBatchNorm3d

LazyBatchNorm3d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.GroupNorm

GroupNorm 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.SyncBatchNorm

SyncBatchNorm 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.InstanceNorm1d

InstanceNorm1d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.InstanceNorm2d

InstanceNorm2d 函数简介

函数工作原理 

参数详解

使用技巧与注意事项

示例代码

nn.InstanceNorm3d

InstanceNorm3d 函数简介

参数详解

使用技巧与注意事项

示例代码

nn.LazyInstanceNorm1d

LazyInstanceNorm1d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.LazyInstanceNorm2d

LazyInstanceNorm2d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.LazyInstanceNorm3d

LazyInstanceNorm3d 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.LayerNorm

LayerNorm 函数简介

参数详解

使用技巧与注意事项

示例代码

nn.LocalResponseNorm

LocalResponseNorm 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

总结


torch.nn子模块normal层详解

nn.BatchNorm1d

BatchNorm1d 函数简介

  • 用途BatchNorm1d(批量归一化)主要用于加速深度神经网络的训练,通过减少内部协变量偏移来实现。

函数工作原理

  • 定义BatchNorm1d 对于每个特征维度计算小批量(mini-batch)的均值和标准差,并使用这些统计量对数据进行归一化。
  • 数学表达式:对于输入 xBatchNorm1d 计算为y=\frac{x-E[x]}{\sqrt{Var[x]+\varepsilon }}*\gamma +\beta 其中 E[x] 是均值,Var[x] 是方差,\gamma\beta 是可学习的参数向量,\epsilon 是为了数值稳定性而加的小值。

参数详解

  • num_features(int):输入的特征或通道数 C
  • eps(float):为了数值稳定性加在分母上的小值,默认为 1e-5
  • momentum(float):用于计算 running_mean 和 running_var 的值。默认为 0.1。设为 None 可用于计算累积移动平均(即简单平均)。
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,且初始化 running_mean 和 running_var 为 None。在这种情况下,模块总是使用批量统计量。默认为 True。

使用技巧与注意事项

  • 在训练和评估模式下的不同行为:在训练模式下,该层会计算并更新均值和方差的运行估计。在评估模式下,它会使用这些估计进行归一化。
  • 选择正确的 momentummomentum 参数对于运行统计量的更新非常重要,需要根据应用场景适当选择。

示例代码

下面是一个使用 BatchNorm1d 的示例代码:

import torch
import torch.nn as nn

# 带有可学习参数的 BatchNorm1d
m = nn.BatchNorm1d(100)

# 不带可学习参数的 BatchNorm1d
m_no_affine = nn.BatchNorm1d(100, affine=False)

# 创建输入张量
input_tensor = torch.randn(20, 100)

# 应用 BatchNorm1d
output = m(input_tensor)

print("Output with Learnable Parameters:", output)

 这段代码展示了如何初始化带有和不带有可学习参数的 BatchNorm1d 层,并对一个随机生成的输入张量应用该层。

nn.BatchNorm2d

BatchNorm2d 函数简介

  • 用途BatchNorm2d 用于对包含额外通道维度的二维输入的小批量(mini-batch)进行批量归一化。它主要用于加速深度网络训练,并减少内部协变量偏移。

函数工作原理

  • 定义:该函数对每个特征维度计算小批量的均值和标准差,并使用这些统计量对数据进行归一化。
  • 数学表达式:对于输入 xBatchNorm2d 计算为y=\frac{x-E[x]}{\sqrt{Var[x]+\varepsilon }}*\gamma +\beta 其中 E[x] 是均值,Var[x] 是方差,\gamma\beta 是可学习的参数向量,\epsilon 是一个小的常数,用于数值稳定性。

参数详解

  • num_features(int):期望输入的大小 (N, C, H, W) 中的 C,即通道数。
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。设置为 None 时表示使用累积移动平均(即简单平均)。默认为 0.1
  • affine(bool):当设置为 True 时,此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):当设置为 True 时,此模块跟踪运行均值和方差;设置为 False 时,不跟踪这些统计量,并且将 running_mean 和 running_var 初始化为 None。在这种情况下,模块总是使用批量统计量。默认为 True。

使用技巧与注意事项

  • 训练与评估模式的不同:在训练模式下,该层会更新运行均值和方差的估计;在评估模式下,则使用这些估计进行归一化。
  • 适当选择 momentum:选择合适的 momentum 值对于运行统计量的准确性非常重要。

示例代码

下面是一个使用 BatchNorm2d 的示例代码:

import torch
import torch.nn as nn

# 带有可学习参数的 BatchNorm2d
m = nn.BatchNorm2d(100)

# 不带可学习参数的 BatchNorm2d
m_no_affine = nn.BatchNorm2d(100, affine=False)

# 创建输入张量
input_tensor = torch.randn(20, 100, 35, 45)

# 应用 BatchNorm2d
output = m(input_tensor)

print("Output with Learnable Parameters:", output)

这段代码展示了如何初始化带有和不带有可学习参数的 BatchNorm2d 层,并对一个随机生成的四维输入张量应用该层。

 nn.BatchNorm3d

BatchNorm3d 函数简介

  • 用途BatchNorm3d 主要用于加速深度神经网络的训练,并减少内部协变量偏移。它特别适用于处理具有深度、高度和宽度维度的数据,如视频或医学成像数据。

参数详解

  • num_features(int):期望输入的大小 (N, C, D, H, W) 中的 C,即通道数。
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。设置为 None 时表示使用累积移动平均(即简单平均)。默认为 0.1
  • affine(bool):当设置为 True 时,此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):当设置为 True 时,此模块跟踪运行均值和方差;设置为 False 时,不跟踪这些统计量,并且将 running_mean 和 running_var 初始化为 None。在这种情况下,模块总是使用批量统计量。默认为 True。

使用技巧与注意事项

  • 训练与评估模式的不同:在训练模式下,该层会更新运行均值和方差的估计;在评估模式下,则使用这些估计进行归一化。
  • 适当选择 momentum:选择合适的 momentum 值对于运行统计量的准确性非常重要。

示例代码

下面是一个使用 BatchNorm3d 的示例代码:

import torch
import torch.nn as nn

# 带有可学习参数的 BatchNorm3d
m = nn.BatchNorm3d(100)

# 不带可学习参数的 BatchNorm3d
m_no_affine = nn.BatchNorm3d(100, affine=False)

# 创建输入张量
input_tensor = torch.randn(20, 100, 35, 45, 10)

# 应用 BatchNorm3d
output = m(input_tensor)

print("Output with Learnable Parameters:", output)

这段代码展示了如何初始化带有和不带有可学习参数的 BatchNorm3d 层,并对一个随机生成的五维输入张量应用该层。

nn.LazyBatchNorm1d

LazyBatchNorm1d 函数简介

  • 用途LazyBatchNorm1d 与标准的 BatchNorm1d 功能相似,但它在模型构建阶段不需要指定 num_features(特征数量)。这一点在处理动态或未知大小的输入特征时非常有用。

函数工作原理

  • 懒初始化:该模块会在接收到第一个输入数据时自动推断 num_features 的大小。在这之前,权重(weight)、偏差(bias)、运行均值(running_mean)和运行方差(running_var)等属性保持未初始化状态。

参数详解

  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。设置为 None 时表示使用累积移动平均(即简单平均)。默认为 0.1
  • affine(bool):当设置为 True 时,此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):当设置为 True 时,此模块跟踪运行均值和方差;设置为 False 时,不跟踪这些统计量,并且将 running_mean 和 running_var 初始化为 None。在这种情况下,模块总是使用批量统计量。默认为 True。

使用技巧与注意事项

  • 懒初始化的限制:懒初始化模块在模型的序列化和复制过程中可能有一些限制。建议在模型的最终版本中使用具体的 BatchNorm1d 模块,而不是懒初始化版本。
  • 适用场景:在模型构建时,如果输入特征的数量未知或可能发生变化,使用 LazyBatchNorm1d 可以提供更大的灵活性。

示例代码

下面是一个使用 LazyBatchNorm1d 的示例代码:

import torch
import torch.nn as nn

# 创建 LazyBatchNorm1d 层
m = nn.LazyBatchNorm1d()

# 创建输入张量(特征数量未指定)
input_tensor = torch.randn(20, 100)

# 应用 LazyBatchNorm1d
output = m(input_tensor)

print("Output:", output)

在这个示例中,LazyBatchNorm1d 在接收到输入张量后自动推断特征数量,并初始化相关的参数。

nn.LazyBatchNorm2d

LazyBatchNorm2d 函数简介

  • 用途LazyBatchNorm2d 类似于标准的 BatchNorm2d,但它可以在模型构建阶段自动推断 num_features 参数(即输入通道数)。这对于处理动态或未知大小的输入特别有用。

函数工作原理

  • 懒初始化:在接收到第一个输入数据时,LazyBatchNorm2d 自动推断 num_features 的大小。在此之前,权重(weight)、偏差(bias)、运行均值(running_mean)和运行方差(running_var)等属性保持未初始化状态。

参数详解

  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。设置为 None 时表示使用累积移动平均(即简单平均)。默认为 0.1
  • affine(bool):当设置为 True 时,此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):当设置为 True 时,此模块跟踪运行均值和方差;设置为 False 时,不跟踪这些统计量,并且将 running_mean 和 running_var 初始化为 None。在这种情况下,模块总是使用批量统计量。默认为 True。

使用技巧与注意事项

  • 懒初始化的限制:懒初始化模块在模型的序列化和复制过程中可能有一些限制。建议在模型的最终版本中使用具体的 BatchNorm2d 模块,而不是懒初始化版本。
  • 适用场景:在模型构建时,如果输入通道数未知或可能发生变化,使用 LazyBatchNorm2d 可以提供更大的灵活性。

示例代码

下面是一个使用 LazyBatchNorm2d 的示例代码:

import torch
import torch.nn as nn

# 创建 LazyBatchNorm2d 层
m = nn.LazyBatchNorm2d()

# 创建输入张量(通道数量未指定)
input_tensor = torch.randn(20, 100, 35, 45)

# 应用 LazyBatchNorm2d
output = m(input_tensor)

print("Output:", output)

在这个示例中,LazyBatchNorm2d 在接收到输入张量后自动推断通道数量,并初始化相关的参数。

nn.LazyBatchNorm3d

LazyBatchNorm3d 函数简介

  • 用途LazyBatchNorm3d 类似于标准的 BatchNorm3d,但它能够在模型构建阶段自动推断 num_features 参数(即输入通道数)。这在处理动态或未知大小的输入时特别有用。

函数工作原理

  • 懒初始化:在接收到第一个输入数据时,LazyBatchNorm3d 自动推断 num_features 的大小。在此之前,权重(weight)、偏差(bias)、运行均值(running_mean)和运行方差(running_var)等属性保持未初始化状态。

参数详解

  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。设置为 None 时表示使用累积移动平均(即简单平均)。默认为 0.1
  • affine(bool):当设置为 True 时,此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):当设置为 True 时,此模块跟踪运行均值和方差;设置为 False 时,不跟踪这些统计量,并且将 running_mean 和 running_var 初始化为 None。在这种情况下,模块总是使用批量统计量。默认为 True。

使用技巧与注意事项

  • 懒初始化的限制:懒初始化模块在模型的序列化和复制过程中可能有一些限制。建议在模型的最终版本中使用具体的 BatchNorm3d 模块,而不是懒初始化版本。
  • 适用场景:在模型构建时,如果输入通道数未知或可能发生变化,使用 LazyBatchNorm3d 可以提供更大的灵活性。

示例代码

下面是一个使用 LazyBatchNorm3d 的示例代码:

import torch
import torch.nn as nn

# 创建 LazyBatchNorm3d 层
m = nn.LazyBatchNorm3d()

# 创建输入张量(通道数量未指定)
input_tensor = torch.randn(20, 100, 10, 35, 45)

# 应用 LazyBatchNorm3d
output = m(input_tensor)

print("Output:", output)

 在这个示例中,LazyBatchNorm3d 在接收到输入张量后自动推断通道数量,并初始化相关的参数。

nn.GroupNorm

GroupNorm 函数简介

  • 用途GroupNorm 在一批输入数据上应用组归一化,其特别适用于小批量(mini-batch)大小较小的情况。它按照给定的组数将输入通道分组,并在每组内独立计算均值和标准差用于归一化。

函数工作原理

  • 数学表达式:对于输入 xBatchNorm2d 计算为y=\frac{x-E[x]}{\sqrt{Var[x]+\varepsilon }}*\gamma +\beta 其中 E[x] 是均值,Var[x] 是方差,\gamma\beta 是可学习的仿射变换参数,\epsilon 是一个小的常数,用于数值稳定性。
  • 分组:输入通道被分成 num_groups 组,每组包含 num_channels / num_groups 通道。num_channels 必须能被 num_groups 整除。

参数详解

  • num_groups(int):要将通道分成的组数。
  • num_channels(int):输入中期望的通道数。
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • affine(bool):若设置为 True,则此模块具有可学习的逐通道仿射参数。默认为 True。

使用技巧与注意事项

  • 应用场景GroupNorm 在批量大小较小或不定时特别有用,因为它不像批量归一化那样依赖于整个批量的统计数据。
  • 与其他归一化方法的对比:将所有通道分为一个组时,等同于 LayerNorm;将每个通道作为一个单独的组时,等同于 InstanceNorm

示例代码

下面是一些使用 GroupNorm 的示例代码:

import torch
import torch.nn as nn

# 输入数据
input = torch.randn(20, 6, 10, 10)

# 将 6 个通道分成 3 组
m = nn.GroupNorm(3, 6)

# 将 6 个通道分成 6 组(等同于 InstanceNorm)
m_instance = nn.GroupNorm(6, 6)

# 将所有 6 个通道放入一个组(等同于 LayerNorm)
m_layer = nn.GroupNorm(1, 6)

# 激活模块
output = m(input)

nn.SyncBatchNorm

SyncBatchNorm 函数简介

  • 用途SyncBatchNorm 将标准的批量归一化操作扩展到多个进程和设备上。它在训练过程中跨不同的进程组同步批量归一化的均值和方差。

函数工作原理

 定义:与传统的批量归一化类似,SyncBatchNorm 对数据进行归一化:y=\frac{x-E[x]}{\sqrt{Var[x]+\varepsilon }}*\gamma +\beta 其中 E[x]Var[x] 是在所有进程中计算得到的均值和方差,\gamma\beta 是可学习的参数,\epsilon 是为了数值稳定性添加的小常数。

参数详解

  • num_features(int):输入的通道数 C
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 True。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 True。
  • process_group(Optional[Any]):指定进行统计数据同步的进程组。

使用技巧与注意事项

  • 分布式训练SyncBatchNorm 主要用于分布式训练场景,在这些场景中,需要在多个GPU或节点上同步均值和方差。
  • 转换现有模型:可以使用 torch.nn.SyncBatchNorm.convert_sync_batchnorm 方法将现有的 BatchNorm*D 层转换为 SyncBatchNorm 层。

示例代码

下面是一个使用 SyncBatchNorm 的示例代码:

import torch
import torch.nn as nn
import torch.distributed as dist

# 创建 SyncBatchNorm 层
m = nn.SyncBatchNorm(100)

# 输入数据
input = torch.randn(20, 100, 35, 45)

# 应用 SyncBatchNorm
output = m(input)

# 将现有的 BatchNorm*D 层转换为 SyncBatchNorm 层
module = nn.Sequential(
            nn.Linear(20, 100),
            nn.BatchNorm1d(100),
         )
sync_bn_module = nn.SyncBatchNorm.convert_sync_batchnorm(module)

在分布式训练中,您需要设置适当的进程组,以确保不同GPU或节点间的正确同步。

nn.InstanceNorm1d

InstanceNorm1d 函数简介

  • 用途InstanceNorm1d 主要用于对一维数据(如多通道时间序列)应用实例归一化,这在风格化变换等应用中非常有用。它按照每个样本和每个通道分别计算归一化统计。

函数工作原理

  • 定义:对于每个样本和通道,InstanceNorm1d 对数据进行归一化:y=\frac{x-E[x]}{\sqrt{Var[x]+\varepsilon }}*\gamma +\beta 其中 E[x] 是每个样本和通道的均值,Var[x] 是方差,\gamma\beta 是可学习的参数(如果 affine 设置为 True),\epsilon 是为了数值稳定性添加的小常数。

参数详解

  • num_features(int):输入中的特征或通道数 C
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 False。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 False。

使用技巧与注意事项

  • 训练和评估模式:默认情况下,无论是在训练还是评估模式,InstanceNorm1d 都使用实例统计量。如果 track_running_stats 设置为 True,则在训练模式下会更新运行统计量,这些统计量在评估模式下用于归一化。
  • 与 LayerNorm 的区别:虽然 InstanceNorm1dLayerNorm 非常相似,但 InstanceNorm1d 是在每个通道上独立应用的,而 LayerNorm 通常应用于整个样本,并且常用于 NLP 任务。

示例代码

下面是一个使用 InstanceNorm1d 的示例代码:

import torch
import torch.nn as nn

# 不带可学习参数的 InstanceNorm1d
m = nn.InstanceNorm1d(100)

# 带有可学习参数的 InstanceNorm1d
m_affine = nn.InstanceNorm1d(100, affine=True)

# 创建输入张量
input_tensor = torch.randn(20, 100, 40)

# 应用 InstanceNorm1d
output = m(input_tensor)

print("Output:", output)

nn.InstanceNorm2d

InstanceNorm2d 函数简介

  • 用途InstanceNorm2d 主要用于对四维输入(如小批量的二维输入,具有额外的通道维度)应用实例归一化。这在图像处理(例如风格化变换)中特别有用,因为它按照每个样本和每个通道分别计算归一化统计。

函数工作原理 

定义:对于每个样本和通道,InstanceNorm2d 对数据进行归一化:y=\frac{x-E[x]}{\sqrt{Var[x]+\varepsilon }}*\gamma +\beta其中 E[x] 是每个样本和通道的均值,Var[x] 是方差,\gamma\beta 是可学习的参数(如果 affine 设置为 True), 是为了数值稳定性添加的小常数。

参数详解

  • num_features(int):输入中的特征或通道数 C
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 False。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 False。

使用技巧与注意事项

  • 训练和评估模式:默认情况下,无论是在训练还是评估模式,InstanceNorm2d 都使用实例统计量。如果 track_running_stats 设置为 True,则在训练模式下会更新运行统计量,这些统计量在评估模式下用于归一化。
  • 与 LayerNorm 的区别:虽然 InstanceNorm2dLayerNorm 非常相似,但 InstanceNorm2d 是在每个通道上独立应用的,适用于如 RGB 图像等通道化数据,而 LayerNorm 通常应用于整个样本,并且常用于 NLP 任务。

示例代码

下面是一个使用 InstanceNorm2d 的示例代码:

import torch
import torch.nn as nn

# 不带可学习参数的 InstanceNorm2d
m = nn.InstanceNorm2d(100)

# 带有可学习参数的 InstanceNorm2d
m_affine = nn.InstanceNorm2d(100, affine=True)

# 创建输入张量
input_tensor = torch.randn(20, 100, 35, 45)

# 应用 InstanceNorm2d
output = m(input_tensor)

print("Output:", output)

nn.InstanceNorm3d

InstanceNorm3d 函数简介

  • 用途InstanceNorm3d 主要用于对五维输入(如小批量的三维输入,具有额外的通道维度)应用实例归一化。这在处理三维数据,如医学成像或3D模型时特别有用,因为它按照每个样本和每个通道分别计算归一化统计。

参数详解

  • num_features(int):输入中的特征或通道数 C
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 False。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 False。

使用技巧与注意事项

  • 训练和评估模式:默认情况下,无论是在训练还是评估模式,InstanceNorm3d 都使用实例统计量。如果 track_running_stats 设置为 True,则在训练模式下会更新运行统计量,这些统计量在评估模式下用于归一化。
  • 与 LayerNorm 的区别:虽然 InstanceNorm3dLayerNorm 非常相似,但 InstanceNorm3d 是在每个通道上独立应用的,适用于如3D模型等通道化数据,而 LayerNorm 通常应用于整个样本,并且常用于 NLP 任务。

示例代码

下面是一个使用 InstanceNorm3d 的示例代码:

import torch
import torch.nn as nn

# 不带可学习参数的 InstanceNorm3d
m = nn.InstanceNorm3d(100)

# 带有可学习参数的 InstanceNorm3d
m_affine = nn.InstanceNorm3d(100, affine=True)

# 创建输入张量
input_tensor = torch.randn(20, 100, 35, 45, 10)

# 应用 InstanceNorm3d
output = m(input_tensor)

print("Output:", output)

nn.LazyInstanceNorm1d

LazyInstanceNorm1d 函数简介

  • 用途LazyInstanceNorm1dInstanceNorm1d 的懒初始化版本。它允许您在模型构建时推迟指定输入特征(通道数)的数量,这在处理动态或未知大小的输入时特别有用。

函数工作原理

  • 懒初始化:在接收到第一个输入数据时,LazyInstanceNorm1d 自动推断 num_features(特征或通道数)的大小。在此之前,权重(weight)、偏差(bias)、运行均值(running_mean)和运行方差(running_var)等属性保持未初始化状态。

参数详解

  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 False。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 False。

使用技巧与注意事项

  • 懒初始化的限制:懒初始化模块在模型的序列化和复制过程中可能有一些限制。建议在模型的最终版本中使用具体的 InstanceNorm1d 模块,而不是懒初始化版本。
  • 适用场景:在模型构建时,如果输入特征的数量未知或可能发生变化,使用 LazyInstanceNorm1d 可以提供更大的灵活性。

示例代码

下面是一个使用 LazyInstanceNorm1d 的示例代码:

import torch
import torch.nn as nn

# 创建 LazyInstanceNorm1d 层
m = nn.LazyInstanceNorm1d()

# 创建输入张量(特征数量未指定)
input_tensor = torch.randn(20, 100, 40)

# 应用 LazyInstanceNorm1d
output = m(input_tensor)

print("Output:", output)

 在这个示例中,LazyInstanceNorm1d 在接收到输入张量后自动推断特征数量,并初始化相关的参数。

nn.LazyInstanceNorm2d

LazyInstanceNorm2d 函数简介

  • 用途LazyInstanceNorm2dInstanceNorm2d 的懒初始化版本。它在模型构建时允许您推迟指定输入特征(即通道数)的数量,这在处理动态或未知大小的输入时特别有用。

函数工作原理

  • 懒初始化:在接收到第一个输入数据时,LazyInstanceNorm2d 自动推断 num_features(特征或通道数)的大小。在此之前,权重(weight)、偏差(bias)、运行均值(running_mean)和运行方差(running_var)等属性保持未初始化状态。

参数详解

  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 False。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 False。

使用技巧与注意事项

  • 懒初始化的限制:懒初始化模块在模型的序列化和复制过程中可能有一些限制。建议在模型的最终版本中使用具体的 InstanceNorm2d 模块,而不是懒初始化版本。
  • 适用场景:在模型构建时,如果输入通道数未知或可能发生变化,使用 LazyInstanceNorm2d 可以提供更大的灵活性。

示例代码

下面是一个使用 LazyInstanceNorm2d 的示例代码:

import torch
import torch.nn as nn

# 创建 LazyInstanceNorm2d 层
m = nn.LazyInstanceNorm2d()

# 创建输入张量(通道数量未指定)
input_tensor = torch.randn(20, 100, 35, 45)

# 应用 LazyInstanceNorm2d
output = m(input_tensor)

print("Output:", output)

 在这个示例中,LazyInstanceNorm2d 在接收到输入张量后自动推断通道数量,并初始化相关的参数。

nn.LazyInstanceNorm3d

LazyInstanceNorm3d 函数简介

  • 用途LazyInstanceNorm3dInstanceNorm3d 的懒初始化版本。它在模型构建时允许您推迟指定输入特征(即通道数)的数量,这在处理动态或未知大小的输入时特别有用。

函数工作原理

  • 懒初始化:在接收到第一个输入数据时,LazyInstanceNorm3d 自动推断 num_features(特征或通道数)的大小。在此之前,权重(weight)、偏差(bias)、运行均值(running_mean)和运行方差(running_var)等属性保持未初始化状态。

参数详解

  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • momentum(float):用于运行均值和方差计算的值。默认为 0.1
  • affine(bool):若设置为 True,则此模块具有可学习的仿射参数。默认为 False。
  • track_running_stats(bool):若设置为 True,则此模块跟踪运行均值和方差;若为 False,则不跟踪,总是使用批量统计量。默认为 False。

使用技巧与注意事项

  • 懒初始化的限制:懒初始化模块在模型的序列化和复制过程中可能有一些限制。建议在模型的最终版本中使用具体的 InstanceNorm3d 模块,而不是懒初始化版本。
  • 适用场景:在模型构建时,如果输入通道数未知或可能发生变化,使用 LazyInstanceNorm3d 可以提供更大的灵活性。

示例代码

下面是一个使用 LazyInstanceNorm3d 的示例代码:

import torch
import torch.nn as nn

# 创建 LazyInstanceNorm3d 层
m = nn.LazyInstanceNorm3d()

# 创建输入张量(通道数量未指定)
input_tensor = torch.randn(20, 100, 30, 40, 50)

# 应用 LazyInstanceNorm3d
output = m(input_tensor)

print("Output:", output)

在这个示例中,LazyInstanceNorm3d 在接收到输入张量后自动推断通道数量,并初始化相关的参数。

nn.LayerNorm

LayerNorm 函数简介

  • 用途LayerNorm 主要用于对小批量输入数据应用层归一化,这在自然语言处理(NLP)和某些图像处理任务中非常有用。它在输入的最后几个维度上计算归一化统计。

参数详解

  • normalized_shape(int 或 list 或 torch.Size):期望输入的形状。如果使用单个整数,则视为单元素列表,此模块将在最后一个维度上进行归一化。
  • eps(float):用于数值稳定性的分母小值。默认为 1e-5
  • elementwise_affine(bool):若设置为 True,则此模块具有逐元素可学习的仿射参数。默认为 True。
  • bias(bool):如果设置为 False,则不会学习加性偏置(仅在 elementwise_affine 为 True 时相关)。默认为 True。

使用技巧与注意事项

  • 与 BatchNorm 和 InstanceNorm 的区别:不同于批量归一化和实例归一化,它们对每个通道/平面应用标量缩放和偏置,LayerNorm 对每个元素应用缩放和偏置。
  • 适用场景LayerNorm 通常用于处理具有固定特征维度的输入,例如自然语言处理中的嵌入层或图像处理中的特定通道。

示例代码

下面是一些使用 LayerNorm 的示例代码:

NLP 示例

import torch
import torch.nn as nn

batch, sentence_length, embedding_dim = 20, 5, 10
embedding = torch.randn(batch, sentence_length, embedding_dim)
layer_norm = nn.LayerNorm(embedding_dim)

# 激活模块
layer_norm_output = layer_norm(embedding)

 图像示例

N, C, H, W = 20, 5, 10, 10
input_tensor = torch.randn(N, C, H, W)

# 在通道和空间维度上归一化
layer_norm = nn.LayerNorm([C, H, W])
output = layer_norm(input_tensor)

nn.LocalResponseNorm

LocalResponseNorm 函数简介

  • 用途LocalResponseNorm 应用于由多个输入平面组成的输入信号上,主要用于跨通道(占第二维度)进行归一化。这种归一化在早期卷积神经网络中常见,用于增强模型的泛化能力。

函数工作原理

  • 定义:LRN 对每个元素应用局部归一化:

 其中 a_c 是输入在通道 c 上的值,n 是归一化窗口大小,N 是通道总数,k\alpha\beta 是超参数。

参数详解

  • size(int):用于归一化的邻近通道数。
  • alpha(float):乘性因子。默认为 0.0001
  • beta(float):指数。默认为 0.75
  • k(float):加性因子。默认为 1

使用技巧与注意事项

  • 应用场景:虽然LRN在现代深度学习模型中使用较少,但它仍在某些特定的架构或任务中有其独特作用。
  • 与 BatchNorm 的区别:与批量归一化(Batch Normalization)不同,LRN 主要关注局部输入区域的归一化,而不是整个小批量的统计。

示例代码

下面是使用 LocalResponseNorm 的示例代码:

import torch
import torch.nn as nn

# 创建 LocalResponseNorm 层
lrn = nn.LocalResponseNorm(2)

# 创建二维和四维信号
signal_2d = torch.randn(32, 5, 24, 24)
signal_4d = torch.randn(16, 5, 7, 7, 7, 7)

# 应用 LocalResponseNorm
output_2d = lrn(signal_2d)
output_4d = lrn(signal_4d)

总结

这篇博客详细解释了 PyTorch 中 torch.nn 子模块下的多种归一化层,包括 BatchNorm (1d, 2d, 3d)、LazyBatchNorm (1d, 2d, 3d)、GroupNorm、SyncBatchNorm、InstanceNorm (1d, 2d, 3d)、LayerNorm 和 LocalResponseNorm。每种归一化层的功能、工作原理、参数详解以及使用技巧都进行了全面的阐述。此外,还提供了每种归一化层的示例代码,帮助理解它们在实际应用中的使用方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1358585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么在国内考CISP比CISSP好?

在国内考CISP比CISSP好的原因主要有以下几点👇 1️⃣国内认证认可度高 💎CISP是国内信息an全领域的重要认证,得到了国内政fu、企业和行业的高度认可。 2️⃣国内考试难度相对较低 由于CISP的考试内容与国内信息an全领域的实际情况更加贴近&am…

MySQL 8.0.32 双写参数和innodb_redo

版本为mysql 8.0.32 数据库内存和磁盘架构 #ib_16384_0.dblwr #ib_16384_0.dblwr和#ib_16384_2.dblwr 这两个文件有什么区别 从架构图中,不难看出这两个文件是双写buffer文件。 双写缓冲区是一个存储区域,在 InnoDB将页面写入 InnoDB数据文件中的正确…

C#上位机与欧姆龙PLC的通信10----开发专用的通讯工具软件(WPF版)

1、介绍 上节开发了一个winform版的通讯测试工具,这节再搞个wpf版的,wpf是什么?请自行百度,也可以看前面的博客,WPF真入门教程,wpf的界面效果是比winform漂亮,因为wpf使用了web项目中的css样式…

使用qtcreator创建qml项目(图解)

接下来就一直点继续,最后完成项目,如下图。 下面对项目进行一些基本的描述 (1)qt项目文件使用pro后缀,是qt项目的配置文件,它用于指定项目的各种参数,包括源文件、头文件、库依赖、编译选项等&a…

全网唯一值得推荐的C/C++框架和库

全网唯一值得推荐的C/C框架和库 C程序员开发指南 ​ 关注我,天天分享C/C开发技术干货! ​关注他 30 人赞同了该文章 ​ 目录 收起 标准库 C通用框架和库 人工智能 异步事件循环 音频 生态学 压缩 并发性 容器 数据库 调试 游戏引擎 图…

C++程序设计兼谈对象模型(侯捷)笔记

C程序设计兼谈对象模型(侯捷) 这是C面向对象程序设计的续集笔记,仅供个人学习使用。如有侵权,请联系删除。 主要内容:涉及到模板中的类模板、函数模板、成员模板以及模板模板参数,后面包含对象模型中虚函数调用&…

【合阳新起点公益】“关爱留守儿童 守护牙齿健康”牙膏发放活动

为了关爱儿童的口腔健康,帮助他们改善生活状况,养成良好的刷牙习惯。合阳县未成年人保护中心、合阳县新起点公益服务中心组织链接到汕头市惠泽人志愿服务中心,为孩子们申请到一批儿童爱心牙膏套盒,分别于2023年12月22日、12月30日…

基于seatunnel实现mysql同步clickhouse验证

场景: 需求想要实现mysql同步到clickhouse,seatunnel部署见前面文档linux环境seatunnel安装运行-CSDN博客。 官方说明文档 Clickhouse | Apache SeaTunnel mysql同步配置 server-id1 log_bin/var/lib/mysql/bin.log binlog_formatROW #binlog-do-db 具…

必看!干得不能再干了,Abaqus各版本安装指南

Abaqus下载链接 https://pan.baidu.com/s/1PHWhlM4cPINUqy2XYRHrhQ?pwd0531 ​1.鼠标右击【Abaqus2023(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Abaqus.2023(64bit)】。 2.打开解压后的文件夹,鼠标右击【jdk-17…

2024年MySQL学习指南(四),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言9. 约束的概念10. 约束的分类11. 非空约束12. 唯一约束13. 主键约束14. 默认约束15. 外键约束16. 约束的案例练习 前言 接上篇: 2024年MySQL学习指南(一) 2024年MySQL学习指南(二) 2024年MySQL学习指…

影响机器人行业爆炸式发展的原因有哪些(OpenPilot)

机器人是现在和未来最有发展前景的行业,这一点是毋庸置疑的。 先看一段21年的视频: 外置式L2级别自动驾驶辅助套件 Openpilot 深度体验分析 火热 作为热门专业的从业人员,能够感受到行业的关注热度和实际热度之间的差异。 原因 有很多&am…

操作系统(期末复习知识点)

第1章 操作系统引论 操作系统的目标和作用 操作系统的目标 在计算机系统上配置OS,其主要目的是实现:方便性、有效性、可扩充性、开放性。 操作系统的作用 可以从人机交互、资源管理及资源抽象等不同方面来分析OS在计算机系统中所起到的作用。 OS 作为…

怎么测试电源负载瞬态响应?具体步骤是什么?

负载瞬态响应(Load Transient Response)指的是电路或系统在负载发生瞬态变化时,输出电压或电流出现的瞬时变化的情况。 电源负载瞬态响应测试是评估电源在负载变化时性能表现的一种重要方法。在实际应用中,电源负载的变化是不可避免的,因此准确评估电源的…

面试必问究极重点之HashMap的底层原理

1.底层数据结构 JDK版本不同的数据结构 1.7 数组 链表 1.8 数组 (链表 | 红黑树) 2.添加数据put 在添加一个值的时候,首先会计算他的hash码,然后进行二次hash,在对当前长度取模得到在底层数组中的索引位置当取模完…

用Spring Boot 3.2虚拟线程搭建静态文件服务器有多快?

Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能,包括: 虚拟线程:利用 Project Loom 的虚拟线程释放可扩展性,从而减少资源消耗并增…

【HBase】——优化

1 RowKey设计 重要:一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于 哪个一个预分区的区间内,设计 rowkey的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度…

海昌海洋公园用泛微千里聆RPA智能采集、识别、分析网络数据,助力优化运营服务

海昌海洋公园控股有限公司(以下简称“海昌海洋公园”)是中国知名的主题公园和配套商用物业开发及运营商。经过近二十年发展,凭借行业优秀的极地海洋动物保育技术,公司将其业务模式逐步推广到核心城市,展开了海昌海洋公…

2024中国管业十大品牌——皮尔特管业

2024中国管业十大品牌——皮尔特管业 2024年度中国管业十大品牌评选活动圆满举办。来自江苏的皮尔特管道,再次成功入围2024中国管业十大品牌。皮尔特管业凭借多年积累的市场口碑,再次入围也是实至名归。 苏州皮尔特管业科技有限公司创建于2001年&#x…

矩阵翻转180度是什么意思,请举例

问题描述:矩阵翻转180度是什么意思,请举例 问题解答: 矩阵的180度翻转是指将矩阵绕中心水平和垂直翻转。这个操作类似于将图像或矩阵上下颠倒,然后左右颠倒。翻转后的矩阵在水平和垂直方向上保持了原始矩阵的对称性。 让我们以…

【性能测试】老鸟总结,性能测试到底该如何做,一篇打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、前期准备 性能…