Ejemplo n.º 1
0
def run_eval(checkpoint, train=False, num_eval_examples=None, data_dir=None):
    mnist = input_data.read_data_sets('MNIST_data', one_hot=False)
    model = Model(mode='eval')
    saver = tf.train.Saver()
    eval_batch_size = 64
    total_corr = 0

    cifar = cifar10_input.CIFAR10Data(data_dir)

    if train:
        x_nat = cifar.train_data.xs
        y_nat = cifar.train_data.ys
    else:
        x_nat = cifar.eval_data.xs
        y_nat = cifar.eval_data.ys

    if num_eval_examples is None:
        num_eval_examples = len(x_nat)

    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    y_pred = []  # label accumulator
    red_neck = []
    loj_eet = []

    with tf.Session() as sess:
        # Restore the checkpoint
        saver.restore(sess, checkpoint)

        # Iterate over the samples batch-by-batch
        for ibatch in tqdm(range(num_batches)):
            bstart = ibatch * eval_batch_size
            bend = min(bstart + eval_batch_size, num_eval_examples)

            x_batch = x_nat[bstart:bend, :]
            y_batch = y_nat[bstart:bend]
            dict_clean = {model.x_input: x_batch,
                          model.y_input: y_batch}
            cur_corr, y_pred_batch, neck, logitsez = sess.run([model.num_correct, model.y_pred, model.neck, model.pre_softmax],
                                                    feed_dict=dict_clean)

            total_corr += cur_corr
            y_pred.append(y_pred_batch)
            red_neck.append(neck)
            loj_eet.append(logitsez)
            # print('ibatch: ', ibatch, '/', num_batches)

    accuracy = total_corr / num_eval_examples

    print('Accuracy: {:.2f}%'.format(100.0 * accuracy))
    test_str = 'test'
    if train:
        test_str = 'train'
    np.save(sys.argv[1] + test_str + '_red_neck.npy', np.concatenate(red_neck,
                                                                     axis=0))
    np.save(sys.argv[1] + test_str + '_logits.npy', np.concatenate(loj_eet,
                                                                     axis=0))
Ejemplo n.º 2
0
def run_attack(checkpoint, x_adv, epsilon):
    cifar = cifar10_input.CIFAR10Data(data_path)

    model = Model(num_classes=10)

    saver = tf.train.Saver()

    num_eval_examples = 10000
    eval_batch_size = 100

    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    total_corr = 0

    x_nat = cifar.eval_data.xs
    l_inf = np.amax(np.abs(x_nat - x_adv))

    if l_inf > epsilon + 0.0001:
        print('maximum perturbation found: {}'.format(l_inf))
        print('maximum perturbation allowed: {}'.format(epsilon))
        return

    y_pred = []  # label accumulator

    with tf.Session() as sess:
        # Restore the checkpoint
        saver.restore(sess, checkpoint)

        # Iterate over the samples batch-by-batch
        for ibatch in range(num_batches):
            bstart = ibatch * eval_batch_size
            bend = min(bstart + eval_batch_size, num_eval_examples)

            x_batch = x_adv[bstart:bend, :]
            y_batch = cifar.eval_data.ys[bstart:bend]
            y_batch = np.eye(10)[y_batch]

            dict_adv = {
                model.x_input: x_batch,
                model.is_training: False,
                model.y_input: y_batch
            }
            cur_corr, y_pred_batch = sess.run(
                [model.num_correct, model.predictions], feed_dict=dict_adv)

            total_corr += cur_corr
            y_pred.append(y_pred_batch)

    accuracy = total_corr / num_eval_examples

    print('Accuracy: {:.2f}%'.format(100.0 * accuracy))
    y_pred = np.concatenate(y_pred, axis=0)
    np.save('pred.npy', y_pred)
    print('Output saved at pred.npy')
Ejemplo n.º 3
0
def exp_over_grid_eval(model,
                       attack,
                       sess,
                       config,
                       attack_type,
                       eval_on_train=False):
    num_eval_examples = config.eval.num_eval_examples
    eval_batch_size = config.eval.batch_size

    if config.data.dataset_name == "cifar-10":
        data_iterator = cifar10_input.CIFAR10Data(config.data.data_path)
    elif config.data.dataset_name == "cifar-100":
        data_iterator = cifar100_input.CIFAR100Data(config.data.data_path)
    elif config.data.dataset_name == "svhn":
        data_iterator = svhn_input.SVHNData(config.data.data_path)
    else:
        raise ValueError("Unknown dataset name.")

    # Iterate over the samples batch-by-batch
    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    n_grid = np.prod(config.attack.grid_granularity)
    results = np.zeros([num_eval_examples, n_grid])
    for ibatch in trange(num_batches):
        bstart = ibatch * eval_batch_size
        bend = min(bstart + eval_batch_size, num_eval_examples)

        if eval_on_train:
            x_batch = data_iterator.train_data.xs[bstart:bend, :]
            y_batch = data_iterator.train_data.ys[bstart:bend]
        else:
            x_batch = data_iterator.eval_data.xs[bstart:bend, :]
            y_batch = data_iterator.eval_data.ys[bstart:bend]
        grid = product(*list(
            np.linspace(-l, l, num=g) for l, g in zip(
                config.attack.spatial_limits, config.attack.grid_granularity)))
        n_batch = len(x_batch)
        for i, (tx, ty, r) in enumerate(grid):
            trans = np.stack(repeat([tx, ty, r], n_batch))
            dict_nat = {
                model.x_input: x_batch,
                model.y_input: y_batch,
                model.transform: trans,
                model.is_training: False
            }
            results[bstart:bend, i] = sess.run(model.correct_prediction,
                                               feed_dict=dict_nat)

    return results
Ejemplo n.º 4
0
def run_attack(checkpoint, x_adv, epsilon):
    cifar = cifar10_input.CIFAR10Data(data_path)
    model = Model(mode='eval')
    saver = tf.train.Saver()

    num_eval_examples = adv_count

    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    total_corr = 0

    # another round of check
    x_nat = cifar.eval_data.xs[:adv_count, :, :, :]
    l_inf = np.amax(np.abs(x_nat - x_adv))
    if l_inf > epsilon + 0.0001:
        print('maximum perturbation found: {}'.format(l_inf))
        print('maximum perturbation allowed: {}'.format(epsilon))
        return

    y_pred = []  # label accumulator

    with tf.Session() as sess:

        saver.restore(sess, checkpoint)
        print("model restored")

        for ibatch in range(num_batches):
            bstart = ibatch * eval_batch_size
            bend = min(bstart + eval_batch_size, num_eval_examples)

            x_batch = x_adv[bstart:bend, :]
            y_batch = cifar.eval_data.ys[bstart:bend]

            print("bStart = %d, bEnd = %d, bSize = %d" % (bstart, bend, bend - bstart))
            dict_adv = {model.x_input: x_batch, model.y_input: y_batch}
            cur_corr, y_pred_batch = sess.run([model.num_correct, model.predictions],
                                              feed_dict=dict_adv)

            total_corr += cur_corr
            y_pred.append(y_pred_batch)

    accuracy = total_corr / num_eval_examples
    print('Accuracy: {:.2f}%'.format(100.0 * accuracy))

    y_pred = np.concatenate(y_pred, axis=0)
    np.save('pred.npy', y_pred)
    print('Output saved at pred.npy')
Ejemplo n.º 5
0
def exp_over_grid_eval_random_sample(model,
                                     sess,
                                     config,
                                     eval_on_train=False,
                                     num_eval_examples=100,
                                     seed=1):
    np.random.seed(seed)
    if config.data.dataset_name == "cifar-10":
        data_iterator = cifar10_input.CIFAR10Data(config.data.data_path)
    elif config.data.dataset_name == "cifar-100":
        data_iterator = cifar100_input.CIFAR100Data(config.data.data_path)
    elif config.data.dataset_name == "svhn":
        data_iterator = svhn_input.SVHNData(config.data.data_path)
    else:
        raise ValueError("Unknown dataset name.")

    if eval_on_train:
        n = data_iterator.train_data.n
        indices = np.random.choice(n, num_eval_examples)
        x_batch = data_iterator.train_data.xs[indices, :]
        y_batch = data_iterator.train_data.ys[indices]
    else:
        n = data_iterator.eval_data.n
        indices = np.random.choice(n, num_eval_examples)
        x_batch = data_iterator.eval_data.xs[indices, :]
        y_batch = data_iterator.eval_data.ys[indices]

    grid = product(*list(
        np.linspace(-l, l, num=g) for l, g in zip(
            config.attack.spatial_limits, config.attack.grid_granularity)))
    n_grid = np.prod(config.attack.grid_granularity)
    results = np.zeros([len(x_batch), n_grid])
    n_batch = len(x_batch)
    for i, (tx, ty, r) in enumerate(grid):
        trans = np.stack(repeat([tx, ty, r], n_batch))
        dict_nat = {
            model.x_input: x_batch,
            model.y_input: y_batch,
            model.transform: trans,
            model.is_training: False
        }
        results[:, i] = sess.run(model.correct_prediction, feed_dict=dict_nat)

    return results
def get_model(theta_ratio):
    img_size = 32
    batch_size = config['eval_batch_size']
    input_images = tf.placeholder(tf.float32,
                                  shape=(batch_size, img_size, img_size, 3))
    input_label = tf.placeholder(tf.int64, shape=(batch_size))

    ## MODEL to be attacked ##
    model = Model_crop(config,
                       mode='eval',
                       input_images=input_images,
                       input_label=input_label,
                       theta_ratio=theta_ratio)

    ## training starts ###
    FLAGS = tf.app.flags.FLAGS
    tfconfig = tf.ConfigProto(
        allow_soft_placement=True,
        log_device_placement=True,
    )
    tfconfig.gpu_options.allow_growth = True
    sess = tf.Session(config=tfconfig)
    init = tf.global_variables_initializer()
    sess.run(init)
    saver = tf.train.Saver()
    saver.restore(
        sess,
        '/home/hope-yao/Documents/adversarial_defense/cifar/ckpt/crop_4_20_adv/half_half/lr_config1_adv/checkpoint-25001'
    )

    import cifar10_input
    if 1:
        bstart = 0
        bend = bstart + batch_size
        data_path = config['data_path']
        cifar = cifar10_input.CIFAR10Data(data_path)
        x_batch_eval = cifar.eval_data.xs[bstart:bend, :]
        x_batch_eval = np.asarray(x_batch_eval, 'float32') / 255.
        y_batch_eval = cifar.eval_data.ys[bstart:bend]
        nat_dict_eval = {input_images: x_batch_eval, input_label: y_batch_eval}
    grad = sess.run(model.adv_grad, feed_dict=nat_dict_eval)
    return grad, sess, model, input_images, input_label, nat_dict_eval
Ejemplo n.º 7
0
def evaluate(model, eval_attacks, sess, config, plot=False, summary_writer=None, eval_train=False, eval_validation=False, verbose=True):
    num_eval_examples = config['num_eval_examples']
    eval_batch_size = config['eval_batch_size']

    dataset = config["data"]
    assert dataset in ["mnist", "cifar10"]

    if dataset == "mnist":
        from tensorflow.examples.tutorials.mnist import input_data
        mnist = input_data.read_data_sets('MNIST_data', one_hot=False)
        if "model_type" in config and config["model_type"] == "linear":
            x_train = mnist.train.images
            y_train = mnist.train.labels
            x_test = mnist.test.images
            y_test = mnist.test.labels

            pos_train = (y_train == 5) | (y_train == 7)
            x_train = x_train[pos_train]
            y_train = y_train[pos_train]
            y_train = (y_train == 5).astype(np.int64)
            pos_test = (y_test == 5) | (y_test == 7)
            x_test = x_test[pos_test]
            y_test = y_test[pos_test]
            y_test = (y_test == 5).astype(np.int64)

            from tensorflow.contrib.learn.python.learn.datasets.mnist import DataSet
            from tensorflow.contrib.learn.python.learn.datasets import base

            options = dict(dtype=tf.uint8, reshape=False, seed=None)
            train = DataSet(x_train, y_train, **options)
            test = DataSet(x_test, y_test, **options)

            mnist = base.Datasets(train=train, validation=None, test=test)
    else:
        import cifar10_input
        data_path = config["data_path"]
        cifar = cifar10_input.CIFAR10Data(data_path)

    np.random.seed(0)
    tf.random.set_random_seed(0)
    global_step = tf.contrib.framework.get_or_create_global_step()

    # Iterate over the samples batch-by-batch
    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    total_xent_nat = 0.
    total_xent_advs = np.zeros(len(eval_attacks), dtype=np.float32)
    total_corr_nat = 0.
    total_corr_advs = [[] for _ in range(len(eval_attacks))]

    l1_norms = [[] for _ in range(len(eval_attacks))]
    l2_norms = [[] for _ in range(len(eval_attacks))]
    linf_norms = [[] for _ in range(len(eval_attacks))]

    for ibatch in range(num_batches):
        bstart = ibatch * eval_batch_size
        bend = min(bstart + eval_batch_size, num_eval_examples)

        if eval_train:
            if dataset == "mnist":
                x_batch = mnist.train.images[bstart:bend, :].reshape(-1, 28, 28, 1)
                y_batch = mnist.train.labels[bstart:bend]
            else:
                x_batch = cifar.train_data.xs[bstart:bend, :].astype(np.float32)
                y_batch = cifar.train_data.ys[bstart:bend]
        elif eval_validation:
            assert dataset == "cifar10"
            offset = len(cifar.eval_data.ys) - num_eval_examples
            x_batch = cifar.eval_data.xs[offset+bstart:offset+bend, :].astype(np.float32)
            y_batch = cifar.eval_data.ys[offset+bstart:offset+bend]

        else:
            if dataset == "mnist":
                x_batch = mnist.test.images[bstart:bend, :].reshape(-1, 28, 28, 1)
                y_batch = mnist.test.labels[bstart:bend]
            else:
                x_batch = cifar.eval_data.xs[bstart:bend, :].astype(np.float32)
                y_batch = cifar.eval_data.ys[bstart:bend]

        noop_trans = np.zeros([len(x_batch), 3])
        dict_nat = {model.x_input: x_batch,
                    model.y_input: y_batch,
                    model.is_training: False,
                    model.transform: noop_trans}

        cur_corr_nat, cur_xent_nat = sess.run(
            [model.num_correct, model.xent],
            feed_dict=dict_nat)

        total_xent_nat += cur_xent_nat
        total_corr_nat += cur_corr_nat

        for i, attack in enumerate(eval_attacks):
            x_batch_adv, adv_trans = attack.perturb(x_batch, y_batch, sess)

            dict_adv = {model.x_input: x_batch_adv,
                        model.y_input: y_batch,
                        model.is_training: False,
                        model.transform: adv_trans if adv_trans is not None else np.zeros([len(x_batch), 3])}

            cur_corr_adv, cur_xent_adv, cur_corr_pred, cur_adv_images = \
                sess.run([model.num_correct, model.xent, model.correct_prediction, model.x_image],
                         feed_dict=dict_adv)

            total_xent_advs[i] += cur_xent_adv
            total_corr_advs[i].extend(cur_corr_pred)

            l1_norms[i].extend(np.sum(np.abs(x_batch_adv - x_batch).reshape(len(x_batch), -1), axis=-1))
            l2_norms[i].extend(np.linalg.norm((x_batch_adv - x_batch).reshape(len(x_batch), -1), axis=-1))
            linf_norms[i].extend(np.max(np.abs(x_batch_adv - x_batch).reshape(len(x_batch), -1), axis=-1))

    avg_xent_nat = total_xent_nat / num_eval_examples
    acc_nat = total_corr_nat / num_eval_examples

    avg_xent_advs = total_xent_advs / num_eval_examples
    acc_advs = np.sum(total_corr_advs, axis=-1) / num_eval_examples

    if len(eval_attacks) > 0:
        tot_correct = np.bitwise_and.reduce(np.asarray(total_corr_advs), 0)
        assert len(tot_correct) == num_eval_examples
        any_acc = np.sum(tot_correct) / num_eval_examples

    if verbose:
        print('natural: {:.2f}%'.format(100 * acc_nat))
        for i, attack in enumerate(eval_attacks):
            t = attack.name
            print('adversarial ({}):'.format(t))
            print('\tacc: {:.2f}% '.format(100 * acc_advs[i]))
            print("\tmean(l1)={:.1f}, min(l1)={:.1f}, max(l1)={:.1f}".format(
                np.mean(l1_norms[i]), np.min(l1_norms[i]), np.max(l1_norms[i])))
            print("\tmean(l2)={:.1f}, min(l2)={:.1f}, max(l2)={:.1f}".format(
                np.mean(l2_norms[i]), np.min(l2_norms[i]), np.max(l2_norms[i])))
            print("\tmean(linf)={:.1f}, min(linf)={:.1f}, max(linf)={:.1f}".format(
                np.mean(linf_norms[i]), np.min(linf_norms[i]), np.max(linf_norms[i])))

        print('avg nat loss: {:.2f}'.format(avg_xent_nat))
        for i, attack in enumerate(eval_attacks):
            t = attack.name
            print('avg adv loss ({}): {:.2f}'.format(t, avg_xent_advs[i]))

        if len(eval_attacks) > 0:
            print("any attack: {:.2f}%".format(100 * any_acc))

    if summary_writer:

        values = [
            tf.Summary.Value(tag='xent nat', simple_value=avg_xent_nat),
            tf.Summary.Value(tag='accuracy nat', simple_value=acc_nat)
        ]
        if len(eval_attacks) > 0:
            values.append(tf.Summary.Value(tag='accuracy adv any', simple_value=any_acc))

        for i, attack in enumerate(eval_attacks):
            t = attack.name
            adv_values = [
                tf.Summary.Value(tag='xent adv eval ({})'.format(t), simple_value=avg_xent_advs[i]),
                tf.Summary.Value(tag='xent adv ({})'.format(t), simple_value=avg_xent_advs[i]),
                tf.Summary.Value(tag='accuracy adv eval ({})'.format(t), simple_value=acc_advs[i]),
                tf.Summary.Value(tag='accuracy adv ({})'.format(t), simple_value=acc_advs[i])
            ]
            values.extend(adv_values)

        summary = tf.Summary(value=values)
        summary_writer.add_summary(summary, global_step.eval(sess))

    return acc_nat, total_corr_advs
#        print("norm of lbd_hi*theta 3:", np.linalg.norm(x0+ np.array(lbd_hi*theta)))
#        print("******")
        return lbd_hi, nquery

model = get_model("cifar", softmax=True)
model.load_weights("data/lid_model_cifar.h5")
model_logits = get_model("cifar", softmax=False)
model_logits.load_weights("data/lid_model_cifar.h5")

sess = K.get_session()
x = tf.placeholder(tf.float32, (None, 32, 32, 3))
logits = model(x)

model = Model(model, model_logits, sess, [0.0, 1.0])

cifar = cifar10_input.CIFAR10Data("../cifar10_data")
train_img = cifar.eval_data.xs[1000:5000] / 255.0 - .5
train_lb = cifar.eval_data.ys[1000:5000]
test_img = cifar.eval_data.xs[:100] / 255.0 - .5
test_lb = cifar.eval_data.ys[:100]
attack = blackbox(model)

# =============================== pre-attack 1000 images for logistic training================
#labels = train_lb[:1000]
#images = train_img[:1000]
#count = 0
#pre_labs = []
#for i in range(1000):
#    pre_lab = model.predict(images[i])
#    pre_labs.append(pre_lab)
#    if labels[i] == pre_lab:
Ejemplo n.º 9
0
def main(argv):

    model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)

    if model_file is None:
        print('No model found')
        sys.exit()

    cifar = cifar10_input.CIFAR10Data(FLAGS.dataset_dir)

    nb_classes = 10
    X_test = cifar.train_data.xs
    Y_test = to_categorical(cifar.train_data.ys, nb_classes)
    assert Y_test.shape[1] == 10.
    print("train data shape", X_test.shape)

    set_log_level(logging.DEBUG)

    with tf.Session() as sess:

        x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3))
        y = tf.placeholder(tf.float32, shape=(None, 10))

        from cleverhans.model_zoo.madry_lab_challenges.cifar10_model import make_wresnet
        model = make_wresnet()
        saver = tf.train.Saver()
        # Restore the checkpoint
        saver.restore(sess, model_file)
        SCOPE = "cifar10_challenge"
        model2 = make_wresnet(scope=SCOPE)
        assert len(model.get_vars()) == len(model2.get_vars())
        found = [False] * len(model2.get_vars())
        for var1 in model.get_vars():
            var1_found = False
            var2_name = SCOPE + "/" + var1.name
            for idx, var2 in enumerate(model2.get_vars()):
                if var2.name == var2_name:
                    var1_found = True
                    found[idx] = True
                    sess.run(tf.assign(var2, var1))
                    break
            assert var1_found, var1.name
        assert all(found)

        model = model2
        saver = tf.train.Saver()

        # Restore the checkpoint
        #saver.restore(sess, model_file)

        nb_samples = FLAGS.nb_samples

        attack_params = {
            'batch_size': FLAGS.batch_size,
            'clip_min': 0.,
            'clip_max': 255.
        }

        if FLAGS.attack_type == 'cwl2':
            from cleverhans.attacks import CarliniWagnerL2
            attacker = CarliniWagnerL2(model, sess=sess)
            attack_params.update({
                'binary_search_steps': 1,
                'confidence': 0,
                'max_iterations': 100,
                'learning_rate': 0.1,
                'initial_const': 10,
                'batch_size': 10
            })

        else:  # eps and eps_iter in range 0-255
            attack_params.update({'eps': 16, 'ord': np.inf})
            if FLAGS.attack_type == 'fgsm':
                from cleverhans.attacks import FastGradientMethod
                attacker = FastGradientMethod(model, sess=sess)

            elif FLAGS.attack_type == 'pgd':
                attack_params.update({
                    'eps': 8,
                    'eps_iter': .02,
                    'ord': np.inf,
                    'nb_iter': 10
                })
                from cleverhans.attacks import MadryEtAl
                attacker = MadryEtAl(model, sess=sess)
            elif FLAGS.attack_type == 'deepFool':
                print("here")
                attack_params.update({
                    'ord': np.inf,
                    'eps': 6.0,
                    'max_iter': 100
                })
                from CdeepFool_cleverhans import DeepFool

                attacker = DeepFool(model, sess=sess)

        eval_par = {'batch_size': FLAGS.batch_size}

        if FLAGS.sweep:
            max_eps = 16
            epsilons = np.linspace(1, max_eps, max_eps)
            for e in epsilons:
                t1 = time.time()
                attack_params.update({'eps': e})
                x_adv = attacker.generate(x, **attack_params)
                preds_adv = model.get_probs(x_adv)
                x1 = sess.run(x_adv, feed_dict={x: X_test[0], y: Y_test[0]})
                print(x1.shape)
                l_inf = np.amax(np.abs(X_test[0] - x1))
                print('perturbation found: {}'.format(l_inf))

                acc = model_eval(sess,
                                 x,
                                 y,
                                 preds_adv,
                                 X_test[:nb_samples],
                                 Y_test[:nb_samples],
                                 args=eval_par)
                print('Epsilon %.2f, accuracy on adversarial' % e,
                      'examples %0.4f\n' % acc)
            t2 = time.time()
        else:
            t1 = time.time()
            x_adv = attacker.generate(x, **attack_params)
            preds_adv = model.get_probs(x_adv)
            logits = model.get_logits(x)
            #print (len(x_adv))

            num_eval_examples = 1000
            eval_batch_size = 100
            num_batches = int(math.ceil(num_eval_examples / eval_batch_size))

            x_adv_all = []  # adv accumulator
            y_adv_all = []
            y_true = []
            print('Iterating over {} batches'.format(num_batches))

            for ibatch in range(num_batches):
                bstart = ibatch * eval_batch_size
                bend = min(bstart + eval_batch_size, num_eval_examples)
                print('batch size: {}'.format(bend - bstart))

                x_batch = X_test[bstart:bend, :]
                y_batch = Y_test[bstart:bend]
                y_clean = np.argmax(sess.run(logits, feed_dict={x: x_batch}),
                                    axis=1)
                x_b_adv, pred = sess.run([x_adv, preds_adv],
                                         feed_dict={
                                             x: x_batch,
                                             y: y_batch
                                         })
                y_b_adv = np.argmax(sess.run(logits, feed_dict={x: x_b_adv}),
                                    axis=1)

                count = 0
                y_batch = np.argmax(y_batch, axis=1)
                for i in range(eval_batch_size):

                    if (y_b_adv[i] != y_batch[i] and y_clean[i] == y_batch[i]):
                        l_inf = np.amax(np.abs(x_batch[i] - x_b_adv[i]))
                        print('perturbation found: {}'.format(l_inf))
                        #print (y_b_adv[i])
                        x_adv_all.append(x_b_adv[i])
                        y_adv_all.append(y_b_adv[i])
                        y_true.append(y_batch[i])
                        count += 1
                #print (y_adv_all[0:20])
                #print (y_true[0:20])
                print("Totat adversariak cound in this batch", count)

                #x_adv_all.extend(x_b_adv)
                #y_adv_all.extend(y_b_adv)

            x_adv_all = np.array(x_adv_all)
            y_true = np.array(y_true)
            y_adv_all = np.array(y_adv_all)

            print('Adv Label', y_adv_all[0:20])
            print('Ori Label', y_true[0:20])

            #y_adv = np.squeeze(y_adv)
            print(x_adv_all.shape)
            print(y_adv_all.shape)
            print(y_true.shape)

            count = 0
            for i in range(y_adv_all.shape[0]):
                if y_true[i] != y_adv_all[i]:
                    count += 1
            print("Total adversarial examples found", count)
            pickle.dump(
                (x_adv_all, y_true, y_adv_all),
                open(
                    '/scratch/kiani/Projects/CIFAR data/Adversarial/deepFool/iter_100/deepFool_E6_train.p',
                    'wb'))

            #from numpy import linalg as LA
            #l_2 = LA.norm(X_test[0] - x1[0])

            #l_inf = np.amax(np.abs(x - x_adv))

            t2 = time.time()
        print("Range of data should be 0-255 and actual is: ",
              str(np.min(x_adv_all)) + " " + str(np.max(x_adv_all)))
        image = ((x_adv_all[2])).astype(np.uint8)
        img = Image.fromarray(image)
        img.save("deepFool_attack.jpeg")
        print("Took", t2 - t1, "seconds")
Ejemplo n.º 10
0
def evaluate_ch(model, config, sess, norm='l1', bound=None, verbose=True):
    dataset = config['data']
    num_eval_examples = config['num_eval_examples']
    eval_batch_size = config['eval_batch_size']

    if dataset == "mnist":
        from tensorflow.examples.tutorials.mnist import input_data
        mnist = input_data.read_data_sets('MNIST_data', one_hot=False)
        X = mnist.test.images[0:num_eval_examples, :].reshape(-1, 28, 28, 1)
        Y = mnist.test.labels[0:num_eval_examples]
        x_image = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])
    else:
        import cifar10_input
        data_path = config["data_path"]
        cifar = cifar10_input.CIFAR10Data(data_path)
        X = cifar.eval_data.xs[0:num_eval_examples, :].astype(np.float32) / 255.0
        Y = cifar.eval_data.ys[0:num_eval_examples]
        x_image = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])
        assert norm == 'l1'

    if norm=='l2':
        attack = CarliniWagnerL2(model, sess)
        params = {'batch_size': eval_batch_size, 'binary_search_steps': 9}
    else:
        attack = ElasticNetMethod(model, sess, clip_min=0.0, clip_max=1.0)
        params = {'beta': 1e-2,
                  'decision_rule': 'L1',
                  'batch_size': eval_batch_size,
                  'learning_rate': 1e-2,
                  'max_iterations': 1000}

    if verbose:
        set_log_level(logging.DEBUG, name="cleverhans")
    
    y = tf.placeholder(tf.int64, shape=[None, 10])
    params['y'] = y
    adv_x = attack.generate(x_image, **params)
    preds_adv = model.get_predicted_class(adv_x)
    preds_nat = model.get_predicted_class(x_image)

    all_preds, all_preds_adv, all_adv_x = batch_eval(
        sess, [x_image, y], [preds_nat, preds_adv, adv_x], [X, one_hot(Y, 10)], batch_size=eval_batch_size)

    print('acc nat', np.mean(all_preds == Y))
    print('acc adv', np.mean(all_preds_adv == Y))

    if dataset == "cifar10":
        X *= 255.0
        all_adv_x *= 255.0

    if norm == 'l2':
        lps = np.sqrt(np.sum(np.square(all_adv_x - X), axis=(1,2,3)))
    else:
        lps = np.sum(np.abs(all_adv_x - X), axis=(1,2,3))
    print('mean lp: ', np.mean(lps))
    for b in [bound, bound/2.0, bound/4.0, bound/8.0]:
        print('lp={}, acc={}'.format(b, np.mean((all_preds_adv == Y) | (lps > b))))

    all_corr_adv = (all_preds_adv == Y)
    all_corr_nat = (all_preds == Y)
    return all_corr_nat, all_corr_adv, lps
Ejemplo n.º 11
0
    if model_file is None:
        print('No model found')
        sys.exit()

    class_count = 10
    if _CIFAR100: class_count = 100
    model = Model(mode='eval', class_count=class_count)
    attack = LinfPGDAttack(model, config['epsilon'], config['num_steps'],
                           config['step_size'], config['random_start'],
                           config['loss_func'])
    saver = tf.train.Saver()

    data_path = config['data_path']

    cifar = cifar100_input.CIFAR100Data(
        data_path) if _CIFAR100 else cifar10_input.CIFAR10Data(data_path)

    with tf.Session() as sess:
        # Restore the checkpoint
        saver.restore(sess, model_file)

        # Iterate over the samples batch-by-batch
        num_eval_examples = config['num_eval_examples']
        eval_batch_size = config['eval_batch_size']
        num_batches = int(math.ceil(num_eval_examples / eval_batch_size))

        x_adv = []  # adv accumulator

        print('Iterating over {} batches'.format(num_batches))

        total_corr, total_count, clean_corr = 0.0, 0.0, 0.0
    LEARNING_RATE = 1e-1
    LR_DECAY_RATE = 1e-4  #5e-5
    DECAY_STEPS = 1.0
    adv_weight = 5000
    ITER = 4000
else:
    #LEARNING_RATE = 5e-2
    #LR_DECAY_RATE = 1e-5  # 5e-5
    DECAY_STEPS = 1.0
    adv_weight = 128
    ITER = 100

style_weight = 1

if data_set == "cifar10":
    raw_cifar = cifar10_input.CIFAR10Data("cifar10_data")

    def get_data(sess):
        x_batch, y_batch = raw_cifar.train_data.get_next_batch(
            batch_size=BATCH_SIZE, multiple_passes=True)
        return x_batch, y_batch
elif data_set == "imagenet":
    inet = imagenet(BATCH_SIZE, dataset="train")

    def get_data(sess):
        x_batch, y_batch = inet.get_next_batch(sess)

        return x_batch, y_batch


ENCODER_WEIGHTS_PATH = 'vgg19_normalised.npz'
Ejemplo n.º 13
0
def train(config):
    # seeding randomness
    tf.set_random_seed(config.training.tf_random_seed)
    np.random.seed(config.training.np_random_seed)

    # Setting up training parameters
    max_num_training_steps = config.training.max_num_training_steps
    step_size_schedule = config.training.step_size_schedule
    weight_decay = config.training.weight_decay
    momentum = config.training.momentum
    batch_size = config.training.batch_size
    adversarial_training = config.training.adversarial_training
    eval_during_training = config.training.eval_during_training
    if eval_during_training:
        num_eval_steps = config.training.num_eval_steps

    # Setting up output parameters
    num_output_steps = config.training.num_output_steps
    num_summary_steps = config.training.num_summary_steps
    num_checkpoint_steps = config.training.num_checkpoint_steps

    # Setting up the data and the model
    data_path = config.data.data_path
    raw_cifar = cifar10_input.CIFAR10Data(data_path)
    global_step = tf.contrib.framework.get_or_create_global_step()
    model = resnet.Model(config.model)

    # uncomment to get a list of trainable variables
    # model_vars = tf.trainable_variables()
    # slim.model_analyzer.analyze_vars(model_vars, print_info=True)

    # Setting up the optimizer
    boundaries = [int(sss[0]) for sss in step_size_schedule]
    boundaries = boundaries[1:]
    values = [sss[1] for sss in step_size_schedule]
    learning_rate = tf.train.piecewise_constant(tf.cast(global_step, tf.int32),
                                                boundaries, values)
    total_loss = model.mean_xent + weight_decay * model.weight_decay_loss

    optimizer = tf.train.MomentumOptimizer(learning_rate, momentum)
    train_step = optimizer.minimize(total_loss, global_step=global_step)

    # Set up adversary
    attack = SpatialAttack(model, config.attack)

    # Setting up the Tensorboard and checkpoint outputs
    model_dir = config.model.output_dir
    if eval_during_training:
        eval_dir = os.path.join(model_dir, 'eval')
        if not os.path.exists(eval_dir):
            os.makedirs(eval_dir)

    # We add accuracy and xent twice so we can easily make three types of
    # comparisons in Tensorboard:
    # - train vs eval (for a single run)
    # - train of different runs
    # - eval of different runs

    saver = tf.train.Saver(max_to_keep=3)

    tf.summary.scalar('accuracy_adv_train',
                      model.accuracy,
                      collections=['adv'])
    tf.summary.scalar('accuracy_adv', model.accuracy, collections=['adv'])
    tf.summary.scalar('xent_adv_train',
                      model.xent / batch_size,
                      collections=['adv'])
    tf.summary.scalar('xent_adv', model.xent / batch_size, collections=['adv'])
    tf.summary.image('images_adv_train', model.x_image, collections=['adv'])
    adv_summaries = tf.summary.merge_all('adv')

    tf.summary.scalar('accuracy_nat_train',
                      model.accuracy,
                      collections=['nat'])
    tf.summary.scalar('accuracy_nat', model.accuracy, collections=['nat'])
    tf.summary.scalar('xent_nat_train',
                      model.xent / batch_size,
                      collections=['nat'])
    tf.summary.scalar('xent_nat', model.xent / batch_size, collections=['nat'])
    tf.summary.image('images_nat_train', model.x_image, collections=['nat'])
    tf.summary.scalar('learning_rate', learning_rate, collections=['nat'])
    nat_summaries = tf.summary.merge_all('nat')
    os.environ["CUDA_VISIBLE_DEVICES"] = "1"
    gpu_options = tf.GPUOptions(allow_growth=True)

    with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:

        # initialize data augmentation
        if config.training.data_augmentation:
            cifar = cifar10_input.AugmentedCIFAR10Data(raw_cifar, sess)
        else:
            cifar = raw_cifar

        # Initialize the summary writer, global variables, and our time counter.
        summary_writer = tf.summary.FileWriter(model_dir, sess.graph)
        if eval_during_training:
            eval_summary_writer = tf.summary.FileWriter(eval_dir)

        sess.run(tf.global_variables_initializer())
        training_time = 0.0

        # Main training loop
        for ii in range(max_num_training_steps + 1):
            x_batch, y_batch = cifar.train_data.get_next_batch(
                batch_size, multiple_passes=True)

            noop_trans = np.zeros([len(x_batch), 3])
            # Compute Adversarial Perturbations
            if adversarial_training:
                start = timer()
                x_batch_adv, adv_trans = attack.perturb(x_batch, y_batch, sess)
                end = timer()
                training_time += end - start
            else:
                x_batch_adv, adv_trans = x_batch, noop_trans

            nat_dict = {
                model.x_input: x_batch,
                model.y_input: y_batch,
                model.transform: noop_trans,
                model.is_training: False
            }

            adv_dict = {
                model.x_input: x_batch_adv,
                model.y_input: y_batch,
                model.transform: adv_trans,
                model.is_training: False
            }

            # Output to stdout
            if ii % num_output_steps == 0:
                nat_acc = sess.run(model.accuracy, feed_dict=nat_dict)
                adv_acc = sess.run(model.accuracy, feed_dict=adv_dict)
                print('Step {}:    ({})'.format(ii, datetime.now()))
                print('    training nat accuracy {:.4}%'.format(nat_acc * 100))
                print('    training adv accuracy {:.4}%'.format(adv_acc * 100))
                if ii != 0:
                    print('    {} examples per second'.format(
                        num_output_steps * batch_size / training_time))
                    training_time = 0.0

            # Tensorboard summaries
            if ii % num_summary_steps == 0:
                summary = sess.run(adv_summaries, feed_dict=adv_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))
                summary = sess.run(nat_summaries, feed_dict=nat_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))

            # Write a checkpoint
            if ii % num_checkpoint_steps == 0:
                saver.save(sess,
                           os.path.join(model_dir, 'checkpoint'),
                           global_step=global_step)

            if eval_during_training and ii % num_eval_steps == 0:
                evaluate(model, attack, sess, config, eval_summary_writer)

            # Actual training step
            start = timer()
            if adversarial_training:
                adv_dict[model.is_training] = True
                sess.run(train_step, feed_dict=adv_dict)
            else:
                nat_dict[model.is_training] = True
                sess.run(train_step, feed_dict=nat_dict)
            end = timer()
            training_time += end - start
Ejemplo n.º 14
0
def train(config='configs/fannyconfig.json',
          save_root_path='/cluster/work/math/fanyang-broglil/CoreRepo',
          experiment_json_fname='experiments.json',
          local_json_dir_name='local_json_files',
          worstofk=None,
          attack_style=None,
          attack_limits=None,
          fo_epsilon=None,
          fo_step_size=None,
          fo_num_steps=None,
          lambda_core=None,
          num_ids=None,
          group_size=None,
          use_core=None,
          seed=None,
          save_in_local_json=True,
          this_repo=None):

    # reset default graph (needed for running locally with run_jobs_ray.py)
    tf.reset_default_graph()

    # get configs
    config_dict = utilities.get_config(config)
    config_dict_copy = copy.deepcopy(config_dict)
    config = utilities.config_to_namedtuple(config_dict)

    # seeding randomness
    if seed == None:
        seed = config.training.tf_random_seed
    else:
        config_dict_copy['training']['tf_random_seed'] = seed
    tf.set_random_seed(seed)
    np.random.seed(seed)

    # Setting up training parameters
    max_num_training_steps = config.training.max_num_training_steps
    step_size_schedule = config.training.step_size_schedule
    weight_decay = config.training.weight_decay
    momentum = config.training.momentum

    if group_size == None:
        group_size = config.training.group_size
    else:
        config_dict_copy['training']['group_size'] = int(group_size)
    if num_ids == None:
        num_ids = config.training.num_ids
    else:
        config_dict_copy['training']['num_ids'] = int(num_ids)
    if lambda_core == None:
        lambda_core = config.training.lambda_
    else:
        config_dict_copy['training']['lambda_'] = float(lambda_core)
    if use_core == None:
        use_core = config.training.use_core
    else:
        config_dict_copy['training']['use_core'] = use_core

    batch_size = config.training.batch_size
    # number of groups with group size > 1
    num_grouped_ids = batch_size - num_ids
    # number of unique ids needs to be larger than half the desired batch size
    # so that full batch can be filled up
    assert num_ids >= batch_size / group_size
    # currently, code is designed for groups of size 2
    # assert batch_size % group_size == 0

    adversarial_training = config.training.adversarial_training
    eval_during_training = config.training.eval_during_training
    if eval_during_training:
        num_eval_steps = config.training.num_eval_steps

    # Setting up output parameters
    num_output_steps = config.training.num_output_steps
    num_summary_steps = config.training.num_summary_steps
    num_checkpoint_steps = config.training.num_checkpoint_steps
    num_easyeval_steps = config.training.num_easyeval_steps

    # Setting up the data and the model
    data_path = config.data.data_path

    if config.data.dataset_name == "cifar-10":
        raw_iterator = cifar10_input.CIFAR10Data(data_path)
    elif config.data.dataset_name == "cifar-100":
        raw_iterator = cifar100_input.CIFAR100Data(data_path)
    elif config.data.dataset_name == "svhn":
        raw_iterator = svhn_input.SVHNData(data_path)
    else:
        raise ValueError("Unknown dataset name.")

    global_step = tf.train.get_or_create_global_step()

    model_family = config.model.model_family
    if model_family == "resnet":
        if config.attack.use_spatial and config.attack.spatial_method == 'fo':
            diffable = True
        else:
            diffable = False
        model = resnet.Model(config.model, num_ids, diffable)
    elif model_family == "vgg":
        if config.attack.use_spatial and config.attack.spatial_method == 'fo':
            # TODO: add differentiable transformer to vgg.py
            raise NotImplementedError
        model = vgg.Model(config.model, num_ids)

    # uncomment to get a list of trainable variables
    # model_vars = tf.trainable_variables()

    # Setting up the optimizer
    boundaries = [int(sss[0]) for sss in step_size_schedule]
    boundaries = boundaries[1:]
    values = [sss[1] for sss in step_size_schedule]
    learning_rate = tf.train.piecewise_constant(tf.cast(global_step, tf.int32),
                                                boundaries, values)

    if use_core and lambda_core > 0:
        total_loss = (model.mean_xent +
                      weight_decay * model.weight_decay_loss +
                      lambda_core * model.core_loss)
    else:
        total_loss = model.mean_xent + weight_decay * model.weight_decay_loss

    optimizer = tf.train.MomentumOptimizer(learning_rate, momentum)
    train_step = optimizer.minimize(total_loss, global_step=global_step)

    # Set up adversary
    if worstofk == None:
        worstofk = config.attack.random_tries
    else:
        config_dict_copy['attack']['random_tries'] = worstofk
    if fo_epsilon == None:
        fo_epsilon = config.attack.epsilon
    else:
        config_dict_copy['attack']['epsilon'] = fo_epsilon
    if fo_step_size == None:
        fo_step_size = config.attack.step_size
    else:
        config_dict_copy['attack']['step_size'] = fo_step_size
    if fo_num_steps == None:
        fo_num_steps = config.attack.num_steps
    else:
        config_dict_copy['attack']['num_steps'] = fo_num_steps
    # @ Luzius: incorporate being able to choose multiple transformations
    if attack_style == None:
        attack_style = 'rotate'

    # Training attack
    # L-inf attack if use_spatial is False and use_linf is True
    # spatial attack if use_spatial is True and use_linf is False
    # spatial random attack if spatial_method is 'random'
    # spatial PGD attack if spatial_method is 'fo'
    attack = SpatialAttack(model, config.attack, config.attack.spatial_method,
                           worstofk, attack_limits, fo_epsilon, fo_step_size,
                           fo_num_steps)
    # Different eval attacks
    # Random attack
    # L-inf attack if use_spatial is False and use_linf is True
    # random (worst-of-1) spatial attack if use_spatial is True
    # and use_linf is False
    attack_eval_random = SpatialAttack(model, config.attack, 'random', 1,
                                       attack_limits, fo_epsilon, fo_step_size,
                                       fo_num_steps)
    # First order attack
    # L-inf attack if use_spatial is False and use_linf is True
    # first-order spatial attack if use_spatial is True and use_linf is False
    attack_eval_fo = SpatialAttack(model, config.attack, 'fo', 1,
                                   attack_limits, fo_epsilon, fo_step_size,
                                   fo_num_steps)

    # Grid attack
    # spatial attack if use_spatial is True and use_linf is False
    # not executed for L-inf attacks
    attack_eval_grid = SpatialAttack(model, config.attack, 'grid', None,
                                     attack_limits)

    # TODO(christina): add L-inf attack with random restarts

    # ------------------START EXPERIMENT -------------------------
    # Initialize the Repo
    print("==> Creating repo..")
    # Create repo object if it wasn't passed, comment out if repo has issues
    if this_repo == None:
        this_repo = exprepo.ExperimentRepo(
            save_in_local_json=save_in_local_json,
            json_filename=experiment_json_fname,
            local_dir_name=local_json_dir_name,
            root_dir=save_root_path)

    # Create new experiment
    if this_repo != None:
        exp_id = this_repo.create_new_experiment(config.data.dataset_name,
                                                 model_family, worstofk,
                                                 attack_style, attack_limits,
                                                 lambda_core, num_grouped_ids,
                                                 group_size, config_dict_copy)

    # Setting up the Tensorboard and checkpoint outputs
    model_dir = '%s/logdir/%s' % (save_root_path, exp_id)

    # We add accuracy and xent twice so we can easily make three types of
    # comparisons in Tensorboard:
    # - train vs eval (for a single run)
    # - train of different runs
    # - eval of different runs

    saver = tf.train.Saver(max_to_keep=3)

    tf.summary.scalar('accuracy_nat_train',
                      model.accuracy,
                      collections=['nat'])
    tf.summary.scalar('accuracy_nat', model.accuracy, collections=['nat'])
    tf.summary.scalar('xent_nat_train',
                      model.xent / batch_size,
                      collections=['nat'])
    tf.summary.scalar('xent_nat', model.xent / batch_size, collections=['nat'])
    tf.summary.image('images_nat_train', model.x_image, collections=['nat'])
    tf.summary.scalar('learning_rate', learning_rate, collections=['nat'])
    nat_summaries = tf.summary.merge_all('nat')

    # data augmentation used if config.training.data_augmentation_core is True
    x_input_placeholder = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])
    flipped = tf.map_fn(lambda img: tf.image.random_flip_left_right(img),
                        x_input_placeholder)

    with tf.Session() as sess:
        # initialize standard data augmentation
        if config.training.data_augmentation:
            if config.data.dataset_name == "cifar-10":
                data_iterator = cifar10_input.AugmentedCIFAR10Data(
                    raw_iterator, sess)
            elif config.data.dataset_name == "cifar-100":
                data_iterator = cifar100_input.AugmentedCIFAR100Data(
                    raw_iterator, sess)
            elif config.data.dataset_name == "svhn":
                data_iterator = svhn_input.AugmentedSVHNData(
                    raw_iterator, sess)
            else:
                raise ValueError("Unknown dataset name.")
        else:
            data_iterator = raw_iterator

        eval_dict = {
            model.x_input: data_iterator.eval_data.xs,
            model.y_input: data_iterator.eval_data.ys,
            model.group: np.arange(0, batch_size, 1, dtype="int32"),
            model.transform: np.zeros([data_iterator.eval_data.n, 3]),
            model.is_training: False
        }

        # Initialize the summary writer, global variables, and our time counter.
        summary_writer = tf.summary.FileWriter(model_dir, sess.graph)
        # if eval_during_training:
        eval_dir = os.path.join(model_dir, 'eval')
        os.makedirs(eval_dir, exist_ok=True)
        eval_summary_writer = tf.summary.FileWriter(eval_dir)

        sess.run(tf.global_variables_initializer())
        training_time = 0.0
        run_time_without_eval = 0.0
        run_time_adv_ex_creation = 0.0
        run_time_train_step = 0.0
        ####################################
        # Main training loop
        ####################################
        start_time = time.time()
        no_epochs_done = 0  # the same as epoch_count, need to merge
        start_epoch = timer()
        it_count = 0
        epoch_count = 0
        acc_sum = 0

        for ii in range(max_num_training_steps + 1):
            # original batch
            x_batch, y_batch, epoch_done = data_iterator.train_data.get_next_batch(
                num_ids, multiple_passes=True)
            no_epochs_done += epoch_done
            # noop trans
            noop_trans = np.zeros([len(x_batch), 3])
            # id_batch starts with IDs of original examples
            id_batch = np.arange(0, num_ids, 1, dtype="int32")

            if use_core:
                # first num_id examples of batch are natural
                x_batch_inp = x_batch
                y_batch_inp = y_batch
                trans_inp = noop_trans
                id_batch_inp = id_batch

                start = timer()
                for _ in range(group_size - 1):
                    if config.training.data_augmentation_core:
                        raise NotImplementedError

                    # create rotated examples
                    x_batch_adv_i, trans_adv_i = attack.perturb(
                        x_batch, y_batch, sess)

                    # construct new batches including rotated examples
                    x_batch_inp = np.concatenate((x_batch_inp, x_batch_adv_i),
                                                 axis=0)
                    y_batch_inp = np.concatenate((y_batch_inp, y_batch),
                                                 axis=0)
                    trans_inp = np.concatenate((trans_inp, trans_adv_i),
                                               axis=0)
                    id_batch_inp = np.concatenate((id_batch_inp, id_batch),
                                                  axis=0)
                end = timer()
                training_time += end - start
                run_time_without_eval += end - start
                run_time_adv_ex_creation += end - start

                trans_adv = trans_inp[num_ids:, ...]
                id_batch_adv = id_batch_inp[num_ids:]
                y_batch_adv = y_batch_inp[num_ids:]
                x_batch_adv = x_batch_inp[num_ids:, ...]
            else:
                if adversarial_training:
                    start = timer()
                    x_batch_inp, trans_inp = attack.perturb(
                        x_batch, y_batch, sess)
                    end = timer()
                    training_time += end - start
                    run_time_without_eval += end - start
                    run_time_adv_ex_creation += end - start
                else:
                    x_batch_inp, trans_inp = x_batch, noop_trans
                # for adversarial training and plain training, the following
                # variables coincide
                y_batch_inp = y_batch
                y_batch_adv = y_batch
                trans_adv = trans_inp
                x_batch_adv = x_batch_inp
                id_batch_inp = id_batch
                id_batch_adv = id_batch

            # feed_dict for training step
            inp_dict = {
                model.x_input: x_batch_inp,
                model.y_input: y_batch_inp,
                model.group: id_batch_inp,
                model.transform: trans_inp,
                model.is_training: False
            }

            # separate natural and adversarially transformed examples for eval
            nat_dict = {
                model.x_input: x_batch,
                model.y_input: y_batch,
                model.group: id_batch,
                model.transform: noop_trans,
                model.is_training: False
            }

            adv_dict = {
                model.x_input: x_batch_adv,
                model.y_input: y_batch_adv,
                model.group: id_batch_adv,
                model.transform: trans_adv,
                model.is_training: False
            }

            ########### Outputting/saving weights and evaluations ###########
            acc_grid_te = -1.0
            avg_xent_grid_te = -1.0
            acc_fo_te = -1.0
            avg_xent_fo_te = -1.0
            saved_weights = 0

            # Compute training accuracy on this minibatch
            nat_acc_tr = 100 * sess.run(model.accuracy, feed_dict=nat_dict)

            # Output to stdout
            if epoch_done:
                epoch_time = timer() - start_epoch
                # Average
                av_acc = acc_sum / it_count

                # ToDo: Log this to file as well

                # Training accuracy over epoch
                print('Epoch {}:    ({})'.format(epoch_count, datetime.now()))
                print('    training natural accuracy {:.4}%'.format(av_acc))
                print('    {:.4} seconds per epoch'.format(epoch_time))

                # Accuracy on entire test set
                nat_acc_te = 100 * sess.run(model.accuracy,
                                            feed_dict=eval_dict)

                print(
                    '    test set natural accuracy {:.4}%'.format(nat_acc_te))

                # Set loss sum, it count back to zero
                acc_sum = nat_acc_tr
                epoch_done = 0
                epoch_count += 1
                start_epoch = timer()
                it_count = 1

            else:
                it_count += 1
                acc_sum += nat_acc_tr

            # Output to stdout
            if ii % num_output_steps == 0:
                # nat_acc_tr = 100 * sess.run(model.accuracy, feed_dict=nat_dict)
                adv_acc_tr = 100 * sess.run(model.accuracy, feed_dict=adv_dict)
                inp_acc_tr = 100 * sess.run(model.accuracy, feed_dict=inp_dict)
                # print('Step {}:    ({})'.format(ii, datetime.now()))
                # print('    training nat accuracy {:.4}%'.format(nat_acc_tr))
                # print('    training adv accuracy {:.4}%'.format(adv_acc_tr))
                # print('    training inp accuracy {:.4}%'.format(inp_acc_tr))
                if ii != 0:
                    #     print('    {} examples per second'.format(
                    #         num_output_steps * batch_size / training_time))
                    training_time = 0.0

            # Tensorboard summaries and heavy checkpoints
            if ii % num_summary_steps == 0:
                summary = sess.run(nat_summaries, feed_dict=nat_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))

            # Write a checkpoint and eval if it's time
            if ii % num_checkpoint_steps == 0 or ii == max_num_training_steps:
                # Save checkpoint data (weights)
                saver.save(sess,
                           os.path.join(model_dir, 'checkpoint'),
                           global_step=global_step)
                saved_weights = 1

            # Write evaluation meta data for checkpoint
            if ii % num_easyeval_steps == 0 or ii == max_num_training_steps:
                # Get training accuracies
                nat_acc_tr = 100 * sess.run(model.accuracy, feed_dict=nat_dict)
                adv_acc_tr = 100 * sess.run(model.accuracy, feed_dict=adv_dict)
                inp_acc_tr = 100 * sess.run(model.accuracy, feed_dict=inp_dict)

                # Evaluation on random and natural
                [
                    acc_nat_te, acc_rand_adv_te, avg_xent_nat_te,
                    avg_xent_adv_te
                ] = evaluate(model, attack_eval_random, sess, config, 'random',
                             data_path, None)

                # Evaluation on grid (only for spatial attacks)
                if ((eval_during_training and ii % num_eval_steps == 0
                     and ii > 0 and config.attack.use_spatial) or
                    (eval_during_training and ii == max_num_training_steps
                     and config.attack.use_spatial)):
                    if config.attack.use_spatial and config.attack.spatial_method == 'fo':
                        # Evaluation on first-order PDG attack (too expensive to
                        # evaluate more frequently on whole dataset)
                        [_, acc_fo_te, _,
                         avg_xent_fo_te] = evaluate(model, attack_eval_fo,
                                                    sess, config, 'fo',
                                                    data_path, None)
                    # Evaluation on grid
                    [_, acc_grid_te, _, avg_xent_grid_te
                     ] = evaluate(model, attack_eval_grid, sess, config,
                                  "grid", data_path, eval_summary_writer)

                chkpt_id = this_repo.create_training_checkpoint(
                    exp_id,
                    training_step=ii,
                    epoch=no_epochs_done,
                    train_acc_nat=nat_acc_tr,
                    train_acc_adv=adv_acc_tr,
                    train_acc_inp=inp_acc_tr,
                    test_acc_nat=acc_nat_te,
                    test_acc_adv=acc_rand_adv_te,
                    test_acc_fo=acc_fo_te,
                    test_acc_grid=acc_grid_te,
                    test_loss_nat=avg_xent_nat_te,
                    test_loss_adv=avg_xent_adv_te,
                    test_loss_fo=avg_xent_fo_te,
                    test_loss_grid=avg_xent_grid_te)

                if saved_weights == 0:
                    # Save checkpoint data (weights)
                    saver.save(
                        sess,
                        os.path.join(model_dir,
                                     '{}_checkpoint'.format(chkpt_id)))

            # Actual training step
            start = timer()
            inp_dict[model.is_training] = True
            sess.run(train_step, feed_dict=inp_dict)
            end = timer()
            training_time += end - start
            run_time_without_eval += end - start
            run_time_train_step += end - start

        runtime = time.time() - start_time
        this_repo.mark_experiment_as_completed(
            exp_id,
            train_acc_nat=nat_acc_tr,
            train_acc_adv=adv_acc_tr,
            train_acc_inp=inp_acc_tr,
            test_acc_nat=acc_nat_te,
            test_acc_adv=acc_rand_adv_te,
            test_acc_fo=acc_fo_te,
            test_acc_grid=acc_grid_te,
            runtime=runtime,
            runtime_wo_eval=run_time_without_eval,
            runtime_train_step=run_time_train_step,
            runtime_adv_ex_creation=run_time_adv_ex_creation)

    return 0
Ejemplo n.º 15
0
def evaluate(model, attack, sess, config, attack_type, data_path,reg_model_path,
             summary_writer=None, eval_on_train=False):
    num_eval_examples = config.eval.num_eval_examples
    eval_batch_size = config.eval.batch_size

    if config.data.dataset_name == "cifar-10":
        data_iterator = cifar10_input.CIFAR10Data(data_path)
    elif config.data.dataset_name == "cifar-100":
        data_iterator = cifar100_input.CIFAR100Data(data_path)
    elif config.data.dataset_name == "svhn":
        data_iterator = svhn_input.SVHNData(data_path)

    else:
        raise ValueError("Unknown dataset name.")

    global_step = tf.train.get_or_create_global_step()
    # Iterate over the samples batch-by-batch
    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    total_xent_nat = 0.
    total_xent_adv = 0.
    total_corr_nat = 0
    total_corr_adv = 0

    for ibatch in trange(num_batches):
      bstart = ibatch * eval_batch_size
      bend = min(bstart + eval_batch_size, num_eval_examples)

      if eval_on_train:
        x_batch = data_iterator.train_data.xs[bstart:bend, :]
        y_batch = data_iterator.train_data.ys[bstart:bend]
      else:
        x_batch = data_iterator.eval_data.xs[bstart:bend, :]
        y_batch = data_iterator.eval_data.ys[bstart:bend]

      noop_trans = np.zeros([len(x_batch), 3])
      if config.eval.adversarial_eval:
          # print("PERTURBED!")
          x_batch_adv, adv_trans = attack.perturb(x_batch, y_batch, sess)
      else:
          x_batch_adv, adv_trans = x_batch, noop_trans

      ori_trans = adv_trans
      # ori_trans_x = ori_trans[:0]
      # ori_trans_y = ori_trans[:1]
      # ori_rot = ori_trans[:2]
      ori_trans_x, ori_trans_y, ori_rot = tf.unstack(tf.cast(adv_trans, tf.float32), axis=1)
      adv_trans = tf.cast(adv_trans, tf.float32)
      x_batch_adv_transformed = simple_transform(x_batch_adv, adv_trans, config.model.reg_pad_mode)
      x_batch_adv_transformed = sess.run(x_batch_adv_transformed)
      # utilities.show_image_batch(x_batch_adv_transformed, title='adv')
      # print(ori_trans_x.shape)
      # print(ori_trans_y.shape)
      # print(ori_rot.shape)
      # ones = tf.ones(shape=tf.shape(ori_trans_x))
      # zeros = tf.zeros(shape=tf.shape(ori_trans_x))
      # trans = tf.stack([ones, zeros, -ori_trans_x,
      #                   zeros, ones, -ori_trans_y,
      #                   zeros, zeros], axis=1)
      # temp = tf.contrib.image.transform(x_batch_adv, trans, interpolation='BILINEAR')
      # x_batch_adv_transformed = tf.contrib.image.rotate(temp, ori_rot, interpolation='BILINEAR')


      # use regression model to turn back peturbed adversarial image (for evaluation)
      g_temp = tf.Graph()

      with tf.Session(graph = g_temp) as sess2:
          print("sub session")
          id_batch = np.arange(0, num_ids, 1, dtype="int32")

          with g_temp.as_default():
              # Restore the checkpoint of the regression model
              metapath = reg_model_path + ".meta"
              saver = tf.train.import_meta_graph(metapath)
              saver.restore(sess2, reg_model_path)

              # init.run()
              # # load model_reg
              model_reg = resnet_reg.Model(config.model, num_ids, diffable,
                                   config.training.adversarial_ce)

              graph=tf.get_default_graph()
              # restore tensors
              group = graph.get_tensor_by_name("input/group:0")
              x_input = graph.get_tensor_by_name("input/Placeholder:0")
              y_input = graph.get_tensor_by_name("input/Placeholder_1:0")
              transform = graph.get_tensor_by_name("input/Placeholder_2:0")
              is_training = graph.get_tensor_by_name("input/Placeholder_3:0")

              prediction = graph.get_tensor_by_name("prediction/xw_plus_b:0")

              # This is just a placeholder, since inference in reg model does not need label
              y_batch_placeholder = np.zeros([len(x_batch), 3]).astype(np.float)
              x_batch_adv = x_batch_adv.astype(np.float)
              x_batch = x_batch.astype(np.float)

              # the original x_batch_adv is not transformed yet, so we need to transform
              # before we feed the batch into the model



              regression_feed = {x_input: x_batch_adv_transformed,
                                 y_input: y_batch_placeholder,
                                 group: id_batch,
                                 transform: noop_trans,
                                 is_training: False}
              predictions = sess2.run(prediction, feed_dict=regression_feed)

              # we also feed the test batch for natural accuracy into the regression mode
              # to check how much will it degrade the nat.acc
              nat_reg_feed = {x_input: x_batch_adv,
                          y_input: y_batch_placeholder,
                          group: id_batch,
                          transform: noop_trans,
                          is_training: False
              }
              nat_predictions = sess2.run(prediction, feed_dict=nat_reg_feed)
              # using the same style of transformation: for nat. should be noop_trans - nat_predictions
              nat_attack = noop_trans - nat_predictions

              # op = sess2.graph.get_operations()
              # for m in op:
              #     print(m.name)



              # print(transPara.shape)
              # trans_x = transPara[:1]
              # trans_y = transPara[:2]
              # rot = transPara[:3]

              trans_x, trans_y, rot = tf.unstack(predictions, axis=1)
              ones = tf.ones(shape=tf.shape(trans_x))
              zeros = tf.zeros(shape=tf.shape(trans_x))

              print("check shapes")
              print(predictions.shape)
              print(ori_trans.shape)



              print("original attack")
              print("trans X: {}".format(sess.run(ori_trans_x)[0:4]))
              print("trans Y: {}".format(sess.run(ori_trans_y)[0:4]))
              print("rot angle: {}".format(sess.run(ori_rot)[0:4]))

              print("\npredicted attack")
              print("trans X: {}".format(sess2.run(trans_x)[0:4]))
              print("trans Y: {}".format(sess2.run(trans_y)[0:4]))
              print("rot angle: {}".format(sess2.run(rot)[0:4]))

              remain_diff = ori_trans - predictions


              diff_x, diff_y, diff_rot = tf.unstack(remain_diff, axis=1)
              print("\nremain_diff")
              print("trans X: {}".format(sess2.run(diff_x)[0:4]))
              print("trans Y: {}".format(sess2.run(diff_y)[0:4]))
              print("rot angle: {}".format(sess2.run(diff_rot)[0:4]))

              x = x_batch_adv_transformed
              # print(ones.shape)
              trans_1 = tf.stack([ones, zeros, trans_x,
                                zeros, ones, trans_y,
                                zeros, zeros], axis=1)

              x = tf.contrib.image.transform(x, trans_1, interpolation='BILINEAR')
              x = tf.contrib.image.rotate(x, -rot*np.pi/180.0, interpolation='BILINEAR')


              de_adv = sess2.run(x)
              # utilities.show_image_batch(de_adv, title = 'de_adv')
              dict_nat = {model.x_input: x_batch,
                          model.y_input: y_batch,
                          # model.transform: noop_trans,
                          model.transform: nat_attack,
                          model.is_training: False}
              # we the transformation is done in the model part, Thus we use the adversarial_attack_para - prediction
              # as the new model.transform,  if it's perfectly predicted, then it should be close to zero
              dict_adv = {model.x_input: x_batch_adv,
                          model.y_input: y_batch,
                          model.transform: remain_diff,
                          model.is_training: False}
              # print("entered new session")

      cur_corr_nat, cur_xent_nat = sess.run([model.num_correct, model.xent],
                                            feed_dict = dict_nat)
      cur_corr_adv, cur_xent_adv = sess.run([model.num_correct, model.xent],
                                            feed_dict = dict_adv)

      total_xent_nat += cur_xent_nat
      total_xent_adv += cur_xent_adv
      total_corr_nat += cur_corr_nat
      total_corr_adv += cur_corr_adv

    avg_xent_nat = total_xent_nat / num_eval_examples
    avg_xent_adv = total_xent_adv / num_eval_examples
    acc_nat = total_corr_nat / num_eval_examples
    acc_adv = total_corr_adv / num_eval_examples

    if summary_writer:
        summary = tf.Summary(value=[
              tf.Summary.Value(tag='xent_adv_eval', simple_value= avg_xent_adv),
              tf.Summary.Value(tag='xent_nat_eval', simple_value= avg_xent_nat),
              tf.Summary.Value(tag='xent_adv', simple_value= avg_xent_adv),
              tf.Summary.Value(tag='xent_nat', simple_value= avg_xent_nat),
              tf.Summary.Value(tag='accuracy_adv_eval', simple_value= acc_adv),
              tf.Summary.Value(tag='accuracy_nat_eval', simple_value= acc_nat),
              tf.Summary.Value(tag='accuracy_adv', simple_value= acc_adv),
              tf.Summary.Value(tag='accuracy_nat', simple_value= acc_nat)])
        summary_writer.add_summary(summary, global_step.eval(sess))

    step = global_step.eval(sess)
    print('Eval at step: {}'.format(step))
    print('  Adversary: ', attack_type)
    print('  natural: {:.2f}%'.format(100 * acc_nat))
    print('  adversarial: {:.2f}%'.format(100 * acc_adv))
    print('  avg nat xent: {:.4f}'.format(avg_xent_nat))
    print('  avg adv xent: {:.4f}'.format(avg_xent_adv))

    return [100 * acc_nat, 100 * acc_adv, avg_xent_nat, avg_xent_adv]
Ejemplo n.º 16
0
    saver.restore(sess, model_file)

    # Create attack class
    attack_class = getattr(sys.modules[__name__], args.attack)
    attack = attack_class(model, args)

    # Create directory
    if args.save_img:
        tf.gfile.MakeDirs(args.save_dir)

    # Print hyperparameters
    for key, val in vars(args).items():
        tf.logging.info('{}={}'.format(key, val))

    # Load dataset
    cifar = cifar10_input.CIFAR10Data(args.data_dir)

    # Load indices
    indices = np.load('../cifar10_data/indices_untargeted.npy')

    count = 0
    index = args.img_index_start
    total_num_corrects = 0
    total_queries = []
    index_to_query = {}

    while count < args.sample_size:
        tf.logging.info("")

        # Get image and label
        initial_img = cifar.eval_data.xs[indices[index]]
Ejemplo n.º 17
0
def train(config='configs/cifar10_config_stn.json',
          save_root_path='/cluster/work/math/fanyang-broglil/CoreRepo',
          worstofk=None,
          attack_style=None,
          attack_limits=None,
          lambda_core=None,
          num_grouped_ids=None,
          num_ids=None,
          group_size=None,
          use_core=None,
          seed=None,
          this_repo=None):

    config_dict = utilities.get_config(config)
    config_dict_copy = copy.deepcopy(config_dict)
    # model_dir = config_dict['model']['output_dir']
    # if not os.path.exists(model_dir):
    #   os.makedirs(model_dir)

    # # keep the configuration file with the model for reproducibility
    # with open(os.path.join(model_dir, 'config.json'), 'w') as f:
    #     json.dump(config_dict, f, sort_keys=True, indent=4)

    config = utilities.config_to_namedtuple(config_dict)

    # seeding randomness
    if seed == None:
        seed = config.training.tf_random_seed
    else:
        config_dict_copy['training']['tf_random_seed'] = seed
    tf.set_random_seed(seed)
    np.random.seed(seed)

    # Setting up training parameters
    max_num_epochs = config.training.max_num_epochs
    step_size_schedule = config.training.step_size_schedule
    weight_decay = config.training.weight_decay
    momentum = config.training.momentum
    num_ids = config.training.num_ids  # number of IDs per minibatch

    if group_size == None:
        group_size = config.training.group_size
    else:
        config_dict_copy['training']['group_size'] = group_size
    if num_grouped_ids == None:
        num_grouped_ids = config.training.num_grouped_ids
    else:
        config_dict_copy['training']['num_grouped_ids'] = num_grouped_ids
    if num_ids == None:
        num_ids = config.training.num_ids
    else:
        config_dict_copy['training']['num_ids'] = num_ids
    if lambda_core == None:
        lambda_core = config.training.lambda_
    else:
        config_dict_copy['training']['lambda_'] = lambda_core
    if use_core == None:
        use_core = config.training.use_core
    else:
        config_dict_copy['training']['use_core'] = use_core

    adversarial_training = config.training.adversarial_training
    eval_during_training = config.training.eval_during_training
    if eval_during_training:
        num_eval_steps = config.training.num_eval_steps

    # Setting up output parameters
    num_summary_steps = config.training.num_summary_steps
    num_checkpoint_steps = config.training.num_checkpoint_steps
    num_easyeval_steps = config.training.num_easyeval_steps

    # mini batch size per iteration
    # ToDo: need to make this support variable number of num_grouped_ids
    batch_size = num_ids + num_grouped_ids

    # Setting up model and loss
    model_family = config.model.model_family
    with_transformer = config.model.transformer
    translation_model = config.model.translation_model
    if model_family == "resnet":
        model = loc_net.Model(config.model)
    else:
        print("Model family does not exist")
        exit()
    if use_core:
        total_loss = model.y_loss  #model.mean_xent + weight_decay * model.weight_decay_loss + lambda_core * model.core_loss2
    else:
        total_loss = model.y_loss  #model.mean_xent + weight_decay * model.weight_decay_loss

    # Setting up the data and the model
    data_path = config.data.data_path

    if config.data.dataset_name == "cifar-10":
        raw_cifar = cifar10_input.CIFAR10Data(data_path)
    elif config.data.dataset_name == "cifar-100":
        raw_cifar = cifar100_input.CIFAR100Data(data_path)
    else:
        raise ValueError("Unknown dataset name.")

    # uncomment to get a list of trainable variables
    # model_vars = tf.trainable_variables()
    # slim.model_analyzer.analyze_vars(model_vars, print_info=True)

    # Setting up the optimizer
    boundaries = [int(sss[0]) for sss in step_size_schedule]
    boundaries = boundaries[1:]
    values = [sss[1] for sss in step_size_schedule]

    global_step = tf.train.get_or_create_global_step()
    learning_rate = tf.train.piecewise_constant(tf.cast(global_step, tf.int32),
                                                boundaries, values)

    optimizer = tf.train.MomentumOptimizer(learning_rate, momentum)
    #optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate,
    #                                   name="Adam")
    train_step = optimizer.minimize(total_loss, global_step=global_step)

    # Set up adversary
    if worstofk == None:
        worstofk = config.attack.random_tries
    else:
        config_dict_copy['attack']['random_tries'] = worstofk
    # @ Luzius: incorporate being able to choose multiple transformations
    if attack_style == None:
        attack_style = 'rotate'

    # Training attack
    attack = SpatialAttack(model, config.attack, 'random', worstofk,
                           attack_limits)
    # Different eval attacks
    # Same attack as worstofk
    # @ Luzius: currently the names are not clear/consistent since I wasn't sure if we actually want random or not since you originally had your attack like that but I feel like it should rather be worstofk?
    # attack_eval_adv = SpatialAttack(model, config.attack, 'random', worstofk, attack_limits)
    attack_eval_random = SpatialAttack(model, config.attack, 'random', 1,
                                       attack_limits)
    # Grid attack
    attack_eval_grid = SpatialAttack(model, config.attack, 'grid', None,
                                     attack_limits)

    # ------------------START EXPERIMENT -------------------------
    # Initialize the Repo
    print("==> Creating repo..")
    # Create repo object if it wasn't passed, comment out if repo has issues
    if this_repo == None:
        this_repo = exprepo.ExperimentRepo(root_dir=save_root_path)

    # Create new experiment
    if this_repo != None:
        exp_id = this_repo.create_new_experiment('cifar-10', model_family,
                                                 worstofk, attack_style,
                                                 attack_limits, lambda_core,
                                                 num_grouped_ids, group_size,
                                                 config_dict_copy)

    # Setting up the Tensorboard and checkpoint outputs
    model_dir = '%s/logdir/%s' % (save_root_path, exp_id)
    os.makedirs(model_dir, exist_ok=True)
    # We add accuracy and xent twice so we can easily make three types of
    # comparisons in Tensorboard:
    # - train vs eval (for a single run)
    # - train of different runs
    # - eval of different runs

    saver = tf.train.Saver(max_to_keep=3)

    tf.summary.scalar('accuracy_nat_train',
                      model.accuracy,
                      collections=['nat'])
    tf.summary.scalar('accuracy_nat', model.accuracy, collections=['nat'])
    tf.summary.scalar('xent_nat_train',
                      model.xent / batch_size,
                      collections=['nat'])
    tf.summary.scalar('xent_nat', model.xent / batch_size, collections=['nat'])
    tf.summary.image('images_nat_train', model.x_image, collections=['nat'])
    tf.summary.scalar('learning_rate', learning_rate, collections=['nat'])
    nat_summaries = tf.summary.merge_all('nat')

    #dataAugmentation
    x_input_placeholder = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])
    flipped = tf.map_fn(lambda img: tf.image.random_flip_left_right(img),
                        x_input_placeholder)

    tot_samp = raw_cifar.train_data.n
    max_num_iterations = int(np.floor((tot_samp / num_ids) * max_num_epochs))
    print("Total # of samples is: %d; This exp. will run %d iterations" %
          (tot_samp, max_num_iterations))

    # Compute the (epoch) gaps between summary, worstof1eval, checkpoints should happen
    summary_gap = int(np.floor(max_num_epochs / num_summary_steps))
    easyeval_gap = int(np.floor(max_num_epochs / num_easyeval_steps))
    checkpoint_gap = int(np.floor(max_num_epochs / num_checkpoint_steps))

    with tf.Session() as sess:

        # initialize data augmentation
        if config.training.data_augmentation:
            if config.data.dataset_name == "cifar-10":
                cifar = cifar10_input.AugmentedCIFAR10Data(raw_cifar, sess)
            elif config.data.dataset_name == "cifar-100":
                cifar = cifar100_input.AugmentedCIFAR100Data(raw_cifar, sess)
            else:
                raise ValueError("Unknown dataset name.")
        else:
            cifar = raw_cifar

        cifar_eval_dict = {
            model.x_input: cifar.eval_data.xs,
            model.y_input: cifar.eval_data.ys,
            model.group: np.arange(0, batch_size, 1, dtype="int32"),
            model.transform: np.zeros([cifar.eval_data.n, 3]),
            model.is_training: False
        }

        # Initialize the summary writer, global variables, and our time counter.
        summary_writer = tf.summary.FileWriter(model_dir, sess.graph)
        #if eval_during_training:
        eval_dir = os.path.join(model_dir, 'eval')
        os.makedirs(eval_dir, exist_ok=True)
        eval_summary_writer = tf.summary.FileWriter(eval_dir)

        sess.run(tf.global_variables_initializer())

        training_time = 0.0

        ####################################
        # Main training loop
        ####################################
        # Initialize cache variables
        start_time = time.time()
        start_epoch = timer()
        it_count = 0
        epoch_count = 0
        acc_sum = 0
        it_summary = 0
        it_easyeval = 0
        it_ckpt = 0
        adv_time = 0
        train_time = 0

        for ii in range(max_num_iterations + 1):
            x_batch, y_batch, epoch_done = cifar.train_data.get_next_batch(
                num_ids, multiple_passes=True)

            noop_trans = np.zeros([len(x_batch), 3])
            x_batch_nat = x_batch
            y_batch_nat = y_batch
            id_batch = np.arange(0, num_ids, 1, dtype="int32")
            if use_core:
                # Create rotated examples
                start = timer()
                ids = np.arange(0, num_grouped_ids, 1, dtype="int32")

                for i in range(config.training.group_size):

                    if config.training.data_augmentation_core:
                        x_batch_core = sess.run(
                            flipped,
                            feed_dict={
                                x_input_placeholder:
                                x_batch[0:num_grouped_ids, :, :, :]
                            })
                    else:
                        x_batch_core = x_batch[0:num_grouped_ids, :, :, :]

                    x_batch_group, trans_group = attack.perturb(
                        x_batch_core, y_batch[0:num_grouped_ids], sess)

                    #construct new batches including rotated examples
                    x_batch_nat = np.concatenate((x_batch_nat, x_batch_group),
                                                 axis=0)
                    y_batch_nat = np.concatenate((y_batch_nat, y_batch),
                                                 axis=0)
                    noop_trans = np.concatenate((noop_trans, trans_group),
                                                axis=0)
                    id_batch = np.concatenate((id_batch, ids), axis=0)

                end = timer()
                training_time += end - start
                adv_time += end - start

            else:

                if adversarial_training:
                    start = timer()
                    x_batch_nat, noop_trans = attack.perturb(
                        x_batch, y_batch, sess)
                    end = timer()
                    adv_time += end - start

                else:
                    x_batch_nat, noop_trans = x_batch, noop_trans

            nat_dict = {
                model.x_input: x_batch_nat,
                model.y_input: y_batch_nat,
                model.group: id_batch,
                model.transform: noop_trans,
                model.is_training: False
            }

            ################# Outputting/saving weights and evaluations ###############

            nat_acc = -1.0
            acc_grid = -1.0
            avg_xent_grid = -1.0
            saved_weights = 0

            # Compute training accuracy on this minibatch
            train_nat_acc = sess.run(model.accuracy, feed_dict=nat_dict)
            # Output to stdout
            if epoch_done:
                epoch_time = timer() - start_epoch
                # Average
                av_acc = acc_sum / it_count

                # ToDo: Log this to file as well

                # Training accuracy over epoch
                print('Epoch {}:    ({})'.format(epoch_count, datetime.now()))
                print('    training natural accuracy {:.4}%'.format(av_acc *
                                                                    100))
                print('    {:.4} seconds per epoch'.format(epoch_time))

                # Accuracy on entire test set
                test_nat_acc = sess.run(model.accuracy,
                                        feed_dict=cifar_eval_dict)

                print('    test set natural accuracy {:.4}%'.format(
                    test_nat_acc * 100))
                # print('    {:.4} seconds for test evaluation'.format(test_time))
                print("example TIME")
                print(adv_time)
                print("train TIME")
                print(train_time)

                ########### Things to do every xxx epochs #############
                # Check if worstof1 eval should be run
                if it_summary == summary_gap - 1 or epoch_count == max_num_epochs - 1:
                    summary = sess.run(nat_summaries, feed_dict=nat_dict)
                    summary_writer.add_summary(summary, global_step.eval(sess))
                    it_summary = 0
                else:
                    it_summary += 1

                if it_easyeval == easyeval_gap - 1 or epoch_count == max_num_epochs - 1:
                    # Evaluation on adv and natural
                    [acc_nat, acc_adv, avg_xent_nat,
                     avg_xent_adv] = evaluate(model, attack_eval_random, sess,
                                              config, "random", data_path,
                                              None)
                    # Save in checkpoint
                    chkpt_id = this_repo.create_training_checkpoint(
                        exp_id,
                        training_step=ii,
                        epoch=epoch_count,
                        train_acc_nat=nat_acc,
                        test_acc_adv=acc_adv,
                        test_acc_nat=acc_nat,
                        test_loss_adv=avg_xent_adv,
                        test_loss_nat=avg_xent_nat)

                    it_easyeval = 0
                else:
                    it_easyeval += 1

                startt = timer()
                if it_ckpt == checkpoint_gap - 1 or epoch_count == max_num_epochs - 1:
                    # Create checkpoint id if non-existent
                    if not chkpt_id:
                        chkpt_id = this_repo.create_training_checkpoint(
                            exp_id,
                            training_step=ii,
                            epoch=epoch_count,
                            train_acc_nat=train_nat_acc,
                            test_acc_nat=test_nat_acc)

                    # Save checkpoint data (weights)
                    saver.save(
                        sess,
                        os.path.join(model_dir,
                                     '{}_checkpoint'.format(chkpt_id)))
                    print(' chkpt saving took {:.4}s '.format(timer() -
                                                              startt))
                    it_ckpt = 0
                else:
                    it_ckpt += 1

                # Set loss sum, it count back to zero
                acc_sum = train_nat_acc
                epoch_done = 0
                epoch_count += 1
                start_epoch = timer()
                it_count = 1

            else:
                it_count += 1
                acc_sum += train_nat_acc

            # Actual training step
            start = timer()
            nat_dict[model.is_training] = True
            sess.run(train_step, feed_dict=nat_dict)
            training_time += timer() - start
            train_time += timer() - start

        runtime = time.time() - start_time

        # Do all evaluations in the last step - on grid
        [_, acc_grid, _,
         avg_xent_grid] = evaluate(model, attack_eval_grid, sess, config,
                                   "grid", data_path, eval_summary_writer)

        this_repo.mark_experiment_as_completed(exp_id,
                                               train_acc_nat=nat_acc,
                                               test_acc_adv=acc_adv,
                                               test_acc_nat=acc_nat,
                                               test_acc_grid=acc_grid,
                                               runtime=runtime)

    return 0
Ejemplo n.º 18
0
def train(tf_seed, np_seed, train_steps, finetune_train_steps, out_steps,
          summary_steps, checkpoint_steps, step_size_schedule, weight_decay,
          momentum, train_batch_size, epsilon, replay_m, model_dir,
          source_model_dir, dataset, beta, gamma, disc_update_steps,
          adv_update_steps_per_iter, disc_layers, disc_base_channels,
          steps_before_adv_opt, adv_encoder_type, enc_output_activation,
          sep_opt_version, grad_image_ratio, final_grad_image_ratio,
          num_grad_image_ratios, normalize_zero_mean, eval_adv_attack,
          same_optimizer, only_fully_connected, finetuned_source_model_dir,
          train_finetune_source_model, finetune_img_random_pert,
          img_random_pert, only_finetune, finetune_whole_model, model_suffix,
          **kwargs):
    tf.set_random_seed(tf_seed)
    np.random.seed(np_seed)

    model_dir = model_dir + 'IGAM-%s_b%d_beta_%.3f_gamma_%.3f_disc_update_steps%d_l%dbc%d' % (
        dataset, train_batch_size, beta, gamma, disc_update_steps, disc_layers,
        disc_base_channels)  # TODO Replace with not defaults

    if img_random_pert:
        model_dir = model_dir + '_imgpert'

    if steps_before_adv_opt != 0:
        model_dir = model_dir + '_advdelay%d' % (steps_before_adv_opt)

    if train_steps != 80000:
        model_dir = model_dir + '_%dsteps' % (train_steps)
    if same_optimizer == False:
        model_dir = model_dir + '_adamDopt'

    if tf_seed != 451760341:
        model_dir = model_dir + '_tf_seed%d' % (tf_seed)
    if np_seed != 216105420:
        model_dir = model_dir + '_np_seed%d' % (np_seed)
    model_dir = model_dir + model_suffix

    # Setting up the data and the model
    data_path = get_path_dir(dataset=dataset, **kwargs)
    if dataset == 'cifar10':
        raw_data = cifar10_input.CIFAR10Data(data_path)
    else:
        raw_data = cifar100_input.CIFAR100Data(data_path)

    global_step = tf.train.get_or_create_global_step()
    increment_global_step_op = tf.assign(global_step, global_step + 1)
    reset_global_step_op = tf.assign(global_step, 0)
    source_model = ModelExtendedLogits(mode='train',
                                       target_task_class_num=100,
                                       train_batch_size=train_batch_size)
    model = Model(mode='train',
                  dataset=dataset,
                  train_batch_size=train_batch_size,
                  normalize_zero_mean=normalize_zero_mean)

    # Setting up the optimizers
    boundaries = [int(sss[0]) for sss in step_size_schedule][1:]
    values = [sss[1] for sss in step_size_schedule]
    learning_rate = tf.train.piecewise_constant(tf.cast(global_step, tf.int32),
                                                boundaries, values)
    c_optimizer = tf.train.MomentumOptimizer(learning_rate, momentum)
    finetune_optimizer = tf.train.AdamOptimizer(learning_rate=0.001)

    if same_optimizer:
        d_optimizer = tf.train.MomentumOptimizer(learning_rate, momentum)
    else:
        print("Using ADAM opt for DISC model")
        d_optimizer = tf.train.AdamOptimizer(learning_rate=0.001)

    # Compute input gradient (saliency map)
    input_grad = tf.gradients(model.target_softmax,
                              model.x_input,
                              name="gradients_ig")[0]
    source_model_input_grad = tf.gradients(source_model.target_softmax,
                                           source_model.x_input,
                                           name="gradients_ig_source_model")[0]

    # lp norm diff between input_grad & source_model_input_grad
    input_grad_l2_norm_diff = tf.reduce_mean(
        tf.reduce_sum(tf.pow(tf.subtract(input_grad, source_model_input_grad),
                             2.0),
                      keepdims=True))

    # Setting up the discriminator model
    labels_input_grad = tf.zeros(tf.shape(input_grad)[0], dtype=tf.int64)
    labels_source_model_input_grad = tf.ones(tf.shape(input_grad)[0],
                                             dtype=tf.int64)
    disc_model = IgamConvDiscriminatorModel(
        mode='train',
        dataset=dataset,
        train_batch_size=train_batch_size,
        num_conv_layers=disc_layers,
        base_num_channels=disc_base_channels,
        normalize_zero_mean=normalize_zero_mean,
        x_modelgrad_input_tensor=input_grad,
        y_modelgrad_input_tensor=labels_input_grad,
        x_source_modelgrad_input_tensor=source_model_input_grad,
        y_source_modelgrad_input_tensor=labels_source_model_input_grad,
        only_fully_connected=only_fully_connected)

    t_vars = tf.trainable_variables()
    C_vars = [var for var in t_vars if 'classifier' in var.name]
    D_vars = [var for var in t_vars if 'discriminator' in var.name]
    source_model_vars = [
        var for var in t_vars
        if ('discriminator' not in var.name and 'classifier' not in var.name
            and 'target_task_logit' not in var.name)
    ]
    source_model_target_logit_vars = [
        var for var in t_vars if 'target_task_logit' in var.name
    ]

    source_model_saver = tf.train.Saver(var_list=source_model_vars)
    finetuned_source_model_vars = source_model_vars + source_model_target_logit_vars
    finetuned_source_model_saver = tf.train.Saver(
        var_list=finetuned_source_model_vars)

    # Source model finetune optimization
    source_model_finetune_loss = source_model.target_task_mean_xent + weight_decay * source_model.weight_decay_loss
    total_loss = model.mean_xent + weight_decay * model.weight_decay_loss - beta * disc_model.mean_xent + gamma * input_grad_l2_norm_diff

    classification_c_loss = model.mean_xent + weight_decay * model.weight_decay_loss
    adv_c_loss = -beta * disc_model.mean_xent

    # Discriminator: Optimizating computation
    # discriminator loss
    total_d_loss = disc_model.mean_xent + weight_decay * disc_model.weight_decay_loss

    # Finetune source_model
    if finetune_whole_model:
        finetune_min_step = finetune_optimizer.minimize(
            source_model_finetune_loss, var_list=finetuned_source_model_vars)
    else:
        finetune_min_step = finetune_optimizer.minimize(
            source_model_finetune_loss,
            var_list=source_model_target_logit_vars)
    # Train classifier
    # classifier opt step
    final_grads = c_optimizer.compute_gradients(total_loss, var_list=C_vars)
    no_pert_grad = [(tf.zeros_like(v), v) if 'perturbation' in v.name else
                    (g, v) for g, v in final_grads]
    c_min_step = c_optimizer.apply_gradients(no_pert_grad)
    # c_min_step = c_optimizer.minimize(total_loss, var_list=C_vars)

    classification_final_grads = c_optimizer.compute_gradients(
        classification_c_loss, var_list=C_vars)
    classification_no_pert_grad = [(tf.zeros_like(v),
                                    v) if 'perturbation' in v.name else (g, v)
                                   for g, v in classification_final_grads]
    c_classification_min_step = c_optimizer.apply_gradients(
        classification_no_pert_grad)

    # discriminator opt step
    d_min_step = d_optimizer.minimize(total_d_loss, var_list=D_vars)

    # Loss gradients to the model params
    logit_weights = tf.get_default_graph().get_tensor_by_name(
        'classifier/logit/DW:0')
    last_conv_weights = tf.get_default_graph().get_tensor_by_name(
        'classifier/unit_3_4/sub2/conv2/DW:0')
    first_conv_weights = tf.get_default_graph().get_tensor_by_name(
        'classifier/input/init_conv/DW:0')

    model_xent_logit_grad_norm = tf.norm(tf.gradients(model.mean_xent,
                                                      logit_weights)[0],
                                         ord='euclidean')
    disc_xent_logit_grad_norm = tf.norm(tf.gradients(disc_model.mean_xent,
                                                     logit_weights)[0],
                                        ord='euclidean')
    input_grad_l2_norm_diff_logit_grad_norm = tf.norm(tf.gradients(
        input_grad_l2_norm_diff, logit_weights)[0],
                                                      ord='euclidean')

    model_xent_last_conv_grad_norm = tf.norm(tf.gradients(
        model.mean_xent, last_conv_weights)[0],
                                             ord='euclidean')
    disc_xent_last_conv_grad_norm = tf.norm(tf.gradients(
        disc_model.mean_xent, last_conv_weights)[0],
                                            ord='euclidean')
    input_grad_l2_norm_diff_last_conv_grad_norm = tf.norm(tf.gradients(
        input_grad_l2_norm_diff, last_conv_weights)[0],
                                                          ord='euclidean')
    model_xent_first_conv_grad_norm = tf.norm(tf.gradients(
        model.mean_xent, first_conv_weights)[0],
                                              ord='euclidean')
    disc_xent_first_conv_grad_norm = tf.norm(tf.gradients(
        disc_model.mean_xent, first_conv_weights)[0],
                                             ord='euclidean')
    input_grad_l2_norm_diff_first_conv_grad_norm = tf.norm(tf.gradients(
        input_grad_l2_norm_diff, first_conv_weights)[0],
                                                           ord='euclidean')

    # Setting up the Tensorboard and checkpoint outputs
    if not os.path.exists(model_dir):
        os.makedirs(model_dir)

    saver = tf.train.Saver(max_to_keep=1)
    tf.summary.scalar('C accuracy', model.accuracy)
    tf.summary.scalar('D accuracy', disc_model.accuracy)
    tf.summary.scalar('C xent', model.xent / train_batch_size)
    tf.summary.scalar('D xent', disc_model.xent / train_batch_size)
    tf.summary.scalar('total C loss', total_loss / train_batch_size)
    tf.summary.scalar('total D loss', total_d_loss / train_batch_size)
    tf.summary.scalar('adv C loss', adv_c_loss / train_batch_size)
    tf.summary.scalar('C cls xent loss', model.mean_xent)
    tf.summary.scalar('D xent loss', disc_model.mean_xent)
    # Loss gradients
    tf.summary.scalar('model_xent_logit_grad_norm', model_xent_logit_grad_norm)
    tf.summary.scalar('disc_xent_logit_grad_norm', disc_xent_logit_grad_norm)
    tf.summary.scalar('input_grad_l2_norm_diff_logit_grad_norm',
                      input_grad_l2_norm_diff_logit_grad_norm)
    tf.summary.scalar('model_xent_last_conv_grad_norm',
                      model_xent_last_conv_grad_norm)
    tf.summary.scalar('disc_xent_last_conv_grad_norm',
                      disc_xent_last_conv_grad_norm)
    tf.summary.scalar('input_grad_l2_norm_diff_last_conv_grad_norm',
                      input_grad_l2_norm_diff_last_conv_grad_norm)
    tf.summary.scalar('model_xent_first_conv_grad_norm',
                      model_xent_first_conv_grad_norm)
    tf.summary.scalar('disc_xent_first_conv_grad_norm',
                      disc_xent_first_conv_grad_norm)
    tf.summary.scalar('input_grad_l2_norm_diff_first_conv_grad_norm',
                      input_grad_l2_norm_diff_first_conv_grad_norm)
    merged_summaries = tf.summary.merge_all()

    with tf.Session() as sess:
        print(
            'important params >>> \n model dir: %s \n dataset: %s \n training batch size: %d \n'
            % (model_dir, dataset, train_batch_size))
        # initialize data augmentation
        if dataset == 'cifar10':
            data = cifar10_input.AugmentedCIFAR10Data(raw_data, sess, model)
        else:
            data = cifar100_input.AugmentedCIFAR100Data(raw_data, sess, model)

        # Initialize the summary writer, global variables, and our time counter.
        summary_writer = tf.summary.FileWriter(model_dir + '/train',
                                               sess.graph)
        eval_summary_writer = tf.summary.FileWriter(model_dir + '/eval')
        sess.run(tf.global_variables_initializer())

        # Restore source model
        source_model_file = tf.train.latest_checkpoint(source_model_dir)
        source_model_saver.restore(sess, source_model_file)

        # Finetune source model here
        if train_finetune_source_model:
            time_before_finetuning = datetime.now()
            for ii in tqdm(range(finetune_train_steps)):
                x_batch, y_batch = data.train_data.get_next_batch(
                    train_batch_size, multiple_passes=True)
                if finetune_img_random_pert:
                    x_batch = x_batch + np.random.uniform(
                        -epsilon, epsilon, x_batch.shape)
                    x_batch = np.clip(x_batch, 0,
                                      255)  # ensure valid pixel range

                nat_dict = {
                    source_model.x_input: x_batch,
                    source_model.y_input: y_batch
                }

                # Output to stdout
                if ii % summary_steps == 0:
                    train_finetune_acc, train_finetune_loss = sess.run(
                        [
                            source_model.target_task_accuracy,
                            source_model_finetune_loss
                        ],
                        feed_dict=nat_dict)

                    x_eval_batch, y_eval_batch = data.eval_data.get_next_batch(
                        train_batch_size, multiple_passes=True)
                    if img_random_pert:
                        x_eval_batch = x_eval_batch + np.random.uniform(
                            -epsilon, epsilon, x_eval_batch.shape)
                        x_eval_batch = np.clip(x_eval_batch, 0,
                                               255)  # ensure valid pixel range

                    eval_dict = {
                        source_model.x_input: x_eval_batch,
                        source_model.y_input: y_eval_batch
                    }
                    val_finetune_acc, val_finetune_loss = sess.run(
                        [
                            source_model.target_task_accuracy,
                            source_model_finetune_loss
                        ],
                        feed_dict=eval_dict)
                    print('Source Model Finetune Step {}:    ({})'.format(
                        ii, datetime.now()))
                    print(
                        '    training nat accuracy {:.4}% -- validation nat accuracy {:.4}%'
                        .format(train_finetune_acc * 100,
                                val_finetune_acc * 100))
                    print('    training nat c loss: {}'.format(
                        train_finetune_loss))
                    print('    validation nat c loss: {}'.format(
                        val_finetune_loss))

                    sys.stdout.flush()

                sess.run(finetune_min_step, feed_dict=nat_dict)
                sess.run(increment_global_step_op)

            time_after_finetuning = datetime.now()
            finetuning_time = time_after_finetuning - time_before_finetuning

            finetuning_time_file_path = os.path.join(model_dir,
                                                     'finetuning_time.txt')
            with open(finetuning_time_file_path, "w") as f:
                f.write("Total finetuning time: {}".format(
                    str(finetuning_time)))
            print("Total finetuning time: {}".format(str(finetuning_time)))

            finetuned_source_model_saver.save(sess,
                                              os.path.join(
                                                  finetuned_source_model_dir,
                                                  'checkpoint'),
                                              global_step=global_step)
            if only_finetune:
                return
        else:
            finetuned_source_model_file = tf.train.latest_checkpoint(
                finetuned_source_model_dir)
            finetuned_source_model_saver.restore(sess,
                                                 finetuned_source_model_file)

        # reset global step to 0 before running main training loop
        sess.run(reset_global_step_op)

        time_before_training = datetime.now()
        # Main training loop
        for ii in tqdm(range(train_steps)):
            x_batch, y_batch = data.train_data.get_next_batch(
                train_batch_size, multiple_passes=True)
            if img_random_pert:
                x_batch = x_batch + np.random.uniform(-epsilon, epsilon,
                                                      x_batch.shape)
                x_batch = np.clip(x_batch, 0, 255)  # ensure valid pixel range

            labels_source_modelgrad_disc = np.ones_like(y_batch,
                                                        dtype=np.int64)
            # Sample randinit input grads
            nat_dict = {
                model.x_input: x_batch,
                model.y_input: y_batch,
                source_model.x_input: x_batch,
                source_model.y_input: y_batch
            }

            # Output to stdout
            if ii % summary_steps == 0:
                train_acc, train_disc_acc, train_c_loss, train_d_loss, train_adv_c_loss, summary = sess.run(
                    [
                        model.accuracy, disc_model.accuracy, total_loss,
                        total_d_loss, adv_c_loss, merged_summaries
                    ],
                    feed_dict=nat_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))

                x_eval_batch, y_eval_batch = data.eval_data.get_next_batch(
                    train_batch_size, multiple_passes=True)
                if img_random_pert:
                    x_eval_batch = x_eval_batch + np.random.uniform(
                        -epsilon, epsilon, x_eval_batch.shape)
                    x_eval_batch = np.clip(x_eval_batch, 0,
                                           255)  # ensure valid pixel range

                labels_source_modelgrad_disc = np.ones_like(y_eval_batch,
                                                            dtype=np.int64)
                eval_dict = {
                    model.x_input: x_eval_batch,
                    model.y_input: y_eval_batch,
                    source_model.x_input: x_eval_batch,
                    source_model.y_input: y_eval_batch
                }
                val_acc, val_disc_acc, val_c_loss, val_d_loss, val_adv_c_loss, summary = sess.run(
                    [
                        model.accuracy, disc_model.accuracy, total_loss,
                        total_d_loss, adv_c_loss, merged_summaries
                    ],
                    feed_dict=eval_dict)
                eval_summary_writer.add_summary(summary,
                                                global_step.eval(sess))
                print('Step {}:    ({})'.format(ii, datetime.now()))
                print(
                    '    training nat accuracy {:.4}% -- validation nat accuracy {:.4}%'
                    .format(train_acc * 100, val_acc * 100))
                print(
                    '    training nat disc accuracy {:.4}% -- validation nat disc accuracy {:.4}%'
                    .format(train_disc_acc * 100, val_disc_acc * 100))
                print(
                    '    training nat c loss: {},     d loss: {},     adv c loss: {}'
                    .format(train_c_loss, train_d_loss, train_adv_c_loss))
                print(
                    '    validation nat c loss: {},     d loss: {},     adv c loss: {}'
                    .format(val_c_loss, val_d_loss, val_adv_c_loss))

                sys.stdout.flush()
            # Tensorboard summaries
            elif ii % out_steps == 0:
                nat_acc, nat_disc_acc, nat_c_loss, nat_d_loss, nat_adv_c_loss = sess.run(
                    [
                        model.accuracy, disc_model.accuracy, total_loss,
                        total_d_loss, adv_c_loss
                    ],
                    feed_dict=nat_dict)
                print('Step {}:    ({})'.format(ii, datetime.now()))
                print('    training nat accuracy {:.4}%'.format(nat_acc * 100))
                print('    training nat disc accuracy {:.4}%'.format(
                    nat_disc_acc * 100))
                print(
                    '    training nat c loss: {},     d loss: {},      adv c loss: {}'
                    .format(nat_c_loss, nat_d_loss, nat_adv_c_loss))

            # Write a checkpoint
            if (ii + 1) % checkpoint_steps == 0:
                saver.save(sess,
                           os.path.join(model_dir, 'checkpoint'),
                           global_step=global_step)

            # default mode
            if sep_opt_version == 1:
                if ii >= steps_before_adv_opt:
                    # Actual training step for Classifier
                    sess.run(c_min_step, feed_dict=nat_dict)
                    sess.run(increment_global_step_op)

                    if ii % disc_update_steps == 0:
                        # Actual training step for Discriminator
                        sess.run(d_min_step, feed_dict=nat_dict)
                else:
                    # only train on classification loss
                    sess.run(c_classification_min_step, feed_dict=nat_dict)
                    sess.run(increment_global_step_op)

            elif sep_opt_version == 2:
                # Actual training step for Classifier
                if ii >= steps_before_adv_opt:
                    if adv_update_steps_per_iter > 1:
                        sess.run(c_classification_min_step, feed_dict=nat_dict)
                        sess.run(increment_global_step_op)
                        for i in range(adv_update_steps_per_iter):
                            x_batch, y_batch = data.train_data.get_next_batch(
                                train_batch_size, multiple_passes=True)
                            if img_random_pert:
                                x_batch = x_batch + np.random.uniform(
                                    -epsilon, epsilon, x_batch.shape)
                                x_batch = np.clip(
                                    x_batch, 0,
                                    255)  # ensure valid pixel range

                            nat_dict = {
                                model.x_input: x_batch,
                                model.y_input: y_batch,
                                source_model.x_input: x_batch,
                                source_model.y_input: y_batch
                            }

                            sess.run(c_adv_min_step, feed_dict=nat_dict)
                    else:
                        sess.run(c_min_step, feed_dict=nat_dict)
                        sess.run(increment_global_step_op)

                    if ii % disc_update_steps == 0:
                        # Actual training step for Discriminator
                        sess.run(d_min_step, feed_dict=nat_dict)
                else:
                    # only train on classification loss
                    sess.run(c_classification_min_step, feed_dict=nat_dict)
                    sess.run(increment_global_step_op)
            elif sep_opt_version == 0:
                if ii >= steps_before_adv_opt:
                    if ii % disc_update_steps == 0:
                        sess.run([c_min_step, d_min_step], feed_dict=nat_dict)
                        sess.run(increment_global_step_op)
                    else:
                        sess.run(c_min_step, feed_dict=nat_dict)
                        sess.run(increment_global_step_op)
                else:
                    sess.run(c_classification_min_step, feed_dict=nat_dict)
                    sess.run(increment_global_step_op)

        time_after_training = datetime.now()
        training_time = time_after_training - time_before_training

        training_time_file_path = os.path.join(model_dir, 'training_time.txt')
        with open(training_time_file_path, "w") as f:
            f.write("Total Training time: {}".format(str(training_time)))
        print("Total Training time: {}".format(str(training_time)))

        # full test evaluation
        if dataset == 'cifar10':
            raw_data = cifar10_input.CIFAR10Data(data_path)
        else:
            raw_data = cifar100_input.CIFAR100Data(data_path)
        data_size = raw_data.eval_data.n
        if data_size % train_batch_size == 0:
            eval_steps = data_size // train_batch_size
        else:
            eval_steps = data_size // train_batch_size
            # eval_steps = data_size // train_batch_size + 1
        total_num_correct = 0
        for ii in tqdm(range(eval_steps)):
            x_eval_batch, y_eval_batch = raw_data.eval_data.get_next_batch(
                train_batch_size, multiple_passes=False)
            eval_dict = {
                model.x_input: x_eval_batch,
                model.y_input: y_eval_batch
            }
            num_correct = sess.run(model.num_correct, feed_dict=eval_dict)
            total_num_correct += num_correct
        eval_acc = total_num_correct / data_size

        clean_eval_file_path = os.path.join(model_dir,
                                            'full_clean_eval_acc.txt')
        with open(clean_eval_file_path, "a+") as f:
            f.write("Full clean eval_acc: {}%".format(eval_acc * 100))
        print("Full clean eval_acc: {}%".format(eval_acc * 100))

        devices = sess.list_devices()
        for d in devices:
            print("sess' device names:")
            print(d.name)

    return model_dir
Ejemplo n.º 19
0
if __name__ == '__main__':
    with open('config.json') as config_file:
        config = json.load(config_file)
    if config['data_path'] == "cifar100_data":
        mode = 'cifar_100'
    elif config['data_path'] == "cifar10_data":
        mode = 'cifar_10'
    else:
        print("mode should be either cifar_10 ro cifar_100")
        exit(1)
    if mode == 'cifar_10':
        import cifar10_input
    elif mode == 'cifar_100':
        import cifar100_input
    if mode == 'cifar_10':
        cifar = cifar10_input.CIFAR10Data(config['data_path'])
    elif mode == 'cifar_100':
        cifar = cifar100_input.CIFAR100Data(config['data_path'])
    if mode == 'cifar_10':
        model = Model(mode='eval', class_count=10)
    elif mode == 'cifar_100':
        model = Model(mode='eval', class_count=100)
    attack = LinfPGDAttack(model, config['epsilon'], config['num_steps'],
                           config['step_size'], config['random_start'],
                           config['loss_func'])
    saver = tf.train.Saver()
    with tf.Session() as sess:
        saver.restore(
            sess, tf.train.latest_checkpoint(config['pretrained_model_dir']))
        # print('Results of Eval Data:')
        # my_eval(config=config, cifar=cifar, model=model, attack=attack, sess=sess, source='eval_data')
Ejemplo n.º 20
0
def evaluate(model, attack, sess, config, summary_writer=None):
    num_eval_examples = config.eval.num_eval_examples
    eval_batch_size = config.eval.batch_size
    data_path = config.data.data_path

    model_dir = config.model.output_dir
    # Setting up the Tensorboard and checkpoint outputs
    if not os.path.exists(model_dir):
        os.makedirs(model_dir)

    cifar = cifar10_input.CIFAR10Data(data_path)
    global_step = tf.contrib.framework.get_or_create_global_step()
    # Iterate over the samples batch-by-batch
    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    total_xent_nat = 0.
    total_xent_adv = 0.
    total_corr_nat = 0
    total_corr_adv = 0

    for ibatch in trange(num_batches):
        bstart = ibatch * eval_batch_size
        bend = min(bstart + eval_batch_size, num_eval_examples)

        x_batch = cifar.eval_data.xs[bstart:bend, :]
        y_batch = cifar.eval_data.ys[bstart:bend]

        noop_trans = np.zeros([len(x_batch), 3])
        if config.eval.adversarial_eval:
            x_batch_adv, adv_trans = attack.perturb(x_batch, y_batch, sess)
        else:
            x_batch_adv, adv_trans = x_batch, noop_trans

        dict_nat = {
            model.x_input: x_batch,
            model.y_input: y_batch,
            model.transform: noop_trans,
            model.is_training: False
        }

        dict_adv = {
            model.x_input: x_batch_adv,
            model.y_input: y_batch,
            model.transform: adv_trans,
            model.is_training: False
        }

        cur_corr_nat, cur_xent_nat = sess.run([model.num_correct, model.xent],
                                              feed_dict=dict_nat)
        cur_corr_adv, cur_xent_adv = sess.run([model.num_correct, model.xent],
                                              feed_dict=dict_adv)

        total_xent_nat += cur_xent_nat
        total_xent_adv += cur_xent_adv
        total_corr_nat += cur_corr_nat
        total_corr_adv += cur_corr_adv

    avg_xent_nat = total_xent_nat / num_eval_examples
    avg_xent_adv = total_xent_adv / num_eval_examples
    acc_nat = total_corr_nat / num_eval_examples
    acc_adv = total_corr_adv / num_eval_examples

    if summary_writer:
        summary = tf.Summary(value=[
            tf.Summary.Value(tag='xent_adv_eval', simple_value=avg_xent_adv),
            tf.Summary.Value(tag='xent_nat_eval', simple_value=avg_xent_nat),
            tf.Summary.Value(tag='xent_adv', simple_value=avg_xent_adv),
            tf.Summary.Value(tag='xent_nat', simple_value=avg_xent_nat),
            tf.Summary.Value(tag='accuracy_adv_eval', simple_value=acc_adv),
            tf.Summary.Value(tag='accuracy_nat_eval', simple_value=acc_nat),
            tf.Summary.Value(tag='accuracy_adv', simple_value=acc_adv),
            tf.Summary.Value(tag='accuracy_nat', simple_value=acc_nat)
        ])
        summary_writer.add_summary(summary, global_step.eval(sess))

    step = global_step.eval(sess)
    print('Eval at step: {}'.format(step))
    print('  natural: {:.2f}%'.format(100 * acc_nat))
    print('  adversarial: {:.2f}%'.format(100 * acc_adv))
    print('  avg nat xent: {:.4f}'.format(avg_xent_nat))
    print('  avg adv xent: {:.4f}'.format(avg_xent_adv))

    result = {
        'nat': '{:.2f}%'.format(100 * acc_nat),
        'adv': '{:.2f}%'.format(100 * acc_adv)
    }
    with open('job_result.json', 'w') as result_file:
        json.dump(result, result_file, sort_keys=True, indent=4)
Ejemplo n.º 21
0
def main(argv):

    model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)

    if model_file is None:
        print("No model found")
        sys.exit()

    cifar = cifar10_input.CIFAR10Data(FLAGS.dataset_dir)

    nb_classes = 10
    X_test = cifar.eval_data.xs
    Y_test = to_categorical(cifar.eval_data.ys, nb_classes)
    assert Y_test.shape[1] == 10.0

    set_log_level(logging.DEBUG)

    with tf.Session() as sess:

        x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3))
        y = tf.placeholder(tf.float32, shape=(None, 10))

        from cleverhans.model_zoo.madry_lab_challenges.cifar10_model import make_wresnet

        model = make_wresnet()

        saver = tf.train.Saver()

        # Restore the checkpoint
        saver.restore(sess, model_file)

        nb_samples = FLAGS.nb_samples

        attack_params = {
            "batch_size": FLAGS.batch_size,
            "clip_min": 0.0,
            "clip_max": 255.0,
        }

        if FLAGS.attack_type == "cwl2":
            from cleverhans.attacks import CarliniWagnerL2

            attacker = CarliniWagnerL2(model, sess=sess)
            attack_params.update(
                {
                    "binary_search_steps": 1,
                    "max_iterations": 100,
                    "learning_rate": 0.1,
                    "initial_const": 10,
                    "batch_size": 10,
                }
            )

        else:  # eps and eps_iter in range 0-255
            attack_params.update({"eps": 8, "ord": np.inf})
            if FLAGS.attack_type == "fgsm":
                from cleverhans.attacks import FastGradientMethod

                attacker = FastGradientMethod(model, sess=sess)

            elif FLAGS.attack_type == "pgd":
                attack_params.update({"eps_iter": 2, "nb_iter": 20})
                from cleverhans.attacks import MadryEtAl

                attacker = MadryEtAl(model, sess=sess)

        eval_par = {"batch_size": FLAGS.batch_size}

        if FLAGS.sweep:
            max_eps = 16
            epsilons = np.linspace(1, max_eps, max_eps)
            for e in epsilons:
                t1 = time.time()
                attack_params.update({"eps": e})
                x_adv = attacker.generate(x, **attack_params)
                preds_adv = model.get_probs(x_adv)
                acc = model_eval(
                    sess,
                    x,
                    y,
                    preds_adv,
                    X_test[:nb_samples],
                    Y_test[:nb_samples],
                    args=eval_par,
                )
                print(
                    "Epsilon %.2f, accuracy on adversarial" % e,
                    "examples %0.4f\n" % acc,
                )
            t2 = time.time()
        else:
            t1 = time.time()
            x_adv = attacker.generate(x, **attack_params)
            preds_adv = model.get_probs(x_adv)
            acc = model_eval(
                sess,
                x,
                y,
                preds_adv,
                X_test[:nb_samples],
                Y_test[:nb_samples],
                args=eval_par,
            )
            t2 = time.time()
            print("Test accuracy on adversarial examples %0.4f\n" % acc)
        print("Took", t2 - t1, "seconds")
Ejemplo n.º 22
0
        print("after binary search: lbd_ih:", lbd_hi, "***")
        #        tmp_lb = self.model.predict(x0+ np.array(lbd_hi*theta),y0)
        print("label after fine binary search:",
              self.model.predict(x0 + np.array(lbd_hi * theta), y0))
        print("again, label after fine binary search:",
              self.model.predict(x0 + np.array(lbd_hi * theta), y0))
        print("norm of lbd_hi*theta 3:",
              np.linalg.norm(x0 + np.array(lbd_hi * theta)))
        print("******")
        return lbd_hi, nquery


# ============ test ====================
sess = tf.Session()

cifar = cifar10_input.CIFAR10Data(
    "/content/drive/My Drive/STAT141C/cifar10_data")
orig_model = Model("/content/drive/My Drive/STAT141C/models/standard/",
                   tiny=False,
                   mode='eval',
                   sess=sess)

model = Model(model, sess, [0.0, 255.0])

attack = blackbox(model)

#xs = tf.placeholder(tf.float32, (1, 32, 32, 3))
image = cifar.eval_data.xs[:15]
label = cifar.eval_data.ys[:15]
new_img = image / 255.0

#print("original label is :", label[1])
Ejemplo n.º 23
0
def train(tf_seed, np_seed, train_steps, out_steps, summary_steps,
          checkpoint_steps, step_size_schedule, weight_decay, momentum,
          train_batch_size, epsilon, replay_m, model_dir, dataset,
          poison_alpha, poison_config, **kwargs):
    tf.compat.v1.set_random_seed(tf_seed)
    np.random.seed(np_seed)

    print('poison alpha = %f' % poison_alpha)

    model_dir = model_dir + '%s_m%d_eps%.1f_b%d' % (
        dataset, replay_m, epsilon, train_batch_size
    )  # TODO Replace with not defaults

    # Setting up the data and the model

    poison_config_dict = utilities.config_to_namedtuple(
        utilities.get_config(poison_config))

    print(poison_config_dict)

    data_path = get_path_dir(dataset=dataset, **kwargs)
    if dataset == 'cifar10':
        raw_data = cifar10_input.CIFAR10Data(data_path)
    elif dataset == 'cifar10_poisoned':
        raw_data = dataset_input.CIFAR10Data(poison_config_dict, seed=np_seed)
    else:
        raw_data = cifar100_input.CIFAR100Data(data_path)
    global_step = tf.compat.v1.train.get_or_create_global_step()
    with tpu_strategy.scope():
        model = Model(mode='train',
                      dataset=dataset,
                      train_batch_size=train_batch_size)

    # Setting up the optimizer
    boundaries = [int(sss[0]) for sss in step_size_schedule][1:]
    values = [sss[1] for sss in step_size_schedule]
    learning_rate = tf.compat.v1.train.piecewise_constant(
        tf.cast(global_step, tf.int32), boundaries, values)
    optimizer = tf.compat.v1.train.MomentumOptimizer(learning_rate, momentum)

    # Optimizing computation
    total_loss = model.mean_xent + weight_decay * model.weight_decay_loss
    grads = optimizer.compute_gradients(total_loss)

    # Compute new image
    pert_grad = [g for g, v in grads if 'perturbation' in v.name]
    sign_pert_grad = tf.sign(pert_grad[0])
    new_pert = model.pert + epsilon * sign_pert_grad
    clip_new_pert = tf.clip_by_value(new_pert, -epsilon, epsilon)
    assigned = tf.compat.v1.assign(model.pert, clip_new_pert)

    # Train
    no_pert_grad = [(tf.zeros_like(v), v) if 'perturbation' in v.name else
                    (g, v) for g, v in grads]
    with tf.control_dependencies([assigned]):
        min_step = optimizer.apply_gradients(no_pert_grad,
                                             global_step=global_step)
    tf.compat.v1.initialize_variables([model.pert])  # TODO: Removed from TF

    # Setting up the Tensorboard and checkpoint outputs
    if not os.path.exists(model_dir):
        os.makedirs(model_dir)

    saver = tf.compat.v1.train.Saver(max_to_keep=1)
    tf.compat.v1.summary.scalar('accuracy', model.accuracy)
    tf.compat.v1.summary.scalar('xent', model.xent / train_batch_size)
    tf.compat.v1.summary.scalar('total loss', total_loss / train_batch_size)
    merged_summaries = tf.compat.v1.summary.merge_all()

    gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=1.0)
    with tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(
            gpu_options=gpu_options)) as sess:
        print(
            '\n\n********** free training for epsilon=%.1f using m_replay=%d **********\n\n'
            % (epsilon, replay_m))
        print(
            'important params >>> \n model dir: %s \n dataset: %s \n training batch size: %d \n'
            % (model_dir, dataset, train_batch_size))
        if dataset == 'cifar100':
            print(
                'the ride for CIFAR100 is bumpy -- fasten your seatbelts! \n \
          you will probably see the training and validation accuracy fluctuating a lot early in trainnig \n \
                this is natural especially for large replay_m values because we see that mini-batch so many times.'
            )
        # initialize data augmentation
        if dataset == 'cifar10':
            data = cifar10_input.AugmentedCIFAR10Data(raw_data, sess, model)
        elif dataset == 'cifar10_poisoned':
            data = raw_data
        else:
            data = cifar100_input.AugmentedCIFAR100Data(raw_data, sess, model)

        # Initialize the summary writer, global variables, and our time counter.
        summary_writer = tf.compat.v1.summary.FileWriter(
            model_dir + '/train', sess.graph)
        eval_summary_writer = tf.compat.v1.summary.FileWriter(model_dir +
                                                              '/eval')
        sess.run(tf.compat.v1.global_variables_initializer())

        # Main training loop
        for ii in range(train_steps):
            if ii % replay_m == 0:
                x_batch, y_batch = data.train_data.get_next_batch(
                    train_batch_size, multiple_passes=True)
                nat_dict = {model.x_input: x_batch, model.y_input: y_batch}

            x_eval_batch, y_eval_batch = data.eval_data.get_next_batch(
                train_batch_size, multiple_passes=True)
            eval_dict = {
                model.x_input: x_eval_batch,
                model.y_input: y_eval_batch
            }

            # Output to stdout
            if ii % summary_steps == 0:
                train_acc, summary = sess.run(
                    [model.accuracy, merged_summaries], feed_dict=nat_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))
                val_acc, summary = sess.run([model.accuracy, merged_summaries],
                                            feed_dict=eval_dict)
                eval_summary_writer.add_summary(summary,
                                                global_step.eval(sess))
                print('Step {}:    ({})'.format(ii, datetime.now()))
                print(
                    '    training nat accuracy {:.4}% -- validation nat accuracy {:.4}%'
                    .format(train_acc * 100, val_acc * 100))
                sys.stdout.flush()
            # Tensorboard summaries
            elif ii % out_steps == 0:
                nat_acc = sess.run(model.accuracy, feed_dict=nat_dict)
                print('Step {}:    ({})'.format(ii, datetime.now()))
                print('    training nat accuracy {:.4}%'.format(nat_acc * 100))

            # Write a checkpoint
            if (ii + 1) % checkpoint_steps == 0:
                saver.save(sess,
                           os.path.join(model_dir, 'checkpoint'),
                           global_step=global_step)

            # Actual training step
            sess.run(min_step, feed_dict=nat_dict)
Ejemplo n.º 24
0
def evaluate(model, attack, sess, config, attack_type, data_path,
             summary_writer=None, eval_on_train=False):
    num_eval_examples = config.eval.num_eval_examples
    eval_batch_size = config.eval.batch_size

    if config.data.dataset_name == "cifar-10":
        data_iterator = cifar10_input.CIFAR10Data(data_path)
    elif config.data.dataset_name == "cifar-100":
        data_iterator = cifar100_input.CIFAR100Data(data_path)
    elif config.data.dataset_name == "svhn":
        data_iterator = svhn_input.SVHNData(data_path)

    else:
        raise ValueError("Unknown dataset name.")

    global_step = tf.train.get_or_create_global_step()
    # Iterate over the samples batch-by-batch
    num_batches = int(math.ceil(num_eval_examples / eval_batch_size))
    total_xent_nat = 0.
    total_xent_adv = 0.
    total_corr_nat = 0
    total_corr_adv = 0

    for ibatch in trange(num_batches):
      bstart = ibatch * eval_batch_size
      bend = min(bstart + eval_batch_size, num_eval_examples)

      if eval_on_train:
        x_batch = data_iterator.train_data.xs[bstart:bend, :]
        y_batch = data_iterator.train_data.ys[bstart:bend]
      else:
        x_batch = data_iterator.eval_data.xs[bstart:bend, :]
        y_batch = data_iterator.eval_data.ys[bstart:bend]

      noop_trans = np.zeros([len(x_batch), 3])
      if config.eval.adversarial_eval:
          x_batch_adv, adv_trans = attack.perturb(x_batch, y_batch, sess)
      else:
          x_batch_adv, adv_trans = x_batch, noop_trans

      dict_nat = {model.x_input: x_batch,
                  model.y_input: y_batch,
                  model.transform: noop_trans,
                  model.is_training: False}

      dict_adv = {model.x_input: x_batch_adv,
                  model.y_input: y_batch,
                  model.transform: adv_trans,
                  model.is_training: False}

      cur_corr_nat, cur_xent_nat = sess.run([model.num_correct, model.xent],
                                            feed_dict = dict_nat)
      cur_corr_adv, cur_xent_adv = sess.run([model.num_correct, model.xent],
                                            feed_dict = dict_adv)

      total_xent_nat += cur_xent_nat
      total_xent_adv += cur_xent_adv
      total_corr_nat += cur_corr_nat
      total_corr_adv += cur_corr_adv

    avg_xent_nat = total_xent_nat / num_eval_examples
    avg_xent_adv = total_xent_adv / num_eval_examples
    acc_nat = total_corr_nat / num_eval_examples
    acc_adv = total_corr_adv / num_eval_examples

    if summary_writer:
        summary = tf.Summary(value=[
              tf.Summary.Value(tag='xent_adv_eval', simple_value= avg_xent_adv),
              tf.Summary.Value(tag='xent_nat_eval', simple_value= avg_xent_nat),
              tf.Summary.Value(tag='xent_adv', simple_value= avg_xent_adv),
              tf.Summary.Value(tag='xent_nat', simple_value= avg_xent_nat),
              tf.Summary.Value(tag='accuracy_adv_eval', simple_value= acc_adv),
              tf.Summary.Value(tag='accuracy_nat_eval', simple_value= acc_nat),
              tf.Summary.Value(tag='accuracy_adv', simple_value= acc_adv),
              tf.Summary.Value(tag='accuracy_nat', simple_value= acc_nat)])
        summary_writer.add_summary(summary, global_step.eval(sess))

    step = global_step.eval(sess)
    print('Eval at step: {}'.format(step))
    print('  Adversary: ', attack_type)
    print('  natural: {:.2f}%'.format(100 * acc_nat))
    print('  adversarial: {:.2f}%'.format(100 * acc_adv))
    print('  avg nat xent: {:.4f}'.format(avg_xent_nat))
    print('  avg adv xent: {:.4f}'.format(avg_xent_adv))

    return [100 * acc_nat, 100 * acc_adv, avg_xent_nat, avg_xent_adv]
def main(argv):

    model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)

    if model_file is None:
        print('No model found')
        sys.exit()

    cifar = cifar10_input.CIFAR10Data(FLAGS.dataset_dir)

    nb_classes = 10
    X_test = cifar.eval_data.xs
    Y_test = to_categorical(cifar.eval_data.ys, nb_classes)
    assert Y_test.shape[1] == 10.

    set_log_level(logging.DEBUG)

    with tf.Session() as sess:

        x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3))
        y = tf.placeholder(tf.float32, shape=(None, 10))

        from madry_cifar10_model import make_madry_wresnet
        model = make_madry_wresnet()

        saver = tf.train.Saver()

        # Restore the checkpoint
        saver.restore(sess, model_file)

        nb_samples = FLAGS.nb_samples

        attack_params = {'batch_size': FLAGS.batch_size,
                         'clip_min': 0., 'clip_max': 255.}

        if FLAGS.attack_type == 'cwl2':
            from cleverhans.attacks import CarliniWagnerL2
            attacker = CarliniWagnerL2(model, sess=sess)
            attack_params.update({'binary_search_steps': 1,
                                  'max_iterations': 100,
                                  'learning_rate': 0.1,
                                  'initial_const': 10,
                                  'batch_size': 10
                                  })

        else:  # eps and eps_iter in range 0-255
            attack_params.update({'eps': 8, 'ord': np.inf})
            if FLAGS.attack_type == 'fgsm':
                from cleverhans.attacks import FastGradientMethod
                attacker = FastGradientMethod(model, sess=sess)

            elif FLAGS.attack_type == 'pgd':
                attack_params.update({'eps_iter': 2, 'nb_iter': 20})
                from cleverhans.attacks import MadryEtAl
                attacker = MadryEtAl(model, sess=sess)

        eval_par = {'batch_size': FLAGS.batch_size}

        if FLAGS.sweep:
            max_eps = 16
            epsilons = np.linspace(1, max_eps, max_eps)
            for e in epsilons:
                t1 = time.time()
                attack_params.update({'eps': e})
                x_adv = attacker.generate(x, **attack_params)
                preds_adv = model.get_probs(x_adv)
                acc = model_eval(sess, x, y, preds_adv, X_test[
                    :nb_samples], Y_test[:nb_samples], args=eval_par)
                print('Epsilon %.2f, accuracy on adversarial' % e,
                      'examples %0.4f\n' % acc)
            t2 = time.time()
        else:
            t1 = time.time()
            x_adv = attacker.generate(x, **attack_params)
            preds_adv = model.get_probs(x_adv)
            acc = model_eval(sess, x, y, preds_adv, X_test[
                :nb_samples], Y_test[:nb_samples], args=eval_par)
            t2 = time.time()
            print('Test accuracy on adversarial examples %0.4f\n' % acc)
        print("Took", t2 - t1, "seconds")
Ejemplo n.º 26
0
from eval_utils import *

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'  # or any {'0', '1', '2'}
tf.logging.set_verbosity(tf.logging.ERROR)

np.random.seed(123)

classifier = Model(mode='eval', var_scope='classifier')
classifier_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
                                    scope='classifier')
classifier_saver = tf.train.Saver(var_list=classifier_vars)
classifier_checkpoint = 'models/naturally_trained_prefixed_classifier/checkpoint-70000'

factory = BaseDetectorFactory()

cifar = cifar10_input.CIFAR10Data('cifar10_data')

num_eval_examples = 10000 if len(sys.argv) <= 1 else int(sys.argv[1])
eval_data = cifar.eval_data
x_test = eval_data.xs.astype(np.float32)[:num_eval_examples]
y_test = eval_data.ys.astype(np.int32)[:num_eval_examples]

plt.figure(figsize=(3.5 * 1.5, 2 * 1.5))

with tf.Session() as sess:
    classifier_saver.restore(sess, classifier_checkpoint)
    factory.restore_base_detectors(sess)

    base_detectors = factory.get_base_detectors()
    bayes_classifier = BayesClassifier(base_detectors)
Ejemplo n.º 27
0
tf.set_random_seed(config['tf_random_seed'])
np.random.seed(config['np_random_seed'])

# Setting up training parameters
max_num_training_steps = config['max_num_training_steps']
num_output_steps = config['num_output_steps']
num_summary_steps = config['num_summary_steps']
num_checkpoint_steps = config['num_checkpoint_steps']
step_size_schedule = config['step_size_schedule']
weight_decay = config['weight_decay']
data_path = config['data_path']
momentum = config['momentum']
batch_size = config['training_batch_size']

# Setting up the data and the model
raw_cifar = cifar10_input.CIFAR10Data()
print(np.amax(raw_cifar.train_data.xs), np.amin(raw_cifar.train_data.xs))
global_step = tf.contrib.framework.get_or_create_global_step()
model = Model(mode='train')

# Setting up the optimizer
boundaries = [int(sss[0]) for sss in step_size_schedule]
boundaries = boundaries[1:]
values = [sss[1] for sss in step_size_schedule]
learning_rate = tf.train.piecewise_constant(
    tf.cast(global_step, tf.int32),
    boundaries,
    values)
total_loss = model.mean_xent + weight_decay * model.weight_decay_loss
train_step = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(
    total_loss,
Ejemplo n.º 28
0
def train(config):
    # seeding randomness
    tf.set_random_seed(config.training.tf_random_seed)
    np.random.seed(config.training.np_random_seed)

    # Setting up training parameters
    max_num_training_steps = config.training.max_num_training_steps
    step_size_schedule = config.training.step_size_schedule
    weight_decay = config.training.weight_decay
    momentum = config.training.momentum
    batch_size = config.training.batch_size
    group_size = config.training.group_size
    adversarial_training = config.training.adversarial_training
    eval_during_training = config.training.eval_during_training
    if eval_during_training:
        num_eval_steps = config.training.num_eval_steps

    # Setting up output parameters
    num_output_steps = config.training.num_output_steps
    num_summary_steps = config.training.num_summary_steps
    num_checkpoint_steps = config.training.num_checkpoint_steps

    #adapting batch size
    batch_size_group = batch_size * config.training.group_size

    # Setting up the data and the model
    data_path = config.data.data_path
    raw_cifar = cifar10_input.CIFAR10Data(data_path)
    global_step = tf.train.get_or_create_global_step()
    model = resnet.Model(config.model)

    # uncomment to get a list of trainable variables
    # model_vars = tf.trainable_variables()
    # slim.model_analyzer.analyze_vars(model_vars, print_info=True)

    # Setting up the optimizer
    boundaries = [int(sss[0]) for sss in step_size_schedule]
    boundaries = boundaries[1:]
    values = [sss[1] for sss in step_size_schedule]
    learning_rate = tf.train.piecewise_constant(tf.cast(global_step, tf.int32),
                                                boundaries, values)
    total_loss = model.mean_xent + weight_decay * model.weight_decay_loss + model.core_loss

    optimizer = tf.train.MomentumOptimizer(learning_rate, momentum)
    train_step = optimizer.minimize(total_loss, global_step=global_step)

    # Set up adversary
    attack = SpatialAttack(model, config.attack)
    attack_eval_random = SpatialAttack(model, config.eval_attack_random)
    attack_eval_grid = SpatialAttack(model, config.eval_attack_grid)

    # Setting up the Tensorboard and checkpoint outputs
    model_dir = config.model.output_dir
    if eval_during_training:
        eval_dir = os.path.join(model_dir, 'eval')
        if not os.path.exists(eval_dir):
            os.makedirs(eval_dir)

    # We add accuracy and xent twice so we can easily make three types of
    # comparisons in Tensorboard:
    # - train vs eval (for a single run)
    # - train of different runs
    # - eval of different runs

    saver = tf.train.Saver(max_to_keep=3)

    tf.summary.scalar('accuracy_adv_train',
                      model.accuracy,
                      collections=['adv'])
    tf.summary.scalar('accuracy_adv', model.accuracy, collections=['adv'])
    tf.summary.scalar('xent_adv_train',
                      model.xent / batch_size_group,
                      collections=['adv'])
    tf.summary.scalar('xent_adv',
                      model.xent / batch_size_group,
                      collections=['adv'])
    tf.summary.image('images_adv_train', model.x_image, collections=['adv'])
    adv_summaries = tf.summary.merge_all('adv')

    tf.summary.scalar('accuracy_nat_train',
                      model.accuracy,
                      collections=['nat'])
    tf.summary.scalar('accuracy_nat', model.accuracy, collections=['nat'])
    tf.summary.scalar('xent_nat_train',
                      model.xent / batch_size_group,
                      collections=['nat'])
    tf.summary.scalar('xent_nat',
                      model.xent / batch_size_group,
                      collections=['nat'])
    tf.summary.image('images_nat_train', model.x_image, collections=['nat'])
    tf.summary.scalar('learning_rate', learning_rate, collections=['nat'])
    nat_summaries = tf.summary.merge_all('nat')

    #dataAugmentation
    x_input_placeholder = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])
    flipped = tf.map_fn(lambda img: tf.image.random_flip_left_right(img),
                        x_input_placeholder)

    with tf.Session() as sess:

        # initialize data augmentation
        if config.training.data_augmentation:
            cifar = cifar10_input.AugmentedCIFAR10Data(raw_cifar, sess)
        else:
            cifar = raw_cifar

        # Initialize the summary writer, global variables, and our time counter.
        summary_writer = tf.summary.FileWriter(model_dir, sess.graph)
        if eval_during_training:
            eval_summary_writer = tf.summary.FileWriter(eval_dir)

        sess.run(tf.global_variables_initializer())
        training_time = 0.0
        training_time_total = 0.0
        adv_time = 0.0
        eval_time = 0.0
        core_time = 0.0

        # Main training loop
        for ii in range(max_num_training_steps + 1):
            x_batch, y_batch = cifar.train_data.get_next_batch(
                batch_size, multiple_passes=True)

            noop_trans = np.zeros([len(x_batch), 3])
            # Compute Adversarial Perturbations
            if adversarial_training:
                start = timer()
                x_batch_adv, adv_trans = attack.perturb(x_batch, y_batch, sess)
                end = timer()
                adv_time += end - start
            else:
                x_batch_adv, adv_trans = x_batch, noop_trans

            #Create rotatated examples
            start = timer()

            x_batch_nat = x_batch
            y_batch_nat = y_batch
            id_batch = np.arange(0, batch_size, 1, dtype="int32")
            ids = np.arange(0, batch_size, 1, dtype="int32")

            for i in range(config.training.group_size):

                if config.training.data_augmentation_core:
                    x_batch_core = sess.run(
                        flipped, feed_dict={x_input_placeholder: x_batch})
                else:
                    x_batch_core = x_batch

                x_batch_group, trans_group = attack.perturb(
                    x_batch_core, y_batch, sess)

                #construct new batches including rotateted examples
                x_batch_adv = np.concatenate((x_batch_adv, x_batch_group),
                                             axis=0)
                x_batch_nat = np.concatenate((x_batch_nat, x_batch_group),
                                             axis=0)
                y_batch_nat = np.concatenate((y_batch_nat, y_batch), axis=0)
                adv_trans = np.concatenate((adv_trans, trans_group), axis=0)
                noop_trans = np.concatenate((noop_trans, trans_group), axis=0)
                id_batch = np.concatenate((id_batch, ids), axis=0)

            end = timer()
            core_time += end - start

            nat_dict = {
                model.x_input: x_batch_nat,
                model.y_input: y_batch_nat,
                model.group: id_batch,
                model.transform: noop_trans,
                model.is_training: False
            }

            adv_dict = {
                model.x_input: x_batch_adv,
                model.y_input: y_batch_nat,
                model.group: id_batch,
                model.transform: adv_trans,
                model.is_training: False
            }

            # Output to stdout
            if ii % num_output_steps == 0:
                nat_acc = sess.run(model.accuracy, feed_dict=nat_dict)
                adv_acc = sess.run(model.accuracy, feed_dict=adv_dict)
                print('Step {}:    ({})'.format(ii, datetime.now()))
                print('    training nat accuracy {:.4}%'.format(nat_acc * 100))
                print('    training adv accuracy {:.4}%'.format(adv_acc * 100))
                if ii != 0:
                    print('    {} examples per second'.format(
                        num_output_steps * batch_size_group / training_time))
                    training_time = 0.0

            # Tensorboard summaries
            if ii % num_summary_steps == 0:
                summary = sess.run(adv_summaries, feed_dict=adv_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))
                summary = sess.run(nat_summaries, feed_dict=nat_dict)
                summary_writer.add_summary(summary, global_step.eval(sess))

            # Write a checkpoint
            if ii % num_checkpoint_steps == 0:
                saver.save(sess,
                           os.path.join(model_dir, 'checkpoint'),
                           global_step=global_step)

            if eval_during_training and ii % num_eval_steps == 0:
                start = timer()
                evaluate(model, attack_eval_random, sess, config, "random",
                         eval_summary_writer)
                evaluate(model, attack_eval_grid, sess, config, "grid",
                         eval_summary_writer)
                end = timer()
                eval_time += end - start
                print('    {}seconds total training time'.format(
                    training_time_total))
                print('    {}seconds total adv. example time'.format(adv_time))
                print(
                    '    {}seconds total core example time'.format(core_time))
                print('    {}seconds total evalutation time'.format(eval_time))

            # Actual training step
            start = timer()
            if adversarial_training:
                adv_dict[model.is_training] = True
                sess.run(train_step, feed_dict=adv_dict)
            else:
                nat_dict[model.is_training] = True
                sess.run(train_step, feed_dict=nat_dict)
            end = timer()
            training_time += end - start
            training_time_total += end - start
Ejemplo n.º 29
0
from model import Model
from pgd_attack import LinfPGDAttack
# from bpd_attack import LinfPGDAttack

# Global constants
with open('config_layer11.json') as config_file:
    config = json.load(config_file)
num_eval_examples = int(config['num_eval_examples'])
eval_batch_size = config['eval_batch_size']
eval_on_cpu = config['eval_on_cpu']
data_path = config['data_path']

model_dir = config['new_model_dir']

# Set upd the data, hyperparameters, and the model
cifar = cifar10_input.CIFAR10Data(data_path)

if eval_on_cpu:
    with tf.device("/cpu:0"):
        model = Model(mode='eval')
        attack = LinfPGDAttack(model, config['epsilon'], config['num_steps'],
                               config['step_size'], config['random_start'],
                               config['loss_func'])
else:
    model = Model(mode='eval')
    attack = LinfPGDAttack(model, config['epsilon'], config['num_steps'],
                           config['step_size'], config['random_start'],
                           config['loss_func'])

# global_step = tf.contrib.framework.get_or_create_global_step()
def get_correctly_classified_angles(model,
                                    sess,
                                    config,
                                    eval_on_train=False,
                                    num_eval_examples=200,
                                    seed=1):
    np.random.seed(seed)
    if config.data.dataset_name == "cifar-10":
        data_iterator = cifar10_input.CIFAR10Data(config.data.data_path)
    elif config.data.dataset_name == "cifar-100":
        data_iterator = cifar100_input.CIFAR100Data(config.data.data_path)
    elif config.data.dataset_name == "svhn":
        data_iterator = svhn_input.SVHNData(config.data.data_path)

    if eval_on_train:
        n = data_iterator.train_data.n
        indices = np.random.choice(n, num_eval_examples)
        x_batch = data_iterator.train_data.xs[indices, :]
        y_batch = data_iterator.train_data.ys[indices]
    else:
        n = data_iterator.eval_data.n
        indices = np.random.choice(n, num_eval_examples)
        x_batch = data_iterator.eval_data.xs[indices, :]
        y_batch = data_iterator.eval_data.ys[indices]

    trans = np.zeros([len(x_batch), 3])
    results = np.zeros([len(x_batch), 61])
    predictions = np.zeros([len(x_batch), 61])
    angles = np.arange(-30, 31)
    for i, j in enumerate(range(-30, 31)):
        trans[:, 2] = j
        dict_nat = {
            model.x_input: x_batch,
            model.y_input: y_batch,
            model.transform: trans,
            model.is_training: False
        }
        results[:, i], predictions[:, i] = sess.run(
            [model.correct_prediction, model.predictions], feed_dict=dict_nat)

    cor_class_means = np.mean(results, axis=1)
    # get images that fooled the model for all angles
    indices_all_fooled = np.where(cor_class_means == 0)[0]
    if len(indices_all_fooled) > 0:
        fooled_tuple = get_images(indices_all_fooled, config, data_iterator,
                                  model, sess, x_batch, y_batch, results,
                                  predictions, angles)
    else:
        fooled_tuple = None

    # get images that were correctly classified for all angles
    indices_all_correct = np.where(cor_class_means == 1)[0]
    if len(indices_all_correct) > 0:
        correct_tuple = get_images(indices_all_correct, config, data_iterator,
                                   model, sess, x_batch, y_batch, results,
                                   predictions, angles)
    else:
        correct_tuple = None

    # get images that were correctly classified for a large proportion of angles
    indices_some_correct = np.where(
        np.logical_and(cor_class_means >= .9, cor_class_means < 1))[0]
    if len(indices_some_correct) > 0:
        some_correct_tuple = get_images(indices_some_correct, config,
                                        data_iterator, model, sess, x_batch,
                                        y_batch, results, predictions, angles)
    else:
        some_correct_tuple = None

    return results, predictions, fooled_tuple, correct_tuple, some_correct_tuple