Я пытаюсь провести целенаправленную состязательную атаку на набор данных MNIST.
Моя атака выглядит примерно так -
epsilon = [0, 0.15, 0.2 , 0.25, 0.3, 0.35]
def targeted_fgsm_attack(img, epsilon, img_grad):
img_grad = img_grad.sign()
pert_image = img - epsilon*img_grad
pert_image = torch.clamp(pert_image,0,1)
return pert_image, epsilon*img_grad
Обучение / итерация l oop is -
def test(model, device, test_loader, epsilon):
correct = 0
adv_examples = []
target_attk = torch.tensor([7]).to(device)
for data, target in test_loader:
data, target = data.to(device), target.to(device)
data.requires_grad = True
output = model(data)
init_pred = output.max(1, keepdim = True)[1]
if init_pred.item() != target.item():
continue
while(output.max(1, keepdim = True)[1].item() != target_attk.item()):
loss = F.nll_loss(output, target_attk)
model.zero_grad()
loss.backward()
data_grad = data.grad.data
perturbed_data, perturbed_gradient = targeted_fgsm_attack(data,
epsilon, data_grad)
output = model(perturbed_data)
print(loss)
print(output.max(1, keepdim = True)[1].item())
final_pred = output.max(1, keepdim=True)[1]
Я задаю целевой класс в 7, переменная target_attk
фиксирует это. После этого я первоначально получаю прогноз из данных, если прогноз совпадает с фактическим прогнозом, я получаю потерю выходных данных в отношении target_attk
. Я положил его через некоторое время l oop, чтобы оно продолжалось до тех пор, пока потери не станут минимальными для ложного класса, но кажется, что эта точка никогда не достигнет, а l oop будет выполняться вечно.