Skip to content

Commit 5039a39

Browse files
authored
Merge pull request #2117 from Trusted-AI/development_issue_2116
Fix bugs in AutoProjectedGradientDescent
2 parents 63f3501 + cb01479 commit 5039a39

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

art/attacks/evasion/auto_projected_gradient_descent.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,28 +231,33 @@ def __init__(self, reduction="mean"):
231231
self.ce_loss = torch.nn.CrossEntropyLoss(reduction="none")
232232
self.reduction = reduction
233233

234-
def __call__(self, y_true: torch.Tensor, y_pred: torch.Tensor) -> torch.Tensor:
234+
def __call__(self, y_pred: torch.Tensor, y_true: torch.Tensor) -> torch.Tensor:
235235
if self.reduction == "mean":
236-
return self.ce_loss(y_true, y_pred).mean()
236+
return self.ce_loss(y_pred, y_true).mean()
237237
if self.reduction == "sum":
238-
return self.ce_loss(y_true, y_pred).sum()
238+
return self.ce_loss(y_pred, y_true).sum()
239239
if self.reduction == "none":
240-
return self.ce_loss(y_true, y_pred)
240+
return self.ce_loss(y_pred, y_true)
241241
raise NotImplementedError()
242242

243243
def forward(
244244
self, input: torch.Tensor, target: torch.Tensor # pylint: disable=W0622
245245
) -> torch.Tensor:
246246
"""
247247
Forward method.
248+
248249
:param input: Predicted labels of shape (nb_samples, nb_classes).
249250
:param target: Target labels of shape (nb_samples, nb_classes).
250251
:return: Difference Logits Ratio Loss.
251252
"""
252-
return self.__call__(y_true=target, y_pred=input)
253+
return self.__call__(y_pred=input, y_true=target)
253254

254255
_loss_object_pt: torch.nn.modules.loss._Loss = CrossEntropyLossTorch(reduction="mean")
255256

257+
reduce_labels = True
258+
int_labels = True
259+
probability_labels = True
260+
256261
elif loss_type == "difference_logits_ratio":
257262
if is_probability(
258263
estimator.predict(x=np.ones(shape=(1, *estimator.input_shape), dtype=ART_NUMPY_DTYPE))
@@ -316,13 +321,18 @@ def forward(
316321
) -> torch.Tensor:
317322
"""
318323
Forward method.
324+
319325
:param input: Predicted labels of shape (nb_samples, nb_classes).
320326
:param target: Target labels of shape (nb_samples, nb_classes).
321327
:return: Difference Logits Ratio Loss.
322328
"""
323329
return self.__call__(y_true=target, y_pred=input)
324330

325331
_loss_object_pt = DifferenceLogitsRatioPyTorch()
332+
333+
reduce_labels = False
334+
int_labels = False
335+
probability_labels = False
326336
else:
327337
raise NotImplementedError()
328338

@@ -340,6 +350,10 @@ def forward(
340350
device_type=str(estimator._device),
341351
)
342352

353+
estimator_apgd._reduce_labels = reduce_labels
354+
estimator_apgd._int_labels = int_labels
355+
estimator_apgd._probability_labels = probability_labels
356+
343357
else: # pragma: no cover
344358
raise ValueError(f"The loss type {loss_type} is not supported for the provided estimator.")
345359

tests/attacks/evasion/test_auto_attack.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def fix_get_mnist_subset(get_mnist_dataset):
4141
yield x_train_mnist[:n_train], y_train_mnist[:n_train], x_test_mnist[:n_test], y_test_mnist[:n_test]
4242

4343

44-
@pytest.mark.skip_framework("tensorflow1", "tensorflow2v1", "keras", "pytorch", "non_dl_frameworks", "mxnet", "kerastf")
44+
@pytest.mark.skip_framework("tensorflow1", "tensorflow2v1", "keras", "non_dl_frameworks", "mxnet", "kerastf")
4545
def test_generate_default(art_warning, fix_get_mnist_subset, image_dl_estimator):
4646
try:
4747
classifier, _ = image_dl_estimator(from_logits=True)
@@ -66,7 +66,7 @@ def test_generate_default(art_warning, fix_get_mnist_subset, image_dl_estimator)
6666
art_warning(e)
6767

6868

69-
@pytest.mark.skip_framework("tensorflow1", "tensorflow2v1", "keras", "pytorch", "non_dl_frameworks", "mxnet", "kerastf")
69+
@pytest.mark.skip_framework("tensorflow1", "tensorflow2v1", "keras", "non_dl_frameworks", "mxnet", "kerastf")
7070
def test_generate_attacks_and_targeted(art_warning, fix_get_mnist_subset, image_dl_estimator):
7171
try:
7272
classifier, _ = image_dl_estimator(from_logits=True)

tests/attacks/evasion/test_shadow_attack.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def test_generate(art_warning, fix_get_mnist_subset, image_dl_estimator_for_atta
5959

6060
x_train_mnist_adv = attack.generate(x=x_train_mnist[0:1], y=y_train_mnist[0:1])
6161

62-
assert np.max(np.abs(x_train_mnist_adv - x_train_mnist[0:1])) == pytest.approx(0.31463563, abs=0.06)
62+
assert np.max(np.abs(x_train_mnist_adv - x_train_mnist[0:1])) == pytest.approx(0.3803413510322571, abs=0.06)
6363
except ARTTestException as e:
6464
art_warning(e)
6565

0 commit comments

Comments
 (0)