[MXNet]Lecture04批量归一化

本文介绍如何从零开始实现批量规范化(batch normalization),包括针对全联接层和卷积层的不同处理方式,并探讨了训练与测试阶段的差异及移动平均方法的应用。

从零开始实现:


from mxnet import ndarray as nd

def pure_batch_norm(X,gemma,beta,eps=1e-5):
	assert len(X.shape) in (2,4)
	if len(X.shape)==2:
		mean=X.mean(axis=0)
		variance=((X-mean)**2).mean(axis=0)

	else:
		mean=X.mean(axis=(0,2,3),keepdims=True)
		variance=((X-mean)**2).mean(axis=(0,2,3),keepdims=True)

	print("mean",mean)
	print("gemma",gemma)
	print("gemma.reshape",gemma.reshape(mean.shape))

	x_hat=(X-mean)/nd.sqrt(variance+eps)
	return gemma.reshape(mean.shape)*x_hat+beta.reshape(mean.shape)

X=nd.arange(6).reshape((3,2))
y=pure_batch_norm(X,gemma=nd.array([1,1]),beta=nd.array([0,0]))
print(y)
X2=nd.arange(36).reshape((1,4,3,3))
y2=pure_batch_norm(X2,gemma=nd.array([1,1,1,1]),beta=nd.array([0,0,0,0]))
print(y2)

对于全联接层来说,输入是二维,要针对每一个特征进行归一化,所以有几列(axis=1方向),gemma就有几个数。

对于卷积层来说,输入是四维,针对每一个channel进行归一化,所以有几个channel(axis=1方向),gemma就有几个数。

如果把测试时的情况考虑进来,可以用移动平均的方法:

from mxnet import ndarray as nd
def batch_norm(x,gemma,beta,istraining,moving_mean,moving_variance,moving_momentum,eps=1e-5):
	assert len(x.shape) in (2,4)
	if len(x.shape)==2:
		mean=x.mean(axis=0)
		variance=((x-mean)**2).mean(axis=0)
	else:
		mean=x.mean(axis=(0,2,3),keepdims=True)
		variacne=((x-mean)**2).mean(axis=(0,2,3),keepdims=True)
		moving_mean=moving_mean.reshape(mean.shape)
		moving_variance=moving_variance.reshape(variance.shape)
	print(x)

	if istraining:
		x_hat=(x-mean)/nd.sqrt(variance+eps)
		moving_mean[:]=moving_momentum*moving_mean+(1.-moving_momentum)*mean	
		moving_variance[:]=moving_momentum*moving_variance+(1.-moving_momentum)*variance

	else:
		x_hat=(x-moving_mean)/nd.sqrt(moving_variance+eps)
	print('moving_mean',moving_mean)
	print('moving_variacne',moving_variance)
	print(x_hat)
	return x_hat*gemma.reshape(mean.shape)+beta.reshape(mean.shape)
moving_mean=nd.zeros(2)
moving_variance=nd.zeros(2)



gluon实现



<think>好的,我需要回答用户关于空间批量归一化(Spatial Batch Normalization)的实现与原理的问题。首先,我需要回顾Batch Normalization的基础知识,因为Spatial BN是其扩展。根据引用[2]和[4],标准BN是在每个神经元的激活输入上,按batch进行归一化处理的是全连接层或卷积层后的每个特征通道的标量数据。 接下来,Spatial BN主要应用于卷积神经网络。卷积层的输出是四维张量(batch, channels, height, width),常规BN会对每个通道的所有元素进行归一化。但Spatial BN可能在这里有不同的处理方式?需要确认具体操作。根据引用[1],不同归一化方法如Layer Norm、Group Norm等处理维度不同,而Spatial BN可能在空间维度上保留更多信息。 查阅资料,标准BN在卷积层中,对每个通道的整个batch和空间位置(HxW)计算均值和方差,然后归一化。这实际上就是Spatial Batch Normalization,因为它在空间维度上展开。可能用户提到的“spatial”是指保留空间信息,而实现上和常规BN在卷积层的应用一致。 引用[5]提到MXNet转ONNX时遇到spatial属性错误,可能涉及框架实现差异。例如,某些框架可能在BN层中保留spatial参数,但ONNX不支持。因此,在实现时需注意参数兼容性。 总结,Spatial BN的原理与标准BN相同,但在卷积网络中,归一化统计量计算覆盖了空间维度,保持通道独立性。实现时,对于四维输入,沿(N,H,W)轴计算均值和方差,每个通道单独处理。代码示例可展示如何计算,并引用相关文献如[2][4]中的公式。</think>### 空间批量归一化(Spatial Batch Normalization)的实现与原理 #### 1. **核心原理** 空间批量归一化(Spatial BN)是标准批量归一化(Batch Normalization, BN)在卷积神经网络中的扩展。其核心思想是**对卷积层的特征图(Feature Map)进行归一化**,具体步骤如下: - **输入数据维度**:卷积层输出为四维张量 $(\text{Batch}, \text{Channels}, \text{Height}, \text{Width})$。 - **统计量计算**:对每个通道(Channel)单独计算均值和方差,但统计范围覆盖整个 Batch 和所有空间位置(Height × Width)。即: $$ \mu_c = \frac{1}{B \cdot H \cdot W} \sum_{b=1}^B \sum_{h=1}^H \sum_{w=1}^W x_{b,c,h,w} $$ $$ \sigma_c^2 = \frac{1}{B \cdot H \cdot W} \sum_{b=1}^B \sum_{h=1}^H \sum_{w=1}^W (x_{b,c,h,w} - \mu_c)^2 $$ 其中 $c$ 为通道索引[^2][^4]。 - **归一化与变换**:对每个通道进行缩放和平移,引入可学习参数 $\gamma_c$ 和 $\beta_c$: $$ \hat{x}_{b,c,h,w} = \gamma_c \cdot \frac{x_{b,c,h,w} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}} + \beta_c $$ 其中 $\epsilon$ 是为数值稳定性添加的小常数。 #### 2. **实现方法** 在代码中,Spatial BN 的实现需注意以下步骤: 1. **沿特定维度计算统计量**:对四维输入,沿 Batch、Height、Width 维度计算均值和方差。 2. **训练与推理模式分离**: - **训练阶段**:使用当前 Batch 的统计量,并更新全局移动平均(用于推理)。 - **推理阶段**:使用训练时累积的全局均值和方差[^2]。 **PyTorch 示例**: ```python import torch.nn as nn # 定义Spatial BN层(对Channels数=64的卷积层输出归一化) spatial_bn = nn.BatchNorm2d(num_features=64) # 前向传播 input_tensor = torch.randn(32, 64, 128, 128) # (Batch, Channels, H, W) output = spatial_bn(input_tensor) ``` #### 3. **与标准BN的区别** - **标准BN**:适用于全连接层,对每个特征(标量)独立归一化。 - **Spatial BN**:针对卷积层,保留通道独立性,同时在空间维度(H, W)上展开统计,避免破坏卷积的局部相关性[^1]。 #### 4. **注意事项** - **框架兼容性**:部分框架(如 MXNet)可能对 `spatial` 参数支持不完整,转换到 ONNX 时需检查属性兼容性[^5]。 - **小批量问题**:当 Batch Size 较小时,统计量估计不准确,可考虑使用 Group Normalization 替代。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值