深度学习——批量归一化
批量归一化(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
\]
- \(\lambda\) 和 \(\beta\) 是可学习的参数,它相当于对标准化后的值做了一个线性变换,\(\lambda\) 为系数,\(\beta\) 为偏置;
- \(\epsilon\) 通常指为 \(\mathrm{1e}{-5}\),避免分母为 0;
- \(\mathrm{E}(x)\) 表示变量的均值;
- \(\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()

浙公网安备 33010602011771号