Exemplo n.º 1
0
def _attackerNet(x0, noise_rel, net, yadv_init=None, batch_size=3):

    # compute noiseless measurements
    y0 = OpA(x0)

    if noise_rel == 0.0:
        return y0, y0, y0

    # compute absolute noise levels
    noise_level = noise_rel * y0.norm(p=2, dim=(-2, -1), keepdim=True)
    # compute noisy measurements for reference
    yref = noise_ref(OpA(x0), noise_level)  # noisy measurements

    # attack parameters
    adv_init_fac = 3.0 * noise_level
    adv_param = {
        "codomain_dist": mseloss,
        "domain_dist": None,
        "mixed_dist": None,
        "weights": (1.0, 1.0, 1.0),
        "optimizer": PAdam,
        "projs": None,
        "iter": 500,
        "stepsize": 5e0,
    }
    # compute initialization
    yadv = y0.clone().detach() + (
        adv_init_fac / np.sqrt(np.prod(y0.shape[-2:]))
    ) * torch.randn_like(y0)

    if yadv_init is not None:
        yadv[0 : yadv_init.shape[0], ...] = yadv_init.clone().detach()

    for idx_batch in range(0, yadv.shape[0], batch_size):
        print(
            "Attack for samples "
            + str(list(range(idx_batch, idx_batch + batch_size)))
        )

        adv_param["projs"] = [
            lambda y: proj_l2_ball(
                y,
                y0[idx_batch : idx_batch + batch_size, ...],
                noise_level[idx_batch : idx_batch + batch_size, ...],
            )
        ]
        # perform attack
        yadv[idx_batch : idx_batch + batch_size, ...] = untargeted_attack(
            lambda y: _reconstructNet(y, 0.0, net),
            yadv[idx_batch : idx_batch + batch_size, ...]
            .clone()
            .requires_grad_(True),
            y0[idx_batch : idx_batch + batch_size, ...],
            t_out_ref=x0[idx_batch : idx_batch + batch_size, ...],
            **adv_param
        ).detach()

    return yadv, yref, y0
Exemplo n.º 2
0
def _attackerL1Classification(x0, c0, noise_rel, yadv_init=None):

    # compute noiseless measurements
    y0 = OpA(x0)

    if noise_rel == 0.0:
        return y0, y0, y0

    # compute absolute noise levels
    noise_level = noise_rel * y0.norm(p=2, dim=(-2, -1), keepdim=True)

    # compute noisy measurements for reference
    yref = noise_ref(OpA(x0), noise_level)

    # attack parameters
    adv_init_fac = 3.0 * noise_level
    adv_param = {
        "codomain_dist": carlini_wagner(threshold=0.0),
        "domain_dist": None,
        "weights": (1.0, 1.0),
        "optimizer": PAdam,
        "projs": [lambda y: proj_l2_ball(y, y0, noise_level)],
        "iter": 100,
        "stepsize": 5e-1,
    }

    # compute good start values for _reconstructL1_adv
    _, c0_adv, y0_adv = primaldual(y0,
                                   OpA,
                                   OpTVSynth,
                                   iter=50000,
                                   c0=torch.zeros(config.n, ).to(device),
                                   y0=torch.zeros(config.m, ).to(device),
                                   eta=noise_level,
                                   silent=True,
                                   **rec_params)
    # compute initialization
    yadv = y0.clone().detach() + (
        adv_init_fac / np.sqrt(np.prod(y0.shape[-2:]))) * torch.randn_like(y0)

    if yadv_init is not None:
        yadv[0:yadv_init.shape[0], ...] = yadv_init.clone()

    yadv = yadv.requires_grad_(True)

    # perform attack
    yadv = untargeted_attack(lambda y: convnet(
        _reconstructL1_adv(y, noise_level, c0_adv, y0_adv).view(-1, 1, 28, 28)
    ),
                             yadv,
                             y0,
                             t_out_ref=c0,
                             **adv_param).detach()

    return yadv, yref, y0
Exemplo n.º 3
0
def _attackerNet(x0, noise_rel, net, yadv_init=None):

    # compute noiseless measurements
    y0 = OpA(x0)

    if noise_rel == 0.0:
        return y0, y0, y0

    # compute absolute noise levels
    noise_level = noise_rel * y0.norm(p=2, dim=(-2, -1), keepdim=True)
    # compute noisy measurements for reference
    yref = noise_ref(OpA(x0), noise_level)  # noisy measurements
    # attack parameters
    adv_init_fac = 3.0 * noise_level
    adv_param = {
        "codomain_dist": torch.nn.MSELoss(reduction="sum"),
        "domain_dist": None,
        "weights": (1.0, 1.0),
        "optimizer": PAdam,
        "projs": [lambda y: proj_l2_ball(y, y0, noise_level)],
        "iter": 100,
        "stepsize": 5e0,
    }
    # compute initialization
    yadv = y0.clone().detach() + (
        adv_init_fac / np.sqrt(np.prod(y0.shape[-2:]))) * torch.randn_like(y0)

    if yadv_init is not None:
        yadv[0:yadv_init.shape[0], ...] = yadv_init.clone().detach()

    yadv = yadv.requires_grad_(True)

    # perform attack
    yadv = untargeted_attack(lambda y: _reconstructNet(y, 0.0, net),
                             yadv,
                             y0,
                             t_out_ref=x0,
                             **adv_param).detach()

    return yadv, yref, y0
Exemplo n.º 4
0
def _attackerL1(x0, noise_rel, yadv_init=None, batch_size=6):

    # compute noiseless measurements
    y0 = OpA(x0)

    if noise_rel == 0.0:
        return y0, y0, y0

    # compute absolute noise levels
    noise_level = noise_rel * y0.norm(p=2, dim=(-2, -1), keepdim=True)
    # compute noisy measurements for reference
    yref = noise_ref(OpA(x0), noise_level)
    # attack parameters
    adv_init_fac = 3.0 * noise_level
    adv_param = {
        "codomain_dist": _complexloss,
        "domain_dist": None,
        "mixed_dist": None,
        "weights": (1.0, 1.0, 1.0),
        "optimizer": PAdam,
        "projs": None,
        "iter": 250,
        "stepsize": 5e0,
    }
    # get ADMM tuning parameters for noise_rel
    lam, rho = _get_gs_param(noise_rel.numpy())

    # compute good start values for _reconstructL1_adv
    x0_adv, z0_adv = admm_l1_rec_diag(
        y0,
        OpA,
        OpTV,
        OpA.adj(y0),
        OpTV(OpA.adj(y0)),
        lam,
        rho,
        iter=5000,
        silent=True,
    )
    # compute initialization
    yadv = y0.clone().detach() + (
        adv_init_fac / np.sqrt(np.prod(y0.shape[-2:]))) * torch.randn_like(y0)

    if yadv_init is not None:
        yadv[0:yadv_init.shape[0], ...] = yadv_init.clone().detach()

    for idx_batch in range(0, yadv.shape[0], batch_size):
        print("Attack for samples " +
              str(list(range(idx_batch, idx_batch + batch_size))))

        adv_param["projs"] = [
            lambda y: proj_l2_ball(
                y,
                y0[idx_batch:idx_batch + batch_size, ...],
                noise_level[idx_batch:idx_batch + batch_size, ...],
            )
        ]
        # perform attack
        yadv[idx_batch:idx_batch + batch_size, ...] = untargeted_attack(
            lambda y: _reconstructL1_adv(
                y,
                lam,
                rho,
                x0_adv[idx_batch:idx_batch + batch_size, ...],
                z0_adv[idx_batch:idx_batch + batch_size, ...],
            ),
            yadv[idx_batch:idx_batch + batch_size,
                 ...].clone().requires_grad_(True),
            y0[idx_batch:idx_batch + batch_size, ...],
            t_out_ref=x0[idx_batch:idx_batch + batch_size, ...],
            **adv_param).detach()

    return yadv, yref, y0