一文读懂BatchNorm2d()函数的计算逻辑

1.简介

机器学习中,进行模型训练之前,需对数据做归一化处理,使其分布一致。在深度神经网络训练过程中,通常一次训练是一个batch,而非全体数据。每个batch具有不同的分布产生了internal covarivate shift问题------在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难。Batch Normalization将数据规范到均值为0,方差为1的分布上,一方面使得数据分布一致,另一方面避免梯度消失。

2.计算

如图所示:

上为输入数据,其shape=[5, 3, h, w]

Step1: 计算同一通道下的均值,如图中的红色图块,均表示同一通道

Step2: 计算同一通道下的方差,如图中的红色图块,均表示同一通道

Step3: 对当前通道下的每个数据做归一化 其中的x表示具体的一个点,如x = X[0][0][0][0][0]这个数据点。

Step4: 增加缩放和平移变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> γ \gamma </math>γ和 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β, 归一化后的值为

其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> ϵ \epsilon </math>ϵ是一个设置的常量,默认为1e^-5,其作用是防止除0。 <math xmlns="http://www.w3.org/1998/Math/MathML"> γ \gamma </math>γ和 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β这两个参数一般情况也不需要我们管(如果,参数affine=true, 就需要我们给定)。

3. Pytorch中的nn.BatchNorm2d()函数的解释

其主要需要输入4个参数:

(1)num_features:输入数据的shape一般为[batch_size, channel, height, width], num_features为其中的channel;

(2)eps: 分母中添加的一个值,目的是为了计算的稳定性,默认:1e-5;

(3)momentum : 一个用于运行过程中均值和方差的一个估计参数,默认值为0.1.

(4)affine :当设为true时,给定可以学习的系数矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> γ \gamma </math>γ和 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β

4.代码示例:

scss 复制代码
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)

运行结果:

(1)原数据

(2)使用BatchNorm()函数

(3)自行计算批归一化的值 图中标红的两个框数据完全相等,完结撒花!!!

注: 有借鉴该篇文章

相关推荐
AICodeThunder1 小时前
C++知识点总结(57):STL综合
java·c++·算法
薔薇十字1 小时前
【代码随想录day32】【C++复健】509. 斐波那契数;70. 爬楼梯;746. 使用最小花费爬楼梯
开发语言·c++·算法
White graces1 小时前
力扣(LeetCode)283. 移动零(Java)
算法·leetcode
液态不合群1 小时前
Rust字符串类型全解析
网络·算法·rust
理论最高的吻1 小时前
222. 完全二叉树的节点个数【 力扣(LeetCode) 】
c++·算法·leetcode·职场和发展·二叉树
旧日之血_Hayter1 小时前
LeetCode105.从前序与中序遍历构造二叉树
算法·leetcode
Fms_Sa2 小时前
假设一棵平衡二叉树的每个结点都表明了平衡因子b,试设计一个算法,求平衡二叉树的高度。
c语言·数据结构·算法
yangmc042 小时前
区间和 离散化 模板题
c语言·数据结构·c++·算法·矩阵·objective-c
No0d1es2 小时前
2024年9月青少年软件编程(C语言/C++)等级考试试卷(七级)
c语言·开发语言·c++·算法·青少年编程·电子学会·七级
Lindsey_feiren2 小时前
代码随想录算法训练营day41|动态规划04
算法·leetcode·动态规划