Exemple #1
0
    def test_save(self):
        import os

        path = 'tmp'
        filename = 'model.h5'
        classifier = KerasClassifier((0, 1), model=self.model_mnist)
        classifier.save(filename, path=path)
        self.assertTrue(os.path.isfile(os.path.join(path, filename)))

        # Remove saved file
        os.remove(os.path.join(path, filename))
Exemple #2
0
                                      eps_step=1 / 255,
                                      max_iter=20,
                                      batch_size=512)

    x_test_pgd = attack.generate(x_test, y_test)
    # np.save('./data/' + dataset + '_data/model/' + model_name + '_y_' + attack_name + '.npy', x_test_pgd)

    # Evaluate the benign trained model on adv test set
    labels_pgd = np.argmax(classifier.predict(x_test_pgd), axis=1)
    print('Accuracy on original PGD adversarial samples: %.2f%%' %
          (np.sum(labels_pgd == labels_true) / x_test.shape[0] * 100))

    trainer = AdversarialTrainer(classifier, attack, ratio=1.0)
    trainer.fit(x_train, y_train, nb_epochs=60, batch_size=1024)

    classifier.save(filename='adv_' + model_name + '.h5',
                    path='../data/' + dataset + '_data/model/')

    # Evaluate the adversarially trained model on clean test set
    labels_true = np.argmax(y_test, axis=1)
    labels_test = np.argmax(classifier.predict(x_test), axis=1)
    print('Accuracy test set: %.2f%%' %
          (np.sum(labels_test == labels_true) / x_test.shape[0] * 100))

    # Evaluate the adversarially trained model on original adversarial samples
    labels_pgd = np.argmax(classifier.predict(x_test_pgd), axis=1)
    print('Accuracy on original PGD adversarial samples: %.2f%%' %
          (np.sum(labels_pgd == labels_true) / x_test.shape[0] * 100))

    # Evaluate the adversarially trained model on fresh adversarial samples produced on the adversarially trained model
    x_test_pgd = attack.generate(x_test, y_test)
    labels_pgd = np.argmax(classifier.predict(x_test_pgd), axis=1)
Exemple #3
0
                                      eps_step=0.007,
                                      max_iter=40)
    x_adv = attack.generate(x=x_train)

    print("------Training Robust Model------")
    x_train_final = np.append(x_train, x_adv, axis=0)
    y_train_final = np.append(y_train, y_train, axis=0)

    if not os.path.isfile('robust_model.h5'):
        print(x_adv.shape, y_train.shape, x_train_final.shape,
              y_train_final.shape, x_train.shape)
        robust_model = robust_cnn.fit(x_train_final,
                                      y_train_final,
                                      nb_epochs=1,
                                      batch_size=128)
        robust_cnn.save('robust_model.h5')
    else:
        cnn.load_weights('robust_model.h5')
        print("Loaded Robust model")

    print("------Evaluating robust classifier-----")
    accuracy = np.sum(np.argmax(predict, axis=1) == y_test) / len(y_test)
    print('Accuracy on benign test examples: {:.3f}%'.format(accuracy * 100))
    x_example = x_test[example]

    # Generate adversarial test examples
    # Evaluate the ART classifier on adversarial test examples
    print("*" * 100)
    attack = FastGradientMethod(classifier=robust_cnn, eps=0.03)
    x_test_adv = attack.generate(x=x_test)
    perturbation = np.mean(np.abs((x_test_adv - x_test)))
def main(args):
    logging.info('brokers={}'.format(args.brokers))
    logging.info('readtopic={}'.format(args.readtopic))
    logging.info('creating kafka consumer')

    consumer = KafkaConsumer(
        args.readtopic,
        bootstrap_servers=args.brokers,
        value_deserializer=lambda val: loads(val.decode('utf-8')))
    logging.info("finished creating kafka consumer")

    if args.dbxtoken != '':
        dbx = dropbox.Dropbox(args.dbxtoken)
    else:
        dbx = None
        logging.info('No Dropbox token provided')

    while True:
        for message in consumer:
            if (message.value['status']
                    == 'Ready') and (message.value['modelurl']):
                logging.info('Received {}'.format(message.value))
                (X_train, y_train), (X_test, y_test) = cifar10.load_data()
                X_train = X_train.reshape(X_train.shape[0], 32, 32,
                                          3).astype('float32')
                X_test = X_test.reshape(X_test.shape[0], 32, 32,
                                        3).astype('float32')
                y_train = to_categorical(y_train, 10)
                y_test = to_categorical(y_test, 10)
                modelurl = message.value['modelurl']
                logging.info('model={}'.format(modelurl))
                model_filename = 'base_model.h5'
                location = os.path.join(ART_DATA_PATH, model_filename)
                try:
                    os.remove(location)
                except OSError as error:
                    pass
                path = get_file(model_filename,
                                extract=False,
                                path=ART_DATA_PATH,
                                url=modelurl)
                kmodel = load_model(path)
                model = KerasClassifier(
                    kmodel,
                    use_logits=False,
                    clip_values=[float(args.min),
                                 float(args.max)])
                logging.info('finished acquiring model')
                imagefiles = dbx.files_list_folder('/images')
                adversaries = False
                for dbximage in imagefiles.entries:
                    filepath = '/images/' + dbximage.name
                    filename = dbximage.name
                    label = filename.split('_')[-3]
                    response = dbx.files_download(filepath)[1]
                    img = Image.open(BytesIO(response.content))
                    logging.info('downloaded file {}'.format(dbximage.name))
                    image = np.array(img.getdata()).reshape(
                        1, img.size[0], img.size[1], 3).astype('float32')
                    if adversaries is False:
                        X_adv = image
                        y_adv = [label]
                        adversaries = True
                    else:
                        X_adv = np.append(X_adv, image, axis=0)
                        y_adv = np.append(y_adv, [label], axis=0)
                y_adv = to_categorical(y_adv, 10)
                X_train = np.append(X_train, X_adv, axis=0)
                y_train = np.append(y_train, y_adv, axis=0)
                if args.testmode == '0':
                    model.fit(X_train, y_train, nb_epochs=83,
                              batch_size=50)  # Per ART 360 example
                else:
                    model.fit(X_train, y_train, nb_epochs=1,
                              batch_size=50)  # Testing only
                model_basename = model_filename.split('.')[0]
                adv_model_name = model_basename + '_adv'
                adv_model_filename = adv_model_name + '.h5'
                model.save(adv_model_filename)
                outfilename = '/models/{}'.format(adv_model_filename)
                adv_model_fullpath = '/opt/app-root/src/.art/data/' + adv_model_filename
                mfile = open(adv_model_fullpath, 'rb')
                dbx.files_upload(f=mfile.read(),
                                 path=outfilename,
                                 mode=dropbox.files.WriteMode(
                                     'overwrite', None))
                mfile.close()
                share_link = dbx.sharing_create_shared_link_with_settings(
                    outfilename)

                conn = psycopg2.connect(host=args.dbhost,
                                        port=5432,
                                        dbname=args.dbname,
                                        user=args.dbusername,
                                        password=args.dbpassword)
                cur = conn.cursor()
                query = 'INSERT into models(URL, FILENAME, MODELNAME) VALUES(%s, %s, %s)'
                cur.execute(query,
                            (share_link, adv_model_filename, adv_model_name))
                conn.commit()
                logging.info('updated database with new model')
                cur.close()
                conn.close()
Exemple #5
0
x_train_adv = adv_crafter.generate(x_train)
logger.info('Craft attack test examples')
x_test_adv = adv_crafter.generate(x_test)

# Evaluate the classifier on the adversarial samples
preds = np.argmax(classifier.predict(x_test_adv), axis=1)
acc = np.sum(preds == np.argmax(y_test, axis=1)) / y_test.shape[0]
logger.info('Classifier before adversarial training')
logger.info('Accuracy on adversarial samples: %.2f%%', (acc * 100))

# Data augmentation: expand the training set with the adversarial samples
x_train = np.append(x_train, x_train_adv, axis=0)
y_train = np.append(y_train, y_train, axis=0)

# Retrain the CNN on the extended dataset
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
classifier.fit(x_train, y_train, nb_epochs=10, batch_size=128)

# Evaluate the adversarially trained classifier on the test set
preds = np.argmax(classifier.predict(x_test_adv), axis=1)
acc = np.sum(preds == np.argmax(y_test, axis=1)) / y_test.shape[0]
logger.info('Classifier with adversarial training')
logger.info('Accuracy on adversarial samples: %.2f%%', (acc * 100))
print('adversarial-robustness-toolbox/examples/cifar_adversarial_training_from_ART_BIM.py')
#save the model
model_name = datetime.now().strftime("%Y%m%d-%H%M%S") + 'cifar_adversarial_training_BIM.h5'
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_path = os.path.join(save_dir, model_name)
print('Saved trained model at %s ' % model_path)
classifier.save(model_path)
           kernel_size=(5, 5),
           strides=1,
           activation='relu',
           input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(
    Conv2D(filters=10,
           kernel_size=(5, 5),
           strides=1,
           activation='relu',
           input_shape=(23, 23, 4)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(10, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.SGD(lr=0.01),
              metrics=['accuracy'])

# Step 3: Create the ART classifier

classifier = KerasClassifier(model=model,
                             clip_values=(min_pixel_value, max_pixel_value),
                             use_logits=False)

# Step 4: Train the ART classifier

classifier.fit(x_train, y_train, batch_size=32, nb_epochs=10)
classifier.save('cnn_simple_mnist.model')