目录
torch.nn子模块normal层详解
nn.BatchNorm1d
BatchNorm1d 函数简介
- 用途:
BatchNorm1d
(批量归一化)主要用于加速深度神经网络的训练,通过减少内部协变量偏移来实现。
函数工作原理
- 定义:
BatchNorm1d
对于每个特征维度计算小批量(mini-batch)的均值和标准差,并使用这些统计量对数据进行归一化。 - 数学表达式:对于输入
x
,BatchNorm1d
计算为其中
E[x]
是均值,Var[x]
是方差,和
是可学习的参数向量,
是为了数值稳定性而加的小值。
参数详解
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。
使用技巧与注意事项
- 在训练和评估模式下的不同行为:在训练模式下,该层会计算并更新均值和方差的运行估计。在评估模式下,它会使用这些估计进行归一化。
- 选择正确的
momentum
:momentum
参数对于运行统计量的更新非常重要,需要根据应用场景适当选择。
示例代码
下面是一个使用 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)进行批量归一化。它主要用于加速深度网络训练,并减少内部协变量偏移。
函数工作原理
- 定义:该函数对每个特征维度计算小批量的均值和标准差,并使用这些统计量对数据进行归一化。
- 数学表达式:对于输入
x
,BatchNorm2d
计算为其中
E[x]
是均值,Var[x]
是方差,和
是可学习的参数向量,
是一个小的常数,用于数值稳定性。
参数详解
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。在这种情况下