首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】35.标准化层(Normalization Layer)

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





01

标准化层


随着卷积神经网络层数的增加,网络对于超参数的设定会更为敏感,也可能会出现模型长时间不收敛的问题。这是因为随着层数的增加,数据每经过一次非线性运算后都会生成一个分布,不利于模型学习。
针对上述问题2015年谷歌科学家Sergey Ioffe等人提出了一种参数标准化(Normalize)方法,并基于该方法设计了标准化层(Normalization Layer该层用于对输入数据进行标准化处理,使其具有零均值和单位方差,即使得卷积神经网络中每一层输入的数据保持相同分布。
标准化层的主要作用是加速神经网络的训练、提高模型的泛化能力和稳定性。通过对输入数据进行标准化,可以使得神经网络对不同尺度和分布的数据具有更好的适应性,减少内部协变量偏移(Internal Covariate Shift)的影响,使得网络模型中超参数的设定更为自由,例如使用更大的学习率或者更为自由的参数初始化方法。
常见的标准化层有
  • 批标准化(Batch Normalization, BN):

批标准化是最常用的标准层,通常应用于全连接层或卷积层之后。BN层通过计算每个mini-batch的均值和方差,将输入特征归一化到具有零均值和单位方差的分布上。此外,BN层还引入了可学习的缩放因子γ和偏移量β,以恢复潜在的有用尺度和偏移。
  • 层标准化(Layer Normalization, LN):

层标准化批标准化类似,但它是基于单个样本的特征维度进行标准化的。这意味着对于每个样本,LN层会独立地计算其特征的均值和方差,这在序列模型(如RNNLSTM)中特别有用,因为BN层不能很好地处理序列数据中的依赖关系。
  • 实例标准化(Instance Normalization, IN):

实例标准化主要用于图像生成任务,如风格迁移。它针对每个样本的每个通道分别进行归一化,保留了批标准化的一些特性,但不依赖于mini-batch内的统计信息,这在小批量训练或生成任务中尤其重要。
  • 组标准化(Group Normalization, GN):

组标准化是批标准化和实例标准化的一个折衷方案,它将特征通道分成若干组,对每组进行标准化组标准化在小批量数据较小时可以替代批标准化。
标准化层的使用需要根据具体的应用场景和模型结构来选择,不同的标准化方法可能对模型性能产生不同的影响。例如,在计算机视觉任务中,批标准化和组标准化较为常用;而在自然语言处理任务中,层标准化更为常见。
02

BatchNorm2d


Pytorch中,标准化层主要通过torch.nn模块下的BatchNorm1dBatchNorm2dBatchNorm3d等类实现,用于处理不同维度的数据。
本次以最常使用的torch.nn.BatchNorm2d为例,其构造函数如下:
torch.nn.BatchNorm2d(num_features, 
                     eps=1e-05
                     momentum=0.1
                     affine=True
                     track_running_stats=True)

其中:

  • num_features:来自期望输入的特征数,即输入数据的通道数。
  • eps:为了数值稳定性而加到分母里的值。默认值是1e-05
  • momentum:动态均值和方差的值的一个运行平均值的动量。默认值是0.1。
  • affine:设置为True时,此模块具有可学习的仿射参数(即weightbias)。默认是True
  • track_running_stats:设置为True时,此模块将计算并存储运行时的均值和方差,而不是在训练模式下的每个批次中都重新计算它们。这对于在评估(或推理)模式下保持性能非常有用。默认是True

affine=TruePyTorch中,BatchNorm2d层包含两个可学习的参数:weightbias

  • weight (γ, gamma):该参数是一个缩放因子,用于调整标准化后的数据分布。在批标准化的过程中,输入数据首先被标准化(即减去均值并除以标准差),然后乘以weight参数。这样做是为了让网络能够学习到原始数据分布的最佳缩放尺度,从而可能提高模型的表达能力。
  • bias (β, beta):该参数是一个偏移量,用于在缩放后的数据上加上一个偏移。与weight类似,bias参数也是可学习的,它允许网络在标准化后的数据上加上一个偏移量,以便更好地适应后续的网络层。

标准化的公式通常可以表示为:

其中:

  • x 是输入数据;

  • μBσB 分别是输入数据在一个小批量内的均值和标准差;

  • γweight参数;

  • βbias参数;

  • ϵ 是一个很小的数,用于防止分母为零。

通过训练,网络会学习到合适的γβ值,以便更有效地优化模型性能。这两个参数的存在使得批量归一化层不仅仅是一个固定的归一化操作,而是一个可以学习和适应的层。

03

标准化操作


本次仍以经典的Lena图作为处理图像。
lena = Image.open('lena.png')

# 将其转换为PyTorch张量
to_tensor = transforms.ToTensor()
lena_tensor = to_tensor(lena).unsqueeze(0)
加载完成后,查看原图的均值和标准差的值:
# 原图的均值和标准差
lena_tensor.mean() , lena_tensor.std()
# 输出结果:(tensor(0.4865), tensor(0.1834))
本例展示了如何使用BatchNorm2d层对图像张量进行批量标准化操作:
  • 首先创建了一个BatchNorm2d层,并指定期望输入的通道数为1。这意味着该批量归一化层是针对单通道图像设计的。
  • affine=True时(默认),BatchNorm2d层中,weightbias是可学习的参数,它们初始化值分别为1和0。
  • 将原图数据传递给BatchNorm2d层进行处理。该层会首先计算输入张量的均值和标准差,然后使用这些统计量对输入进行标准化(即减去均值并除以标准差),最后应用可学习的weightbias参数进行缩放和偏移,结果存储在out中。由于批量归一化层不会改变输入张量的形状,因此out的形状应该与输入张量的形状相同。
  • 由于批量归一化的效果,输出张量的均值应该非常接近0(在这个例子中是-1.3428e-07,几乎为0),而标准差应该非常接近1(在这个例子中是0.9999)。这表明批量归一化成功地将输入数据标准化到了一个具有零均值和单位方差的分布上。

# 创建了一个BatchNorm2d层,期望输入的通道数为1
bn = nn.BatchNorm2d(1)

# weight和bias参数的初始化值
bn.weight.data , bn.bias.data
# 输出结果:(tensor([1.]), tensor([0.]))

# 对图像张量进行标准化操作
out = bn(lena_tensor)

# 结果形状 
out.shape

# 输出特征图的均值和标准差
out.mean() , out.std()
# 输出结果:(tensor(-1.3428e-07, grad_fn=<MeanBackward0>),
 tensor(0.9999, grad_fn=<StdBackward0>))

更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments