python batchnorm2d_BatchNorm2d()理解

本文详细解析了BatchNorm2d在深度学习中的作用,介绍了其数学原理、参数设置(如num_features、eps、momentum和affine),并通过代码实例展示了如何进行数据归一化。重点在于解释其为何有助于网络稳定性和参数学习。
摘要由CSDN通过智能技术生成

BatchNorm2d()理解

基本原理

在卷积神经网络的卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定,BatchNorm2d()函数数学原理如下:

BatchNorm2d()内部的参数如下:

1.num_features:一般输入参数为batch_sizenum_featuresheight*width,即为其中特征的数量

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

3.momentum:一个用于运行过程中均值和方差的一个估计参数(我的理解是一个稳定系数,类似于SGD中的momentum的系数)

4.affine:当设为true时,会给定可以学习的系数矩阵gamma和beta

上面的讲解还不够形象,我们具体通过如下的代码进行讲解:

代码演示

#encoding:utf-8

import torch

import torch.nn as nn

#num_features - num_features from an expected input of size:batch_sizenum_featuresheight*width

#eps:default:1e-5 (公式中为数值稳定性加到分母上的值)

#momentum:动量参数,用于running_mean and running_var计算的值,default:0.1

m=nn.BatchNorm2d(2,affine=True) #affine参数设为True表示weight和bias将被使用

input=torch.randn(1,2,3,4)

output=m(input)

print(input)

print(m.weight)

print(m.bias)

print(output)

print(output.size())

具体的输出如下:

tensor([[[[ 1.4174, -1.9512, -0.4910, -0.5675],

[ 1.2095, 1.0312, 0.8652, -0.1177],

[-0.5964, 0.5000, -1.4704, 2.3610]],

[[-0.8312, -0.8122, -0.3876, 0.1245],

[ 0.5627, -0.1876, -1.6413, -1.8722],

[-0.0636, 0.7284, 2.1816, 0.4933]]]])

Parameter containing:

tensor([0.2837, 0.1493], requires_grad=True)

Parameter containing:

tensor([0., 0.], requires_grad=True)

tensor([[[[ 0.2892, -0.4996, -0.1577, -0.1756],

[ 0.2405, 0.1987, 0.1599, -0.0703],

[-0.1824, 0.0743, -0.3871, 0.5101]],

[[-0.0975, -0.0948, -0.0347, 0.0377],

[ 0.0997, -0.0064, -0.2121, -0.2448],

[ 0.0111, 0.1232, 0.3287, 0.0899]]]],

grad_fn=)

torch.Size([1, 2, 3, 4])

分析:输入是一个1234 四维矩阵,gamma和beta为一维数组,是针对input[0][0],input[0][1]两个34的二维矩阵分别进行处理的,我们不妨将input[0][0]的按照上面介绍的基本公式来运算,看是否能对的上output[0][0]中的数据。首先我们将input[0][0]中的数据输出,并计算其中的均值和方差。

print(“输入的第一个维度:”)

print(input[0][0]) #这个数据是第一个3*4的二维数据

#求第一个维度的均值和方差

firstDimenMean=torch.Tensor.mean(input[0][0])

firstDimenVar=torch.Tensor.var(input[0][0],False) #false表示贝塞尔校正不会被使用

print(m)

print(‘m.eps=’,m.eps)

print(firstDimenMean)

print(firstDimenVar)

输出结果如下:

输入的第一个维度:

tensor([[ 1.4174, -1.9512, -0.4910, -0.5675],

[ 1.2095, 1.0312, 0.8652, -0.1177],

[-0.5964, 0.5000, -1.4704, 2.3610]])

BatchNorm2d(2, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

m.eps= 1e-05

tensor(0.1825)

tensor(1.4675)

我们可以通过计算器计算出均值和方差均正确计算。最后通过公式计算input[0][0][0][0]的值,代码如下:

batchnormone=((input[0][0][0][0]-firstDimenMean)/(torch.pow(firstDimenVar,0.5)+m.eps))

*m.weight[0]+m.bias[0]

print(batchnormone)

输出结果如下:

tensor(0.2892, grad_fn=)

batchnorm2d()中的参数为实际的输入的特征数也就是通道数,对其进行归一化的时候,每个通道分别对应batchnorm2d()的参数。

如:

bn = nn.BatchNorm2d(4)

那么bn.weight.shape应该是(4,)

也就是说在归一化中第一个通道用到的均值和方差以及gamma均为bn.weight.data[0]

————————————————

原文链接:https://blog.csdn.net/bigFatCat_Tom/article/details/91619977

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值