Я пытаюсь выполнить итеративную атаку 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)
...
Я просто вызываю функцию для генерации противников.