"""
演示
    批量归一化，属于正则化方法，缓解 模型过拟合，主要用于CV计算机视觉，比如CNN网络

批量归一化：
    先标准化为均值0，方差1的分布，然后再进行重构(缩放+平移，缩放系数和平移系数都是可学习的)，进一步提取特征

涉及到的API：
    CV计算机视觉领域
    BatchNorm2d: 处理4D数据，主要用于二维卷积神经网络Conv2d来处理图片数据，NCHW,(N,C,H,W), N批次大小，C通道数，H高度，W宽度
    BatchNorm1d: 处理2D/3D数据，主要用于处理文本数据/序列数据，NCS
    BatchNorm3d: 处理5D数据，主要用于三维卷积神经网络Conv3d,来处理高维的视觉数据，比如医学图像，卫星遥感视频，接收形状为 NCDHW/NCTHW 的张量作为输入。

需要掌握的：
    针对CV方向，BatchNorm2d

"""

# 导包
import torch
import torch.nn as nn

# 定义函数，演示 BatchNorm2d 批量归一化, 处理4D数据，NCHW
def demo01():
    # 1.创建数据，模拟NCHW图片数据 torch.randint(0,256,size=(2,3,32,32))
    x = torch.randint(0,256,size=(1,3,32,32)).to(dtype=torch.float32)
    print(f"原始数据x:{x}, shape: {x.shape}")
    # 2.创建BatchNorm2d层
    # running_mean = (1 - momentum) * running_mean + momentum * batch_mean
    # running_var = (1 - momentum) * running_var + momentum * batch_var
    bn2d = nn.BatchNorm2d(
        num_features=3, # 通道数，C
        eps=1e-05,  # 极小值，防止除零
        momentum=0.1,   # 动量，控制参数的更新
        affine=True,    # 缩放参数和平移参数是否可学习
    )

    # 3.输入数据到BatchNorm2d层中
    y = bn2d(x)   # (1,3,32,32)
    # 4.打印输出
    print(f"处理后的数据y:{y}, shape: {y.shape}")

# 测试
if __name__ == '__main__':
    demo01()