Итеративный таргетированный FGSM не работает для мини-пакетов - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь выполнить итеративную атаку fgsm на мою нейронную сеть. Я ссылаюсь на этот блог https://savan77.github.io/blog/imagenet_adv_examples.html. Однако атака может повлиять только на предсказание первых данных в мини-пакете. И на отдых это не влияет.

Я использую набор данных MNIST и очень маленькую нейронную сеть, которую я предварительно обучил сам.

def fgsm_attack(inputs, model, epsilon, attacked_target):
    criterion = nn.CrossEntropyLoss()
    inputs_tensor = inputs.data
    alpha = 0.025

    # Add iterations to make attack stronger
    for i in range(5):
        zero_gradients(inputs)
        outputs = model(inputs)
        loss_gen = criterion(outputs, attacked_targets)
        loss_gen.backward(retain_graph=True)

        # Collect the element-wise sign of the data gradient
        sign_inputs_grad = alpha * torch.sign(inputs.grad.data)

        # I am performing targeted attack, so this is minus
        adv_temp = inputs.data - sign_inputs_grad

        total_grad = adv_temp - inputs_tensor

        # Just to ensure that the amplitude will not exceed the threshold
        total_grad = torch.clamp(total_grad, -epsilon, epsilon)

        x_adv = inputs_tensor + total_grad
        inputs.data = x_adv

    return inputs, total_grad

Если размер партии 5:

Если нет атаки, прогнозы должны быть [7, 4, 6, 5, 0]

Если мы установим атакуемую цель равной 1, ожидаемые результаты должны быть [1, 1, 1, 1, 1]

Однако я получил [1, 4, 6, 5, 0].

Вот как я генерирую противников:

for i, (inputs, targets) in enumerate(val_loader):
    inputs.requires_grad = True
    perturbed_inputs, sign_inputs_grad = fgsm_attack(inputs, model, epsilon, attacked_target)
    outputs = model(perturbed_inputs)
    ...

Я просто вызываю функцию для генерации противников.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...