Skip to content

Commit 596aa14

Browse files
authored
Merge pull request #2274 from kieranfraser/dev_autoattack_metadata
Printable representation of Attack objects [JATIC-I2-IBM]
2 parents 161c406 + 08bf83f commit 596aa14

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

art/attacks/attack.py

+13
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,19 @@ def is_estimator_valid(estimator, estimator_requirements) -> bool:
186186
return False
187187
return True
188188

189+
def __repr__(self):
190+
"""
191+
Returns a string describing the attack class and attack_params
192+
"""
193+
param_str = ""
194+
for param in self.attack_params:
195+
if hasattr(self, param):
196+
param_str += f"{param}={getattr(self, param)}, "
197+
elif hasattr(self, "_attack"):
198+
if hasattr(self._attack, param):
199+
param_str += f"{param}={getattr(self._attack, param)}, "
200+
return f"{type(self).__name__}({param_str})"
201+
189202

190203
class EvasionAttack(Attack):
191204
"""

art/attacks/evasion/projected_gradient_descent/projected_gradient_descent_numpy.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class ProjectedGradientDescentCommon(FastGradientMethod):
5555
| Paper link: https://arxiv.org/abs/1706.06083
5656
"""
5757

58-
attack_params = FastGradientMethod.attack_params + ["max_iter", "random_eps", "verbose"]
58+
attack_params = FastGradientMethod.attack_params + ["decay", "max_iter", "random_eps", "verbose"]
5959
_estimator_requirements = (BaseEstimator, LossGradientsMixin)
6060

6161
def __init__(

tests/attacks/test_attack.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# MIT License
2+
#
3+
# Copyright (C) The Adversarial Robustness Toolbox (ART) Authors 2023
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6+
# documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
7+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
8+
# persons to whom the Software is furnished to do so, subject to the following conditions:
9+
#
10+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
11+
# Software.
12+
#
13+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
14+
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
16+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17+
# SOFTWARE.
18+
import pytest
19+
20+
21+
@pytest.mark.skip_framework("tensorflow1", "tensorflow2v1", "keras", "non_dl_frameworks", "mxnet", "kerastf")
22+
def test_attack_repr(image_dl_estimator):
23+
24+
from art.attacks.evasion import ProjectedGradientDescentNumpy
25+
26+
classifier, _ = image_dl_estimator(from_logits=True)
27+
28+
attack = ProjectedGradientDescentNumpy(
29+
estimator=classifier,
30+
targeted=True,
31+
decay=0.5,
32+
)
33+
print(repr(attack))
34+
assert repr(attack) == (
35+
"ProjectedGradientDescentNumpy(norm=inf, eps=0.3, eps_step=0.1, targeted=True, "
36+
+ "num_random_init=0, batch_size=32, minimal=False, summary_writer=None, decay=0.5, "
37+
+ "max_iter=100, random_eps=False, verbose=True, )"
38+
)

0 commit comments

Comments
 (0)