nn.InstanceNorm2d和nn.BatchNorm2d比较

介绍

nn.InstanceNorm2dnn.BatchNorm2d 都是 PyTorch 中常用的归一化层,用于提高神经网络的训练稳定性和泛化能力。

主要区别

它们之间的主要区别如下:

  1. 归一化对象:

    • nn.InstanceNorm2d:实例归一化,对每个样本(实例)的特征进行归一化。适用于每个样本的特征分布不同的情况,如图像风格转换等任务。
    • nn.BatchNorm2d:批归一化,对整个批次中的样本的特征进行归一化。适用于训练深度神经网络时,加速训练过程、提高模型的泛化能力。
  2. 归一化方式:

    • nn.InstanceNorm2d:对每个样本的每个通道进行归一化,即对每个特征图的每个位置点进行归一化。
    • nn.BatchNorm2d:对每个通道的特征图进行归一化,即对每个特征图的所有位置点进行归一化。
  3. 归一化参数:

    • nn.InstanceNorm2d:没有可训练的参数,只有归一化的均值和方差。
    • nn.BatchNorm2d:有可训练的参数,包括缩放因子(scale)、偏移量(shift)、归一化的均值和方差。
  4. 使用场景:

    • nn.InstanceNorm2d:适用于图像风格转换、图像生成等需要保持每个样本特征独立性的任务。
    • nn.BatchNorm2d:适用于深度神经网络的训练过程,加速训练、提高模型的泛化能力。

需要根据具体任务和网络结构的特点选择合适的归一化层。在一般情况下,nn.BatchNorm2d 是更常用的归一化层。

计算公式

nn.InstanceNorm2dnn.BatchNorm2d 在计算上的公式如下:

对于 nn.InstanceNorm2d,假设输入为 x ∈ R N × C × H × W x \in \mathbb{R}^{N \times C \times H \times W} xRN×C×H×W,其中 N N N 是批次大小, C C C 是通道数, H H H W W W 是特征图的高度和宽度。实例归一化的计算公式如下:

InstanceNorm2d ( x ) n , c , h , w = x n , c , h , w − μ n , c σ n , c 2 + ϵ ⋅ γ c + β c \text{InstanceNorm2d}(x)_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_{n,c}}{\sqrt{\sigma^2_{n,c} + \epsilon}} \cdot \gamma_c + \beta_c InstanceNorm2d(x)n,c,h,w=σn,c2+ϵ xn,c,h,wμn,cγc+βc

其中:

  • x n , c , h , w x_{n,c,h,w} xn,c,h,w 是输入张量 x x x 在第 n n n 个样本、第 c c c 个通道、第 h h h 行、第 w w w 列的元素。
  • μ n , c \mu_{n,c} μn,c 是第 n n n 个样本、第 c c c 个通道的均值,计算公式为 μ n , c = 1 H × W ∑ h = 1 H ∑ w = 1 W x n , c , h , w \mu_{n,c} = \frac{1}{H \times W} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n,c,h,w} μn,c=H×W1h=1Hw=1Wxn,c,h,w
  • σ n , c 2 \sigma^2_{n,c} σn,c2 是第 n n n 个样本、第 c c c 个通道的方差,计算公式为 σ n , c 2 = 1 H × W ∑ h = 1 H ∑ w = 1 W ( x n , c , h , w − μ n , c ) 2 \sigma^2_{n,c} = \frac{1}{H \times W} \sum_{h=1}^{H} \sum_{w=1}^{W} (x_{n,c,h,w} - \mu_{n,c})^2 σn,c2=H×W1h=1Hw=1W(xn,c,h,wμn,c)2
  • γ c \gamma_c γc 是归一化的缩放因子(scale),是一个可学习的参数。
  • β c \beta_c βc 是归一化的偏移量(shift),是一个可学习的参数。
  • ϵ \epsilon ϵ 是一个小的常数,用于避免除以零的情况。

对于 nn.BatchNorm2d,假设输入为 x ∈ R N × C × H × W x \in \mathbb{R}^{N \times C \times H \times W} xRN×C×H×W,其中 N N N 是批次大小, C C C 是通道数, H H H W W W 是特征图的高度和宽度。批归一化的计算公式如下:

BatchNorm2d ( x ) n , c , h , w = x n , c , h , w − μ c σ c 2 + ϵ ⋅ γ c + β c \text{BatchNorm2d}(x)_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_c}{\sqrt{\sigma^2_c + \epsilon}} \cdot \gamma_c + \beta_c BatchNorm2d(x)n,c,h,w=σc2+ϵ xn,c,h,wμcγc+βc

其中:

  • x n , c , h , w x_{n,c,h,w} xn,c,h,w 是输入张量 x x x 在第 n n n 个样本、第 c c c 个通道、第 h h h 行、第 w w w 列的元素。
  • μ c \mu_c μc 是第 c c c 个通道的均值,计算公式为 μ c = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W x n , c , h , w \mu_c = \frac{1}{N \times H \times W} \sum_{n=1}^{N} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n,c,h,w} μc=N×H×W1n=1Nh=1Hw=1Wxn,c,h,w
  • σ c 2 \sigma^2_c σc2 是第 c c c 个通道的方差,计算公式为 σ c 2 = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W ( x n , c , h , w − μ c ) 2 \sigma^2_c = \frac{1}{N \times H \times W} \sum_{n=1}^{N} \sum_{h=1}^{H} \sum_{w=1}^{W} (x_{n,c,h,w} - \mu_c)^2 σc2=N×H×W1n=1Nh=1Hw=1W(xn,c,h,wμc)2
  • γ c \gamma_c γc 是归一化的缩放因子(scale),是一个可学习的参数。
  • β c \beta_c βc 是归一化的偏移量(shift),是一个可学习的参数。
  • ϵ \epsilon ϵ 是一个小的常数,用于避免除以零的情况。

☆☆☆详细补充(BatchNorm2d、InstanceNorm2d和LayerNorm)

在PyTorch中,BatchNorm2dInstanceNorm2dLayerNorm 都是归一化(Normalization)技术,但它们在计算方式和适用场景上有所不同。下面我将详细解释它们的区别,并给出它们的计算过程。

1. BatchNorm2d

Batch Normalization 是在 mini-batch 数据上进行归一化,通常用于 Convolutional Neural Networks (CNNs) 中。

计算过程:

假设输入是一个 4D 张量,形状为 (N, C, H, W),其中:

  • N 是批量大小(batch size)
  • C 是通道数(channels)
  • H 是高度(height)
  • W 是宽度(width)

对于 BatchNorm2d,归一化是在 通道维度 上进行的,即对于每一个通道,计算其均值和方差,然后进行归一化。

具体步骤如下:

  1. 计算均值和方差:

    对于每个通道 c,计算均值和方差:

    μ c = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W x n , c , h , w \mu_c = \frac{1}{N \times H \times W} \sum_{n=1}^{N} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n,c,h,w} μc=N×H×W1n=1Nh=1Hw=1Wxn,c,h,w

    σ c 2 = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W ( x n , c , h , w − μ c ) 2 \sigma_c^2 = \frac{1}{N \times H \times W} \sum_{n=1}^{N} \sum_{h=1}^{H} \sum_{w=1}^{W} (x_{n,c,h,w} - \mu_c)^2 σc2=N×H×W1n=1Nh=1Hw=1W(xn,c,h,wμc)2

  2. 归一化:

    x ^ n , c , h , w = x n , c , h , w − μ c σ c 2 + ϵ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}} x^n,c,h,w=σc2+ϵ xn,c,h,wμc

    其中, ϵ \epsilon ϵ 是一个很小的数,用于数值稳定。

  3. 缩放和偏移:

    y n , c , h , w = γ c x ^ n , c , h , w + β c y_{n,c,h,w} = \gamma_c \hat{x}_{n,c,h,w} + \beta_c yn,c,h,w=γcx^n,c,h,w+βc

    其中, γ c \gamma_c γc β c \beta_c βc 是可学习的参数,用于缩放和偏移。

特点:

  • 在 batch 维度上进行归一化,利用 batch 中的数据进行统计。
  • 通常在训练时使用 moving average 来估计均值和方差,在测试时使用运行时的均值和方差。
  • 适合批量较大的情况,批量太小可能效果不佳。

2. InstanceNorm2d

Instance Normalization 是在每个样本(实例)的基础上进行归一化,常用于生成对抗网络(GANs)和风格迁移任务。

计算过程:

同样假设输入是一个 4D 张量,形状为 (N, C, H, W)

对于 InstanceNorm2d,归一化是在 每个样本的通道维度 上进行的,即对于每一个样本 n,在所有通道上计算均值和方差,然后进行归一化。

具体步骤如下:

  1. 计算均值和方差:

    对于每个样本 n 和每个通道 c,计算均值和方差:

μ n , c = 1 H × W ∑ h = 1 H ∑ w = 1 W x n , c , h , w \mu_{n,c} = \frac{1}{H \times W} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n,c,h,w} μn,c=H×W1h=1Hw=1Wxn,c,h,w

σ n , c 2 = 1 H × W ∑ h = 1 H ∑ w = 1 W ( x n , c , h , w − μ n , c ) 2 \sigma_{n,c}^2 = \frac{1}{H \times W} \sum_{h=1}^{H} \sum_{w=1}^{W} (x_{n,c,h,w} - \mu_{n,c})^2 σn,c2=H×W1h=1Hw=1W(xn,c,h,wμn,c)2

  1. 归一化:

    x ^ n , c , h , w = x n , c , h , w − μ n , c σ n , c 2 + ϵ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_{n,c}}{\sqrt{\sigma_{n,c}^2 + \epsilon}} x^n,c,h,w=σn,c2+ϵ xn,c,h,wμn,c

  2. 缩放和偏移:

    y n , c , h , w = γ c x ^ n , c , h , w + β c y_{n,c,h,w} = \gamma_c \hat{x}_{n,c,h,w} + \beta_c yn,c,h,w=γcx^n,c,h,w+βc

    其中, γ c \gamma_c γc β c \beta_c βc 是可学习的参数,但与 BatchNorm2d 不同,这里的参数是按通道共享的。

特点:

  • 每个样本独立进行归一化,不共享统计信息。
  • 适用于风格迁移和生成任务,因为可以保留更多的样本特征。
  • 在 batch size 较小时表现稳定。

3. LayerNorm

Layer Normalization 是在指定的维度上进行归一化,常用于自然语言处理(NLP)任务。

计算过程:

LayerNorm 可以应用于任意维度的输入,具体取决于 normalized_shape 参数。

假设输入是一个 ND 张量,形状为 (D1, D2, ..., DN),并且指定 normalized_shape 为最后 M 个维度。

归一化的维度是最后 M 个维度。

具体步骤如下:

  1. 计算均值和方差:

    在指定的维度上计算均值和方差。

    例如,如果输入形状是 (N, C, H, W),并且 normalized_shape = (H, W),则对于每个样本和每个通道,计算均值和方差:

    μ n , c = 1 H × W ∑ h = 1 H ∑ w = 1 W x n , c , h , w \mu_{n,c} = \frac{1}{H \times W} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n,c,h,w} μn,c=H×W1h=1Hw=1Wxn,c,h,w

    σ n , c 2 = 1 H × W ∑ h = 1 H ∑ w = 1 W ( x n , c , h , w − μ n , c ) 2 \sigma_{n,c}^2 = \frac{1}{H \times W} \sum_{h=1}^{H} \sum_{w=1}^{W} (x_{n,c,h,w} - \mu_{n,c})^2 σn,c2=H×W1h=1Hw=1W(xn,c,h,wμn,c)2

  2. 归一化:

    x ^ n , c , h , w = x n , c , h , w − μ n , c σ n , c 2 + ϵ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_{n,c}}{\sqrt{\sigma_{n,c}^2 + \epsilon}} x^n,c,h,w=σn,c2+ϵ xn,c,h,wμn,c

  3. 缩放和偏移:

    y n , c , h , w = γ n , c x ^ n , c , h , w + β n , c y_{n,c,h,w} = \gamma_{n,c} \hat{x}_{n,c,h,w} + \beta_{n,c} yn,c,h,w=γn,cx^n,c,h,w+βn,c

    其中, γ \gamma γ β \beta β 是可学习的参数,形状与 normalized_shape 相匹配。

特点:

  • 可以在任意维度上进行归一化,灵活性高。
  • 适用于序列数据,如 NLP 任务,因为可以在序列长度上进行归一化。
  • 不依赖于 batch size,适合小批量或在线推理。

总结

  • BatchNorm2d:在 batch 维度上归一化,适用于图像分类等任务,利用 batch 统计信息。
  • InstanceNorm2d:在每个样本上归一化,适用于风格迁移和生成任务,保留样本特征。
  • LayerNorm:在指定维度上归一化,适用于 NLP 和其他需要灵活归一化的任务。

推断阶段是否需要计算均值和方差?

在PyTorch中,BatchNorm2d 在训练阶段和推断阶段的行为是不同的,具体如下:


1. 训练阶段

在训练阶段,BatchNorm2d 会根据当前 mini-batch 的数据计算均值和方差,并使用这些统计量对数据进行归一化。同时,它会更新移动平均的均值(running_mean)和方差(running_var)。

更新公式如下:

running_mean = momentum × running_mean + ( 1 − momentum ) × batch_mean \text{running\_mean} = \text{momentum} \times \text{running\_mean} + (1 - \text{momentum}) \times \text{batch\_mean} running_mean=momentum×running_mean+(1momentum)×batch_mean

running_var = momentum × running_var + ( 1 − momentum ) × batch_var \text{running\_var} = \text{momentum} \times \text{running\_var} + (1 - \text{momentum}) \times \text{batch\_var} running_var=momentum×running_var+(1momentum)×batch_var

其中:

  • momentum 是一个超参数,通常设置为 0.1
  • batch_mean 是当前 mini-batch 的均值。
  • batch_var 是当前 mini-batch 的方差。

2. 推断阶段

在推断阶段,BatchNorm2d 不再使用当前 batch 的均值和方差,而是直接使用训练过程中积累的 running_meanrunning_var 来进行归一化。

归一化公式如下:

x ^ = x − running_mean running_var + ϵ \hat{x} = \frac{x - \text{running\_mean}}{\sqrt{\text{running\_var} + \epsilon}} x^=running_var+ϵ xrunning_mean

其中:

  • ( x ) 是输入数据。
  • ( \epsilon ) 是一个很小的常数,用于数值稳定性(通常为 1e-5)。
  • running_meanrunning_var 是训练阶段积累的移动平均值。

总结

  • 训练阶段BatchNorm2d 使用当前 mini-batch 的均值和方差进行归一化,并更新 running_meanrunning_var
  • 推断阶段BatchNorm2d 直接使用训练阶段积累的 running_meanrunning_var 进行归一化,不需要重新计算当前 batch 的均值和方差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值