Skip to content

Commit cb4de1f

Browse files
committed
0,1,3,5 fixes
1 parent 5611e06 commit cb4de1f

File tree

8 files changed

+34
-7
lines changed

8 files changed

+34
-7
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ sphinx_docs
2525
*explainers_metrics*
2626
experiments/explainers_metrics/**/*_metrics.json
2727

28-
data
28+
datasets
2929
explanations
3030
<base.ptg_datasets.PTGDataset object*
3131
models

metainfo/mi_attack_parameters.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"ShadowModelMIAttacker": {
1010
"shadow_data_ratio": ["Shadow data ratio", "float", 0.25, {"min": 0, "max": 1, "step": 0.01}, "Percentage of original dataset available for intruder"],
1111
"shadow_epochs": ["Shadow epochs", "int", 100, {"min": 1, "step": 1}, "Number of train epochs for shadow model"],
12-
"classifier_type": ["Classifier type", "str", "svc", ["svc"], "Type of classifier for MI"]
12+
"classifier_type": ["Classifier type", "string", "svc", ["svc"], "Type of classifier for MI"]
1313
}
1414
}
1515

src/attacks/mi_attacks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ def attack(
116116
mask_tensor: Union[str, List[bool], torch.Tensor],
117117
):
118118
assert not isinstance(mask_tensor, str), "Input of original mask seems senseless"
119+
if isinstance(mask_tensor, list):
120+
mask_tensor = torch.tensor(mask_tensor)
119121

120122
model.eval()
121123

@@ -222,6 +224,8 @@ def attack(
222224
mask_tensor: Union[List[bool], torch.Tensor],
223225
**kwargs
224226
):
227+
if isinstance(mask_tensor, list):
228+
mask_tensor = torch.tensor(mask_tensor)
225229
task_type = gen_dataset.is_multi()
226230
if task_type:
227231
self.model_name = 'gcn_gcn_linear'

src/models_builder/gnn_constructor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,8 @@ def get_predictions(
626626
*args,
627627
**kwargs
628628
) -> torch.Tensor:
629+
# FIXME Kirill. tmp fix of AttributeError: 'dict' object has no attribute 'softmax' for SubgraphX
630+
# self._save_emb_flag = False
629631
return self(*args, **kwargs).softmax(dim=-1)
630632
# return self.forward(*args, **kwargs)
631633

src/models_builder/gnn_models.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,7 +1394,7 @@ def evaluate_model(
13941394
metrics_values[mask][metric.name] = metric.compute(y_pred, y_true)
13951395
# metrics_values[mask][metric.name] = MetricManager.compute(metric, y_pred, y_true)
13961396
if self.mi_attacker and self.mi_attack_flag:
1397-
self.call_mi_attack(gen_dataset=gen_dataset, mask_tensor=mask, model=self.gnn)
1397+
self.call_mi_attack(gen_dataset=gen_dataset, mask=mask, model=self.gnn)
13981398
return metrics_values
13991399

14001400
def call_evasion_attack(
@@ -1423,9 +1423,20 @@ def call_mi_attack(
14231423
self,
14241424
gen_dataset: GeneralDataset,
14251425
model: torch.nn.Module,
1426-
mask_tensor: Union[str, List[bool], torch.Tensor] = 'test'
1426+
mask: Union[str, List[bool], torch.Tensor] = 'test'
14271427
):
14281428
if self.mi_attacker:
1429+
# FIXME misha this is tmp fix should be removed after merge with models stage 3
1430+
try:
1431+
mask_tensor = {
1432+
'train': gen_dataset.train_mask.tolist(),
1433+
'val': gen_dataset.val_mask.tolist(),
1434+
'test': gen_dataset.test_mask.tolist(),
1435+
'all': [True] * len(gen_dataset.labels),
1436+
}[mask]
1437+
except KeyError:
1438+
assert isinstance(mask, torch.Tensor)
1439+
mask_tensor = mask
14291440
self.mi_attacker.attack(gen_dataset=gen_dataset, model=model, mask_tensor=mask_tensor)
14301441

14311442
def compute_stats_data(

tutorials/01_evasion_attack_defense/evasion_attack.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ def evasion_attack():
5050
# the evasion attack. You can see the available evasion attack types and their default parameters in
5151
# ./metainfo/evasion_attack_parameters.json
5252
evasion_attack_config = ConfigPattern(
53-
_class_name="FGSM",
53+
# _class_name="FGSM",
54+
_class_name="PGD",
5455
_import_path=EVASION_ATTACK_PARAMETERS_PATH,
5556
_config_class="EvasionAttackConfig",
5657
_config_kwargs={
57-
"epsilon": 0.01,
58-
"is_feature_attack": True,
58+
# "epsilon": 0.01,
59+
# "is_feature_attack": True,
5960
}
6061
)
6162
# Here we pass information to the model manager about the attack configuration, which will be enabled by default

web_interface/back_front/model_blocks.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,8 @@ def _finalize(
366366
def _submit(
367367
self
368368
) -> None:
369+
self.metrics = [Metric(**m) for m in self._config.get('metrics')]
370+
369371
self._object = [self.model_manager, self.metrics]
370372

371373
def do(

web_interface/static/js/presentation/left_menu/model/menuModelTrainerView.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ class MenuModelTrainerView extends MenuView {
3232
await this.updateTrainerMenu()
3333
}
3434

35+
async _accept() {
36+
let metrics = this.getMetrics()
37+
// We should pass metrics if user presses 'accept' without training
38+
await controller.blockRequest(
39+
this.requestBlock, 'modify', {'metrics': metrics})
40+
}
41+
3542
onReceive(block, args) {
3643
// super.onReceive(block, args)
3744
if (block === 'mt') {

0 commit comments

Comments
 (0)