| import pandas as pd |
| import pickle |
| import tensorflow.keras.backend as K |
| import tensorflow as tf |
|
|
| import tensorflow as tf |
| from cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method |
| from tensorflow.keras.optimizers import SGD |
| from tensorflow.keras.callbacks import Callback, LearningRateScheduler, EarlyStopping |
| from sklearn.model_selection import train_test_split |
| import pandas as pd |
| import numpy as np |
| from sklearn.preprocessing import LabelEncoder |
| from tensorflow.keras.utils import to_categorical |
| from sklearn.model_selection import KFold |
| import gzip |
| from train_utily import noise |
| import warnings |
|
|
| warnings.filterwarnings("ignore") |
| import tensorflow |
|
|
| print("\nTensorflow Version: " + tf.__version__) |
| from _utility import lrate, get_adversarial_examples, print_test |
| from wresnet import WideResidualNetwork |
| import os |
|
|
| |
| epsilons = [0.001, 0.003, 0.005, 0.01, 0.03] |
| percents = [0.25, 0.5, 0.75, 1.0] |
| os.mkdir("RandomnoiseModels") |
| os.mkdir("AEModels") |
| folder_list = ["RandomnoiseModels", "AEModels"] |
|
|
|
|
| def data_augmentation(epsilon, percent, X, Y, perturbation_type): |
| split = int(len(X) * percent) |
| file_name = str(epsilon) + ".pickle" |
| X_adv_percent = list() |
| if perturbation_type[0] == "FGSM": |
| X_adv_percent = get_adversarial_examples(model, X[:split], Y[:split], epsilon) |
| else: |
| X_adv_percent = noise(X[:split], eps=epsilon) |
|
|
| aug_X = np.concatenate((X, X_adv_percent), axis=0) |
| Y_adv = Y[:split] |
| aug_Y = np.concatenate((Y, Y_adv), axis=0) |
|
|
| return aug_X, aug_Y |
|
|
|
|
| def experiments(X, Y, folder): |
|
|
| perturbation_type = ["FGSM" if folder == "AEModels" else "Random"] |
|
|
| for epsilon in epsilons: |
| for percent in percents: |
| aug_X, aug_Y = data_augmentation(epsilon, percent, X, Y, perturbation_type) |
| train(aug_X, aug_Y, percent, epsilon, folder) |
|
|
|
|
| def train(X, Y, percent, epsilon, folder): |
|
|
| "Ten fold CVs of ResNet" |
| BS = 64 |
| init = (32, 32, 1) |
| sgd = SGD(lr=0.1, momentum=0.9) |
| kfold = KFold(n_splits=10, random_state=42, shuffle=False) |
| model_name = folder + "/ResNet_" + str(epsilon) + "_" + str(percent) |
|
|
| for j, (train, val) in enumerate(kfold.split(X)): |
|
|
| resnet = WideResidualNetwork( |
| init, 0.0001, 0.9, nb_classes=4, N=2, k=1, dropout=0.0 |
| ) |
| model = resnet.create_wide_residual_network() |
|
|
| x_train, y_train = X[train], Y[train] |
| x_val, y_val = X[val], Y[val] |
|
|
| model.compile(loss="categorical_crossentropy", optimizer=sgd, metrics=["acc"]) |
|
|
| hist = model.fit( |
| generator.flow(x_train, y_train, batch_size=64), |
| steps_per_epoch=len(x_train) // 64, |
| epochs=50, |
| validation_data=(x_val, y_val), |
| validation_steps=len(x_val) // 64, |
| callbacks=[lrate], |
| ) |
|
|
| name = model_name + "_" + str(j) + ".h5" |
| hist_name = model_name + "_acc" + "_" + str(j) + ".pickle" |
| hist_name_loss = model_name + "_loss" + "_" + str(j) + ".pickle" |
|
|
| with open(hist_name, "wb") as f: |
| pickle.dump(hist.history["val_acc"], f) |
|
|
| with open(hist_name_loss, "wb") as f: |
| pickle.dump(hist.history["val_loss"], f) |
|
|
| model.save_weights(name) |
|
|
|
|
| data = hkl.load("data.hkl") |
|
|
| X_train, X_test, Y_train, y_test = ( |
| data["xtrain"], |
| data["xtest"], |
| data["ytrain"], |
| data["ytest"], |
| ) |
|
|
| for folder in folder_list: |
| experiments(X_train, Y_train, folder) |
|
|