『Pytorch』BatchNorm

本文深入解析BatchNormalization技术,探讨其在深度学习模型中的作用与优势,包括加速模型收敛、简化权值初始化等。并详细介绍了PyTorch中BatchNorm1d、BatchNorm2d和BatchNorm3d的具体应用。

1. Batch Normalization

  • 批:一批数据,通常为mini batch
  • 标准化: 0均值,1方差
  • 优点:
    1. 可以用更大的学习率,加速模型收敛
    2. 可以不用精心设计权值初始化
    3. 可以不用Dropout或较小的Dropout
    4. 可以不用L2或较小的权重衰减
    5. 可以不用local response normalization

2. BatchNorm

  • nn.BatchNorm1d
  • nn.BatchNorm2d
  • nn.BatchNorm3d
# 三个方法都继承自基类_BatchNorm,下面是它的初始化方法
def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True):
    pass

主要参数:

  • num_features: 一个样本特征数量(最重要)
  • eps: 分母修正项
  • momentum: 指数加权平均估计当前mean/var
  • affine: 是否需要 affine transform
  • track_running_stats: 是训练状态还是测试状态

在这里插入图片描述

三个具体方法的主要属性:

  • running_mean: 均值
  • running_var: 方差
  • weight: affine transform中的 γ\gammaγ
  • bias: affine transform中的 β\betaβ

weight和bias都是指数加权平均得到的,后一个mini-batch要考虑前一个mini-batch

input = batch_size * 特征数 * 特征的维度

  • 特征的维度就是shape,是一个元祖,可以是多维

  • 特征数例如BP网络中的一层神经元的个数,或者CNN中的每一层输出的feature maps 的个数(类似最一开始输入的图像的channel数)

PyTorch中的Batch Normalization (BN) 层是一种常用的神经网络层,用于加速训练过程并提升模型性能。它通过规范化输入特征的均值和方差,使其在每一批数据上具有相似的分布。 如果你想要自实现BatchNorm2D,你需要考虑以下几个关键步骤: 1. **统计计算**:首先,对于每个批次的输入张量,你需要计算当前批次所有元素的平均值(mean)和标准差(stddev)。这通常是通过对每个通道(channel-wise)的数据求平均和std来完成的。 ```python def compute_stats(input): mean = input.mean(dim=(0, 2, 3), keepdim=True) std = input.std(dim=(0, 2, 3), unbiased=False, keepdim=True) return mean, std ``` 2. **标准化**:接着,对输入做标准化处理,即将每个元素减去平均值除以标准差,然后缩放和平移(通常乘以gamma参数和加偏置beta)。 ```python def normalize(input, mean, std, gamma, beta): return gamma * (input - mean) / std + beta ``` 3. **使用储存的统计信息**:如果是在训练过程中,并且有累积模式(train=True),你需要跟踪历史统计信息;而在测试或推理阶段(train=False),则应使用上面计算得到的最新统计信息。 4. **反向传播**:最后,你需要为梯度下降提供导数,这意味着当你更新权重(gamma和beta)时,需要回传对应的误差。 完整实现可能如下: ```python class CustomBatchNorm2d(torch.nn.Module): def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True): super().__init__() self.num_features = num_features self.eps = eps self.momentum = momentum self.affine = affine if self.affine: self.gamma = torch.nn.Parameter(torch.ones(num_features)) self.beta = torch.nn.Parameter(torch.zeros(num_features)) def forward(self, x): # 计算并储存统计信息 if not self.training or self.momentum == 0: mean, var = compute_stats(x) running_mean = mean running_var = var else: running_mean, running_var = self.running_mean, self.running_var normalized_x = normalize(x, running_mean, running_var, self.gamma, self.beta) # 更新统计信息(如果训练) if self.momentum != 0: self.running_mean = self.momentum * running_mean + (1 - self.momentum) * x.mean(dim=(0, 2, 3), keepdim=True) self.running_var = self.momentum * running_var + (1 - self.momentum) * x.var(dim=(0, 2, 3), unbiased=False, keepdim=True) return normalized_x @property def running_mean(self): return getattr(self, '_running_mean', None) @running_mean.setter def running_mean(self, value): self._running_mean = value @property def running_var(self): return getattr(self, '_running_var', None) @running_var.setter def running_var(self, value): self._running_var = value ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值