diff --git a/mindarmour/privacy/diff_privacy/mechanisms/mechanisms.py b/mindarmour/privacy/diff_privacy/mechanisms/mechanisms.py index 61d755f..bfb33cb 100644 --- a/mindarmour/privacy/diff_privacy/mechanisms/mechanisms.py +++ b/mindarmour/privacy/diff_privacy/mechanisms/mechanisms.py @@ -284,6 +284,21 @@ class NoiseAdaGaussianRandom(NoiseGaussianRandom): "get {}".format(decay_policy)) self._decay_policy = decay_policy + def construct(self, gradients): + """ + Generated Adaptive Gaussian noise. + + Args: + gradients(Tensor): The gradients. + + Returns: + Tensor, generated noise with shape like given gradients. + """ + shape = P.Shape()(gradients) + stddev = P.Mul()(self._norm_bound, self._noise_multiplier) + noise = normal(shape, self._mean, stddev, self._seed) + return noise + class _MechanismsParamsUpdater(Cell): """ diff --git a/mindarmour/privacy/diff_privacy/train/model.py b/mindarmour/privacy/diff_privacy/train/model.py index 805dd4e..5454e63 100644 --- a/mindarmour/privacy/diff_privacy/train/model.py +++ b/mindarmour/privacy/diff_privacy/train/model.py @@ -515,7 +515,7 @@ class _TrainOneStepWithLossScaleCell(Cell): if self._noise_mech is not None: grad_noise_tuple = () for grad_item in grads: - grad_noise = self._mech(grad_item) + grad_noise = self._noise_mech(grad_item) grad_noise_tuple = grad_noise_tuple + (grad_noise,) grads = self._tuple_add(grads, grad_noise_tuple) grads = self._hyper_map(F.partial(_grad_scale, self._micro_float),