-class Calibrator:
- def __init__(self, w=None, b=None):
- self.w = w
- self.b = b
- self.s, self.s_sq, self.n = 0, 0, 0
- self.mean, self.std = 0, 0
-
- def update(self, X):
- X = X.detach()
- self.s += X.sum(dim=0)
- self.s_sq += X.pow(2).sum(dim=0)
- self.n += X.size(0)
-
- def moments(self):
- mean = self.s / self.n
- std = (self.s_sq / self.n - mean * mean).sqrt()
- return mean, std
-
- def normalize(self):
- mean, std = self.moments()
- if self.b is not None:
- self.b.sub_(mean)
- if self.w is not None:
- self.w.div_(std)
- result = mean - self.mean, std - self.std
- self.mean, self.std = mean, std
- self.s, self.s_sq, self.n = 0, 0, 0
- return result
-
-