28 批量归一化【动手学深度学习v2】(笔记)

批量归一化是一种解决深度学习中训练速度不均和梯度消失问题的技术,通过规范化输入数据,调整每一层的分布。在训练时,它基于小批量数据计算均值和方差,而在预测时使用移动平均值。此外,该方法引入可学习参数伽马和贝塔,增强模型的表达能力,并允许使用更大的学习率。提供的代码展示了如何在PyTorch中实现批量归一化。
摘要由CSDN通过智能技术生成

一、批量归一化

1、有这样的问题,损失出现在最后,后面的层训练较快,但是前面的层训练较慢

批量规范化的发明者非正式地假设,这些变量分布中的这种偏移可能会阻碍网络的收敛。

j

 2、解决的思想是:假设把分布固定住,符合某一个分布;

批量规范化应用于单个可选层(也可以应用到所有层),其原理如下:在每次训练迭代中,我们首先规范化输入,即通过减去其均值并除以其标准差,其中两者均基于当前小批量处理。 接下来,我们应用比例系数和比例偏移。 正是由于这个基于批量统计的标准化,才有了批量规范化的名称。

 3、可以学的东西是 γ 和 β;伽马不是标准差,分母是标准差,伽马是scale;输入9个像素(3x3), 输出3通道,以通道作为列分量,每个像素都对应3列(输出通道=3),可以列出表格,按列求均值和方差,其实和全连接层一样的。即像素为样本,通道为特征。

 4、批量归一化在干嘛?

因为随机抽小批量出来算,随机就随机在了抽取这步上;

因为每次取得batch中的数据都是不同的,所以在batch中计算的均值和方差也是不同的,所以引入了随机性;

 5、总结,

我感觉从梯度消失的额角度能理解,由于多了两个可学参数,这就相当于也以更自由的弄出底部梯度消失的时候加大weight的剃度的情况,防止梯度消失;

固定是说固定的批量数,不是固定批量的均值和方差;

允许你用更大的学习率做训练

 二、代码实现

你直觉错了,归一化不会影响数据分布,它一点都不会影响精度,变好变坏都不会

import torch
from torch import nn
from d2l import torch as d2l


def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):
    # 通过is_grad_enabled来判断当前模式是训练模式还是预测模式
    if not torch.is_grad_enabled():
        # 如果是在预测模式下,直接使用传入的移动平均所得的均值和方差
        X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)
    else:
        assert len(X.shape) in (2, 4) 
        #2是全连接层;4是卷积层
        #批量数+通道数+图片高+图片宽 =4
        if len(X.shape) == 2:
            # 使用全连接层的情况,计算特征维上的均值和方差
            mean = X.mean(dim=0)
            var = ((X - mean) ** 2).mean(dim=0)
        else:
            # 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。
            # 这里我们需要保持X的形状以便后面可以做广播运算
            mean = X.mean(dim=(0, 2, 3), keepdim=True)
            var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True)
        # 训练模式下,用当前的均值和方差做标准化
        X_hat = (X - mean) / torch.sqrt(var + eps)
        # 更新移动平均的均值和方差
        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
        moving_var = momentum * moving_var + (1.0 - momentum) * var
    Y = gamma * X_hat + beta  # 缩放和移位
    return Y, moving_mean.data, moving_var.data

三、问题回复

例如,我们可能需要使用我们的模型对逐个样本进行预测。 一种常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值