pytorch 与 BatchNormalization

BatchNormallization是神经网络中的一个正则化技术,可以加速网络的收敛,并且在一定程度上解决深度网络“梯度弥散”的问题。它本是数据预处理的一种方法,google的研究人员将它应用在了神经网络中。论文地址:https://arxiv.org/abs/1502.03167

理论

pytorch batch normalization: http://pytorch.org/docs/master/nn.html#normalization-layers
对于输入 x={x1,x2,,xN}T ,输出 y={y1,y2,,yN}T ,其中 N 表示特征维数(feature map的个数)。
xn={xn1,xn2,,xnM} 表示 x 的第 n 维上的M个数据。注意,Batch Normalization是在特征的每一维上进行正则化的,不同特征维度之间相互独立。

ynm=xnmμnσn×weightn+biasn
μn=m=1Mxnm
σn=Mm=1(xnmμn)2N

其中如果 weight=1,bias=0 ,则是把数据的每一维都归一化到均值为0,方差为1。加上 weight bias 后是把数据归一化为标准差为 weightn 均值为 μn

实验

>>> import torch
>>> import torch.nn as nn
>>>> from torch.autograd import Variable
>>> bn=nn.BatchNorm1d(3);
>>>> bn.weight
Parameter containing:
 0.8645
 0.9457
 0.2024
[torch.FloatTensor of size 3]
>>> bn.bias
Parameter containing:
 0
 0
 0
[torch.FloatTensor of size 3]
>>> bn.weight=nn.Parameter(torch.Tensor([1,1,1]));
>>>> bn.weight
Parameter containing:
 1
 1
 1
[torch.FloatTensor of size 3]
>>> bn(Variable(torch.Tensor([[1,2,3],[2,3,4]])))
Variable containing:
-1.0000 -1.0000 -1.0000
 1.0000  1.0000  1.0000
[torch.FloatTensor of size 2x3]
>>> bn.weight=nn.Parameter(torch.Tensor([1,2,3]))
>>> bn(Variable(torch.Tensor([[1,2,3],[2,3,4]])))
Variable containing:
-1.0000 -2.0000 -2.9999
 1.0000  2.0000  2.9999
[torch.FloatTensor of size 2x3]
>>> bn.bias=nn.Parameter(torch.Tensor([0.1, 0.2, 0.3]))
>>> bn(Variable(torch.Tensor([[1,2,3],[2,3,4]])))
Variable containing:
-0.9000 -1.8000 -2.6999
 1.1000  2.2000  3.2999
[torch.FloatTensor of size 2x3]

猜你喜欢

转载自blog.csdn.net/smallflyingpig/article/details/78862525
今日推荐