示例#1
0
class PGDUtil(object):
    def __init__(self, model, sess, log_file="log.txt"):
        self.pgd = ProjectedGradientDescent(model=model, sess=sess)
        self.log_file = log_file

    def create_adversaries(self, x_train, y_train, i, nb_of_adv=None):
        if nb_of_adv is None:
            nb_of_adv = len(x_train)

        adv_train_x, clean_train_x, adv_train_y, clean_train_y = divide_into_clean_and_adversarial_set(
            x_train, y_train, nb_of_adv, i)
        adv_x = self.pgd.generate_np(adv_train_x)
        return numpy.vstack((adv_x, clean_train_x)), numpy.vstack(
            (adv_train_y, clean_train_y))
class PGDGenerator:
    def __init__( self, sess, in_tensor_name, out_tensor_name, mean=None, std=None ):
        callable_model = CleverHansWrapperWrapper( sess, in_tensor_name, out_tensor_name, mean, std )
        cleverhans_model = CallableModelWrapper( callable_model, 'logits' )
        self.sess = sess
        self.attack = ProjectedGradientDescent( cleverhans_model, sess=sess )
        self.output_ten = tf.get_default_graph().get_tensor_by_name( out_tensor_name )
        self.input_ten = tf.get_default_graph().get_tensor_by_name( in_tensor_name )
        self.output_shape = [ dim.value for dim in self.output_ten.shape ]
        self.mean = mean
        self.std = std

    def generate( self, img, **kwargs ):
        if 'y_target' in kwargs:
            y_target = kwargs[ 'y_target' ]
            if not isinstance( y_target, (np.ndarray, list) ):
                y_target = [ y_target ]
            target_arr = np.zeros(self.output_shape)
            target = y_target[ np.random.randint(0, len(y_target)) ] 
            target_arr[ 0, target ] = 1
            kwargs[ 'y_target' ] = target_arr
        if 'eps_iter_size' in kwargs and not 'eps_iter' in kwargs and  'eps' in kwargs:
            kwargs['eps_iter'] = kwargs['eps'] * kwargs['eps_iter_size']
            del kwargs['eps_iter_size']
        check = True
        if 'check' in kwargs:
            check = kwargs['check']
            del kwargs['check'] 
        adv_example = self.attack.generate_np( img, **kwargs )
        if not self.std is None:
            adv_example = adv_example.reshape( -1, 1 )
            adv_example = ( adv_example - self.mean ) / self.std
            adv_example = adv_example.reshape( -1 )
        #assert ( np.all( adv_example <= kwargs['clip_max'] + 0.000001) and np.all( adv_example >= kwargs['clip_min'] - 0.000001 ) )
        real_cl = np.argmax( self.sess.run( self.output_ten, feed_dict={ self.input_ten: adv_example } ) )
        if not check:
            return adv_example

        if 'y_target' in kwargs and real_cl in y_target:
            return adv_example
        if not 'y_target' in kwargs:
            correct_cl = np.argmax( self.sess.run( self.output_ten, feed_dict={ self.input_ten: img } ) )
            if not correct_cl == real_cl:
                return adv_example

        return None
示例#3
0
    time_st=time.time()
    for st in range(0, data_size, batch_size):
        sample = np.array(X_train[st : st + batch_size].reshape(-1, 32 * 32 * 3) / 255, dtype=np.float)
        # sample = np.array([sample])
        sess = keras.backend.get_session()
        model = KerasModelWrapper(model_keras)
        attack = ProjectedGradientDescent(model, sess=sess)
        # print(model.predict(panda.reshape(1, *panda.shape)))

        param = dict(
                eps= 10 / 255,
                eps_iter= 10 / 255 / 40,
                nb_iter= 40,
                rand_init= True,
                )
        advs = attack.generate_np(sample, **param)
        # plt.imsave("sample.png", advs[0])
        adv_train.append(advs)
        preb = model_keras.predict(advs).argmax(axis=1).reshape((sample.shape[0], ))
        y_sample = model_keras.predict(sample).argmax(axis=1).reshape((sample.shape[0], ))
        success += (preb != y_sample).sum()
        print((preb != y_sample).sum())

    time_ed=time.time()
    print("Took", round((time_ed - time_st) / 60,2), "mins to run")

    print(success / data_size)
    new_train = np.concatenate(adv_train)
    #保存ifgsm对抗样本数据集文件
    np.save('new_train', new_train)
    # plt.imshow(adv[0])
示例#4
0
def gen_adv_data(model, x, y, method, dataset, batch=2048):
    sess = K.get_session()
    model_wrap = KerasModelWrapper(model)
    if method.upper() == 'CW':
        params = {
            'binary_search_steps': 1,
            'y': y,
            'learning_rate': .1,
            'max_iterations': 50,
            'initial_const': 10,
            'batch_size': batch,
            # 'clip_min': -0.5,
            # 'clip_max': 0.5
        }
        attack = CarliniWagnerL2(model_wrap, sess=sess)

        data_num = x.shape[0]
        begin, end = 0, batch
        adv_x_all = np.zeros_like(x)
        # every time process batch_size
        while end < data_num:
            start_time = time.time()
            params['y'] = y[begin:end]
            adv_x = attack.generate_np(x[begin:end], **params)
            adv_x_all[begin:end] = adv_x
            print(begin, end, "done")
            begin += batch
            end += batch
            end_time = time.time()
            print("time: ", end_time - start_time)

        # process the remaining
        if begin < data_num:
            start_time = time.time()
            params['y'] = y[begin:]
            params['batch_size'] = data_num - begin
            adv_x = attack.generate_np(x[begin:], **params)
            adv_x_all[begin:] = adv_x
            print(begin, data_num, "done")
            end_time = time.time()
            print("time: ", end_time - start_time)

    elif method.upper() == 'PGD':
        if dataset == 'cifar':
            params = {
                'eps': 16. / 255.,
                'eps_iter': 2. / 255.,
                'nb_iter': 30.,
                # 'clip_min': -0.5,
                # 'clip_max': 0.5,
                'y': y
            }
            attack = ProjectedGradientDescent(model_wrap, sess=sess)
        elif dataset == 'mnist':
            params = {
                'eps': .3,
                'eps_iter': .03,
                'nb_iter': 20.,
                'clip_min': -0.5,
                'clip_max': 0.5,
                'y': y
            }
            attack = ProjectedGradientDescent(model_wrap, sess=sess)
        elif dataset == 'svhn':
            params = {
                'eps': 8. / 255.,
                'eps_iter': 0.01,
                'nb_iter': 30.,
                'clip_min': -0.5,
                'clip_max': 0.5,
                'y': y
            }
            attack = ProjectedGradientDescent(model_wrap, sess=sess)

        data_num = x.shape[0]
        begin, end = 0, batch
        adv_x_all = np.zeros_like(x)
        # every time process batch_size
        while end < data_num:
            start_time = time.time()
            params['y'] = y[begin:end]
            adv_x = attack.generate_np(x[begin:end], **params)
            adv_x_all[begin:end] = adv_x
            print(begin, end, "done")
            begin += batch
            end += batch
            end_time = time.time()
            print("time: ", end_time - start_time)

        # process the remaining
        if begin < data_num:
            start_time = time.time()
            params['y'] = y[begin:]
            adv_x = attack.generate_np(x[begin:], **params)
            adv_x_all[begin:] = adv_x
            print(begin, data_num, "done")
            end_time = time.time()
            print("time: ", end_time - start_time)

    else:
        print('Unsupported attack')
        sys.exit(1)

    return adv_x_all
print(results)    

#####BIM
print("BIM")
bim_params = {'eps': 0.03,
              'nb_iter': 300,
              'eps_iter': 0.03/100,
              'ord': np.inf,
               'clip_min': 0.,
               'clip_max': 1.,
               'rand_init': False
               }
bim = ProjectedGradientDescent(wrap, sess=sess)
X_adv = np.zeros((len(indices),32,32,3))
for i in range(0,len(indices),batch_attack):
    X_adv[i:i+batch_attack] = bim.generate_np(X_test[indices[i:(i+batch_attack)]], **bim_params)
print("results on source model: ")
results = metrics(model, X_adv, X_test, y_test, indices)
print(results)    
print("results on target model: ")
results = metrics(model_target, X_adv, X_test, y_test, indices)
print(results)   

#####CWL2
print("CWL2")
cwl2_params = {'binary_search_steps': 10,
               'max_iterations': 100,
               'learning_rate': 0.1,
               'batch_size': 100,
               'initial_const': 0.5,
               'clip_min': 0.,
示例#6
0
print(metrics(model, X_adv_noise, X_test, y_test, indices))

#############################
#PGD
pgd_params = {
    'eps': 0.03,
    'eps_iter': 0.01,
    'nb_iter': 100,
    'ord': np.inf,
    'rand_init': True
}

pgd_attack = ProjectedGradientDescent(wrap, sess=sess)
X_adv = np.zeros((len(indices), 32, 32, 3))
for i in range(0, len(indices), 200):
    X_adv[i:(i + 200)] = pgd_attack.generate_np(X_test[indices[i:(i + 200)]],
                                                **pgd_params)
print(metrics(model, X_adv, X_test, y_test, indices))

#############################
#CWL2
cwl2_params = {
    'binary_search_steps': 10,
    'max_iterations': 100,
    'learning_rate': 0.1,
    'batch_size': 200,
    'initial_const': 0.5,
    'clip_min': 0.,
    'clip_max': 1.,
    'confidence': 0
}
#comp_func_transfer(X_adv_auto, indices_test, pred_base, pred_auto, model_auto, model)
#comp_func_transfer(X_adv_ce, indices_test, pred_base, pred_ce, model_ce, model)
#comp_func_transfer(X_adv_rob, indices_test, pred_base, pred_rob, model_rob, model)

####################################
#PGD
print("\n\n")
print("PGD")
pgd_stacked = ProjectedGradientDescent(wrap_stacked, sess=sess)
pgd_auto = ProjectedGradientDescent(wrap_auto, sess=sess)
pgd_ce = ProjectedGradientDescent(wrap_ce, sess=sess)
pgd_rob = ProjectedGradientDescent(wrap_rob, sess=sess)

X_adv_stacked = np.zeros((len(indices_test), 32, 32, 3))
for i in np.arange(0, len(indices_test), 500):
    X_adv_stacked[i:(i + 500)] = pgd_stacked.generate_np(
        X_test[indices_test[i:(i + 500)]], **pgd_params)

X_adv_auto = np.zeros((len(indices_test), 32, 32, 3))
for i in np.arange(0, len(indices_test), 500):
    X_adv_auto[i:(i + 500)] = pgd_auto.generate_np(
        X_test[indices_test[i:(i + 500)]], **pgd_params)

X_adv_ce = np.zeros((len(indices_test), 32, 32, 3))
for i in np.arange(0, len(indices_test), 500):
    X_adv_ce[i:(i + 500)] = pgd_ce.generate_np(
        X_test[indices_test[i:(i + 500)]], **pgd_params)

X_adv_rob = np.zeros((len(indices_test), 32, 32, 3))
for i in np.arange(0, len(indices_test), 500):
    X_adv_rob[i:(i + 500)] = pgd_rob.generate_np(
        X_test[indices_test[i:(i + 500)]], **pgd_params)
示例#8
0
all_models = [model_4bits_1, model_4bits_2,
              model_8bits_1, model_8bits_2,
              model_16bits_1, model_16bits_2,
              model_32bits_1, model_32bits_2,
              model_vanilla_nn_1, model_vanilla_nn_2]

test_images, test_labels = filter_correctly_classified_samples(test_images, test_labels, all_models)
print("From now on using " + str(test_images.shape[0]) + " samples that are correctly classified by all " + str(len(all_models)) + " networks.")
print("All neural networks now have 100% accuracy.")
print()

# perform attack on 4 bits QNN
print("Generating adversarial samples for QNN_1 with 4 bits..")
wrap = KerasModelWrapper(model_4bits_1)
iterative_fgsm = ProjectedGradientDescent(wrap, sess)
adv = iterative_fgsm.generate_np(test_images, **FGSM_PARAMS)
print("Finished generating adversarial samples")

# quantify perturbation
mean, std, min, max = get_stats(np.array([np.linalg.norm(x - y) for x, y in zip(test_images, adv)]))
print("Information about L2 distances between adversarial and original samples:")
print("mean: " + str(mean))
print("std dev: " + str(std))
print("min: " + str(min))
print("max: " + str(max))

# evaluate models on adv samples
print("Evaluating accuracy of all neural networks on adversarial samples crafted for 4 bits QNN_1..")

_, test_acc = model_4bits_1.evaluate(adv, test_labels, verbose=0)
print("Accuracy of QNN_1 with 4 bits: " + str(test_acc))
示例#9
0
                        loss='sparse_categorical_crossentropy',
                        metrics=['accuracy'])
    train_model.fit(train_images, train_labels, epochs=2)

    tf.contrib.quantize.experimental_create_eval_graph(input_graph=train_graph,
                                                       weight_bits=4,
                                                       activation_bits=4)

    _, test_acc = train_model.evaluate(test_images, test_labels, verbose=0)
    print("Test accuracy of QNN: " + str(test_acc))

    # perform attack on the QNN
    print("Generating adversarial samples for QNN..")
    wrap = KerasModelWrapper(train_model)
    iterative_fgsm = ProjectedGradientDescent(wrap, train_sess)
    adv_4_bits = iterative_fgsm.generate_np(test_images, **FGSM_PARAMS)
    print("Finished generating adversarial samples")

    # quantify perturbation
    mean, std, min, max = get_stats(
        np.array(
            [np.linalg.norm(x - y) for x, y in zip(test_images, adv_4_bits)]))
    print(
        "Information about L2 distances between adversarial and original samples:"
    )
    print("mean: " + str(mean))
    print("std dev: " + str(std))
    print("min: " + str(min))
    print("max: " + str(max))

    # evaluate adv samples
          pred_base, pred_stacked, pred_auto, pred_ce, pred_rob)
#comp_func_transfer(X_adv_stacked, indices_test, pred_base, pred_stacked, model_stacked, model)
#comp_func_transfer(X_adv_auto, indices_test, pred_base, pred_auto, model_auto, model)
#comp_func_transfer(X_adv_ce, indices_test, pred_base, pred_ce, model_ce, model)
#comp_func_transfer(X_adv_rob, indices_test, pred_base, pred_rob, model_rob, model)

###################################
#PGD
print("\n\n")
print("PGD")
pgd_stacked = ProjectedGradientDescent(wrap_stacked, sess=sess)
pgd_auto = ProjectedGradientDescent(wrap_auto, sess=sess)
pgd_ce = ProjectedGradientDescent(wrap_ce, sess=sess)
pgd_rob = ProjectedGradientDescent(wrap_rob, sess=sess)

X_adv_stacked = pgd_stacked.generate_np(X_test[indices_test], **pgd_params)
X_adv_auto = pgd_auto.generate_np(X_test[indices_test], **pgd_params)
X_adv_ce = pgd_ce.generate_np(X_test[indices_test], **pgd_params)
X_adv_rob = pgd_rob.generate_np(X_test[indices_test], **pgd_params)

comp_func(X_adv_stacked, X_adv_auto, X_adv_ce, X_adv_rob, indices_test,
          pred_base, pred_stacked, pred_auto, pred_ce, pred_rob)
#comp_func_transfer(X_adv_stacked, indices_test, pred_base, pred_stacked, model_stacked, model)
#comp_func_transfer(X_adv_auto, indices_test, pred_base, pred_auto, model_auto, model)
#comp_func_transfer(X_adv_ce, indices_test, pred_base, pred_ce, model_ce, model)
#comp_func_transfer(X_adv_rob, indices_test, pred_base, pred_rob, model_rob, model)

####################################
#MIM
print("\n\n")
print("MIM")