【原创文章,转载请注明出处,栓Q】
众所周知,Batchnorm2d是用来归一化4D数据的,即input的shape是
import torch
bn=torch.nn.BatchNorm2d(num_features=3)
#input是<2,3,2,2>一批2个样本,每个样本有3个通道,每个通道都是一个2*2的矩阵
data1=[[[[1.,2.],[-3.,-4.]],[[5.,6.],[7.,8.]],[[9.,-10.],[11.,-12.]]],
[[[-1., -2.], [3., 4.]], [[-5., -6.], [-7., -8.]], [[-9., 10.], [-11., 12.]]]
]
input1 = torch.tensor(data=data1)
output1=bn(input1)
print(input1)
print(output1)
print(output1.shape)
运行后输出结果是这样的:
tensor([[[[ 1., 2.],
[ -3., -4.]],
[[ 5., 6.],
[ 7., 8.]],
[[ 9., -10.],
[ 11., -12.]]],
[[[ -1., -2.],
[ 3., 4.]],
[[ -5., -6.],
[ -7., -8.]],
[[ -9., 10.],
[-11., 12.]]]])
tensor([[[[ 0.3651, 0.7303],
[-1.0954, -1.4606]],
[[ 0.7581, 0.9097],
[ 1.0613, 1.2130]],
[[ 0.8523, -0.9470],
[ 1.0417, -1.1364]]],
[[[-0.3651, -0.7303],
[ 1.0954, 1.4606]],
[[-0.7581, -0.9097],
[-1.0613, -1.2130]],
[[-0.8523, 0.9470],
[-1.0417, 1.1364]]]], grad_fn=)
torch.Size([2, 3, 2, 2])
看起来还是不那么友好,于是,我去画了图,看下面:
总结:很神奇的一件事是,自己手动计算怎么都得不到代码计算的结果,可能存在一些参数设置,代码也打不开,不知道具体的值。但是,通过这种设置正负对陈值的方式可以知道,Batchnorm2d是在同一通道下,不同样本的像素点(就是一个单元格)上进行的归一化。



