文章目录
- 一、基本原理
- 二、函数说明
在卷积神经网络的卷积层之后通常会添加torch.nn.BatchNorm2d()
进行数据的归一化处理,将数据规范到均值为0,方差为一的分布上,使得数据在进行Relu时不会因为数据过大而导致网络性能的不稳定。
一、基本原理
深度学习输入数据的格式为
(
B
,
C
,
H
,
W
)
(B,C,H,W)
(B,C,H,W),假设当前输入的图像数据格式为
(
5
,
3
,
h
,
w
)
(5,3,h,w)
(5,3,h,w),则五张RGB图像中R通道对应的索引为:
【Step1】torch.nn.BatchNorm2d()
会计算R通道下像素的均值
【Step2】torch.nn.BatchNorm2d()
会计算R通道下像素的方差
【Step3】torch.nn.BatchNorm2d()
对该通道下的所有像素值归一化处理
【Step3】torch.nn.BatchNorm2d()
还会按照给出的缩放和平移变量
γ
γ
γ和
β
β
β进行处理:
综上,计算公式为:
其中,
ϵ
ϵ
ϵ是一个设置的常量,默认为
1
0
−
5
10^{-5}
10−5,其作用是防止除0。
二、函数说明
函数声明为:
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)
num_features
:输入图像数据的通道数。eps
:分母加上的常量,避免除0。momentum
:一个用于运行过程中均值和方差的一个估计参数,默认值为0.1。affine
:当设为true时,给定可以学习的系数矩阵 γ γ γ和 β β β。
import torch
data = torch.ones(size=(2, 2, 3, 4))
data[0][0][0][0] = 25
print("data = ", data)
print("\n")
print("=========================使用封装的BatchNorm2d()计算================================")
BN = torch.nn.BatchNorm2d(num_features=2, eps=0, momentum=0)
BN_data = BN(data)
print("BN_data = ", BN_data)
print("\n")
print("=========================自行计算================================")
x = torch.cat((data[0][0], data[1][0]), dim=1) # 1.将同一通道进行拼接(即把同一通道当作一个整体)
x_mean = torch.Tensor.mean(x) # 2.计算同一通道所有制的均值(即拼接后的均值)
x_var = torch.Tensor.var(x, False) # 3.计算同一通道所有制的方差(即拼接后的方差)
# 4.使用第一个数按照公式来求BatchNorm后的值
bn_first = ((data[0][0][0][0] - x_mean) / ( torch.pow(x_var, 0.5))) * BN.weight[0] + BN.bias[0]
print("bn_first = ", bn_first)
- 原始数据:
- 使用
torch.nn.BatchNorm2d
- 手动计算归一化结果