Невозможно заставить атакующую атаку сойтись на целевой класс - PullRequest
0 голосов
/ 08 января 2020

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

...