深度学习——批量归一化

批量归一化(Batch Normalization)

流程:

\[x \rightarrow W_{h_1} \cdot x + b_{h_1} \rightarrow s_1 \rightarrow \frac{s_1 - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} \rightarrow s_2 \rightarrow \gamma \cdot s_2 + \beta \rightarrow s_3 \]

先对数据标准化,再对数据重构(缩放+平移),公式如下:

\[f(x) = \lambda \cdot \frac{x - \mathrm{E}(x)}{\sqrt{\mathrm{Var}(x) + \epsilon}} + \beta \]

  1. \(\lambda\)\(\beta\) 是可学习的参数,它相当于对标准化后的值做了一个线性变换,\(\lambda\) 为系数,\(\beta\) 为偏置;
  2. \(\epsilon\) 通常指为 \(\mathrm{1e}{-5}\),避免分母为 0;
  3. \(\mathrm{E}(x)\) 表示变量的均值;
  4. \(\mathrm{Var}(x)\) 表示变量的方差;

批量归一化层在计算机视觉领域使用较多。

代码实现

导包与思路介绍

"""
案例:
    代码演示批量归一化,也属于正则化的一种,用于缓解模型过拟合情况
批量归一化:
    思路:
        先对数据做标准化(会丢失一些信息),然后再对数据进行缩放(λ,理解为:w权重)和平移(β,理解为:b偏置),再找补回一些信息
    应用场景:
        在计算机视觉领域应用较多
"""

import torch
import torch.nn as nn

1. 定义函数,处理二维数据

def dm01():
    # 1. 创建图像样本数据
    # 1张图片,2个通道,3行4列(像素点)
    input_2d = torch.randn(size=(1,2,3,4))
    print(f'input_2d:{input_2d}')

    # 2. 创建批量归一化层(BN层)
    # 参1:输入特征数 = 图片的通道数
    # 参2:噪声值(小常数),默认为1e-5
    # 参3:动量值,用于计算移动平均统计量的动量值
    # 参4:表示使用科学系的变换参数(λ,β),对归一化(标准化)后的数据进行缩放和平移
    bn2d = nn.BatchNorm2d(num_features=2,eps=1e-05,momentum=0.1,affine=True)

    # 3. 对数据进行 批量归一化处理
    output_2d = bn2d(input_2d)
    print(f'output_2d:{output_2d}')

2. 定义函数数,处理:一维数据

def dm02():
    # 1. 创建样本数据
    # 2行2列,每个样本有两个特征
    input_1d = torch.randn(size=(2,2))
    print(f'input_1d:{input_1d}')
    # 2. 创建线性层
    linear1 = nn.Linear(2,4)

    # 3. 对数据进行线性变换
    l1 = linear1(input_1d)
    print(f'l1:{l1}')

    # 4.创造批量归一化层
    bn1d = nn.BatchNorm1d(num_features=4)

    # 5. 对线性结果l1进行批量归一化处理
    output_1d = bn1d(l1)
    print(f'output_1d:{output_1d}')

3.测试

if __name__ == '__main__':
    dm02()
posted @ 2026-07-17 20:46  王新文  阅读(3)  评论(0)    收藏  举报