| 27 | |
| 28 | |
| 29 | class NumericTestCase(TorchTestCase): |
| 30 | def testNumericBatchNorm(self): |
| 31 | a = torch.rand(16, 10) |
| 32 | bn = nn.BatchNorm2d(10, momentum=1, eps=1e-5, affine=False) |
| 33 | bn.train() |
| 34 | |
| 35 | a_var1 = Variable(a, requires_grad=True) |
| 36 | b_var1 = bn(a_var1) |
| 37 | loss1 = b_var1.sum() |
| 38 | loss1.backward() |
| 39 | |
| 40 | a_var2 = Variable(a, requires_grad=True) |
| 41 | a_mean2 = a_var2.mean(dim=0, keepdim=True) |
| 42 | a_std2 = torch.sqrt(handy_var(a_var2, unbias=False).clamp(min=1e-5)) |
| 43 | # a_std2 = torch.sqrt(a_var2.var(dim=0, keepdim=True, unbiased=False) + 1e-5) |
| 44 | b_var2 = (a_var2 - a_mean2) / a_std2 |
| 45 | loss2 = b_var2.sum() |
| 46 | loss2.backward() |
| 47 | |
| 48 | self.assertTensorClose(bn.running_mean, a.mean(dim=0)) |
| 49 | self.assertTensorClose(bn.running_var, handy_var(a)) |
| 50 | self.assertTensorClose(a_var1.data, a_var2.data) |
| 51 | self.assertTensorClose(b_var1.data, b_var2.data) |
| 52 | self.assertTensorClose(a_var1.grad, a_var2.grad) |
| 53 | |
| 54 | |
| 55 | if __name__ == '__main__': |
nothing calls this directly
no outgoing calls
no test coverage detected