对于BN的定义公式网上都能查到,但在具体应用的时候对于不同维度的数据到底是怎么进行操作的呢?
Tensorflow,Pytorch,Keras对于BN都有现成的包,使用时直接调用就行,其中pytorch中又具体分了bn1,bn2,bn3,首先看看他们的文档说明
help(nn.BatchNorm1d)
help(nn.BatchNorm2d)
可以看到,不管是二维、三维或者是四维数据,核心是通道数C,在pytorch中就是数据的第二个维度,然后接下来的操作就是对各个维度上的N个数据进行求平均、标准差、归一化操作。
举例说明
对于数据
input1 = torch.tensor([[1., 2, 3],[4, 5, 6]])
维度为(2,3)其中2是batch size 的大小,3是通道数,那BN的过程就是对3个通道上的所有数据进行操作
直接用BN函数得到结果为:
其中3是通道数,也就是需要归一化的维度
接下来是验证
①计算各个通道数的均值,注意,单个有3个维度,一共有batch size=2个数据,均值就是对各个维度上的2个数据进行求平均,后面的多维数据也可以这样想
②计算标准差
③得到BN输出
那么如果将上述数据维度变化为(2,1,3),那对于这个3维数据,2是输入的batch-size,1就变成了通道数,这时候就是对这一个通道上的所有数据进行求平均、方差
直接用BN函数得到结果:
验证
①求均值
②求标准差
③得到BN输出
对于深度学习中常用的四维数据,一文搞懂BN的原理及其实现过程 这篇文章里的两幅图很容易帮助我们理解
在Tensorflow中,默认是对最后一维数据,比如(N,256,256,3),此时就是分别对3个通道上的N256256个数据求平均。而Pytorch中数据形式是(N,C,H,W),即第一个是batch样本数,第二个是通道数。
总之,不管是哪个框架下的BN,在理解的时候要找到是对数据的哪一个维度进行操作的,然后再结合上面的几个例子,应该就可以很好的理解BN操作的具体过程。