fra31 / auto-attack

Code relative to "Reliable evaluation of adversarial robustness with an ensemble of diverse parameter-free attacks"
https://arxiv.org/abs/2003.01690
MIT License
639 stars 111 forks source link

Problem that forward output is tuple rather than tensor #83

Open momo1986 opened 2 years ago

momo1986 commented 2 years ago

Hi, dear Frank.

I met the problem caused by PyTorch. The returned forward output is tuple rather than tensor.

I must do operation on output[0] rather than output.

However, the internal code of auto attack is doing on output tensor directly. Is there an auto-attack code version to support the operation to do the execution on the output[0] rather than output? Or should I adjust the PyTorch-Version to support the auto-attack and retrain the model?

Traceback (most recent call last): File "eval_cifar.py", line 110, in main() File "eval_cifar.py", line 107, in main X_adv = adversary.run_standard_evaluation(x_test, y_test, bs=128) File "/opt/conda/lib/python3.6/site-packages/autoattack-0.1-py3.6.egg/autoattack/autoattack.py", line 91, in run_standard_evaluation AttributeError: 'tuple' object has no attribute 'max'

I am looking forward to your answer.

Thanks & Regards! Momo

fra31 commented 2 years ago

Hi,

I think a solution could be to use a wrapper like

class NewModel():
    def __init__(self, model):
        self.model = model

    def __call__(self, x):
        return self.model(x)[0]

on your model, so that it returns only the first element (this is similar to https://github.com/fra31/auto-attack/issues/16).

Hope this helps!