实验小测 BatchNorm2D 层对梯度传导的影响 (batchnorm层减去均值和除以标准差这两个步骤所使用的tensor是否detach)

        如今BatchNorm层已经广泛被应用于各种神经网络内,为了更加深入的了解该层的输出结果反向传播梯度的细节,提出问题:batchnorm层减去均值和除以标准差这两个步骤所使用的tensor是否做了detach处理?做了简单的测试,测试过程如下:
        首先建立好实验所需数据,图片的batchsize=2,其CHW三个属性都为1,方便计算。对于bn层,为了更直观的得到结果,将affine设置为False,eps设置为0.

from torch.nn import functional as F
import torch.nn as nn
import torch

img  = torch.tensor([0, 2.0]).view(2, 1, 1, 1)
conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=1, bias=False)
conv.weight.data = torch.tensor([1.0]).view(1, 1, 1, 1)
bn   = nn.BatchNorm2d(num_features=1, affine=False, eps=0.0)
out = conv(img)
print(out)
out = bn(out)
print(out)
out[1][0][0][0].backward()
print(conv.weight.grad)
#打印结果
tensor([[[[0.]]],


        [[[2.]]]], grad_fn=<MkldnnConvolutionBackward>)
tensor([[[[-1.]]],


        [[[ 1.]]]], grad_fn=<NativeBatchNormBackward>)
tensor([[[[0.]]]])

Process finished with exit code 0

结果中的梯度值为0,如果batchnorm层减去均值和除以标准差这两个步骤所使用的tensor做了detach处理,即(ax - m) / var中m和war是常数 梯度值不应为 0 而应该为 x / var = 2,batchnorm层减去均值和除以标准差这两个步骤所使用的tensor没有进行detach处理。

你可能感兴趣的:(深度学习,pytorch)