diff --git "a/visualization/SignalToNoiseRatio.ipynb" "b/visualization/SignalToNoiseRatio.ipynb" new file mode 100644--- /dev/null +++ "b/visualization/SignalToNoiseRatio.ipynb" @@ -0,0 +1,3601 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "kkK5yOtaEOWL" + }, + "source": [ + "# SNR Result" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kCzmRkwxler6" + }, + "source": [ + "**Experiment of Residual Networks**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "scrFZBY5ErKc", + "outputId": "6e55dc88-b560-4108-d874-7a74704d2b40" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[?25l\r", + "\u001b[K |██▏ | 10kB 31.5MB/s eta 0:00:01\r", + "\u001b[K |████▎ | 20kB 34.3MB/s eta 0:00:01\r", + "\u001b[K |██████▍ | 30kB 39.2MB/s eta 0:00:01\r", + "\u001b[K |████████▌ | 40kB 28.0MB/s eta 0:00:01\r", + "\u001b[K |██████████▋ | 51kB 30.6MB/s eta 0:00:01\r", + "\u001b[K |████████████▊ | 61kB 26.3MB/s eta 0:00:01\r", + "\u001b[K |██████████████▉ | 71kB 24.5MB/s eta 0:00:01\r", + "\u001b[K |█████████████████ | 81kB 23.6MB/s eta 0:00:01\r", + "\u001b[K |███████████████████ | 92kB 25.2MB/s eta 0:00:01\r", + "\u001b[K |█████████████████████▏ | 102kB 22.5MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████▎ | 112kB 22.5MB/s eta 0:00:01\r", + "\u001b[K |█████████████████████████▍ | 122kB 22.5MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████████▌ | 133kB 22.5MB/s eta 0:00:01\r", + "\u001b[K |█████████████████████████████▋ | 143kB 22.5MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████████████▊| 153kB 22.5MB/s eta 0:00:01\r", + "\u001b[K |████████████████████████████████| 163kB 22.5MB/s \n", + "\u001b[?25h\u001b[?25l\r", + "\u001b[K |████████ | 10kB 35.3MB/s eta 0:00:01\r", + "\u001b[K |███████████████▉ | 20kB 39.4MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████▊ | 30kB 43.7MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████████████▊| 40kB 46.9MB/s eta 0:00:01\r", + "\u001b[K |████████████████████████████████| 51kB 9.3MB/s \n", + "\u001b[?25h" + ] + } + ], + "source": [ + "!pip install -qq -e git+http://github.com/tensorflow/cleverhans.git#egg=cleverhans\n", + "import sys\n", + "sys.path.append('/content/src/cleverhans')\n", + "import cleverhans\n", + "folder_name = \"./adversarial_examples_parseval_net/src/logs/saved_models/\"\n", + "folder_name = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "P3Ic_pclEOWd", + "outputId": "508c4768-c6b7-44f5-b875-9bc30b7e33b6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Tensorflow Version: 2.4.0\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "from cleverhans.future.tf2.attacks import fast_gradient_method\n", + "from tensorflow.keras.optimizers import SGD\n", + "from tensorflow.keras.callbacks import Callback, LearningRateScheduler, EarlyStopping\n", + "from sklearn.model_selection import train_test_split\n", + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "from sklearn.model_selection import KFold\n", + "import gzip\n", + "import pickle\n", + "import numpy as np\n", + "\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"\\nTensorflow Version: \" + tf.__version__)\n", + "\n", + "\n", + "# defined utility functions\n", + "#from preprocessing import preprocessing_data\n", + "\n", + "from _utility import lrate, get_adversarial_examples, print_test\n", + "#from wresnet import WideResidualNetwork\n", + "#from parsevalnet import ParsevalNetwork\n", + "#import pandas as pd\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "PDl5l5VOPrDj" + }, + "outputs": [], + "source": [ + "!cp drive/MyDrive/ARAS/* models/" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "7NJdmKEXQ7wY" + }, + "outputs": [], + "source": [ + "!cp drive/MyDrive/adversarial_examples_parseval_net/data.pz models/" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hcPFBUjdPrcD", + "outputId": "588c52dd-a9fc-4eb7-e789-3adf3b434788" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mounted at /content/drive\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Psk-FZmvP6m_" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "sPqR9xN9EOWp" + }, + "outputs": [], + "source": [ + "epsilon_list = [i/1000 for i in range(0,40)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gLczK1jwhP4L" + }, + "outputs": [], + "source": [ + "epsilon_list" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3A8qMxGap02K", + "outputId": "34500939-0786-4d2e-949b-94ffe0d95ed3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting hickle\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/24/c8/af2d17ea98d7eb60ad05689c0509c5c3538a603344818c3d5f0f5c004f1e/hickle-4.0.3-py3-none-any.whl (48kB)\n", + "\r", + "\u001b[K |██████▊ | 10kB 25.5MB/s eta 0:00:01\r", + "\u001b[K |█████████████▌ | 20kB 16.2MB/s eta 0:00:01\r", + "\u001b[K |████████████████████▏ | 30kB 14.9MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████████ | 40kB 14.8MB/s eta 0:00:01\r", + "\u001b[K |████████████████████████████████| 51kB 6.4MB/s \n", + "\u001b[?25hRequirement already satisfied: h5py<3.0.0,>=2.8.0 in /usr/local/lib/python3.6/dist-packages (from hickle) (2.10.0)\n", + "Requirement already satisfied: numpy>=1.8 in /usr/local/lib/python3.6/dist-packages (from hickle) (1.19.4)\n", + "Requirement already satisfied: dill>=0.3.0 in /usr/local/lib/python3.6/dist-packages (from hickle) (0.3.3)\n", + "Requirement already satisfied: six>=1.11.0 in /usr/local/lib/python3.6/dist-packages (from hickle) (1.15.0)\n", + "Installing collected packages: hickle\n", + "Successfully installed hickle-4.0.3\n" + ] + } + ], + "source": [ + "!pip install hickle\n", + "import hickle as hkl" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "tYtYNWlmE-yj" + }, + "outputs": [], + "source": [ + "data = hkl.load(\"data.hkl\")\n", + "X_train, X_test, Y_train, y_test = data['xtrain'], data['xtest'], data['ytrain'], data['ytest']" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "id": "R69Nc9UkRrti" + }, + "outputs": [], + "source": [ + "\n", + "BS = 64\n", + "init = (32, 32,1)\n", + "opt = SGD(lr=0.1, momentum=0.9)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "lxrpq-u_cSEd" + }, + "outputs": [], + "source": [ + "\n", + "parseval = ParsevalNetwork(init, 0.0001, 0.9, nb_classes=4, N=2, k=1, dropout=0.0)\n", + "resnet = WideResidualNetwork(init, 0.0001, 0.9, nb_classes=4, N=2, k=1, dropout=0.0)\n", + "parseval_model = parseval.create_wide_residual_network()\n", + "parseval_model_da = parseval.create_wide_residual_network()\n", + "resnet_model = resnet.create_wide_residual_network()\n", + "resnet_model_da = resnet.create_wide_residual_network()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YA4uSa__VoEe" + }, + "outputs": [], + "source": [ + "def evaluation_result(frame, model, model_da, index):\n", + " for i, epsilon in enumerate(epsilon_list):\n", + " x_adv = get_adversarial_examples(model,X_test, y_test, epsilon)\n", + " SNR = 20*np.log10(np.linalg.norm(X_test)/np.linalg.norm(X_test-x_adv))\n", + " test = model.evaluate(x_adv, y_test, verbose = 0.0)\n", + " test_da = model_da.evaluate(x_adv, y_test, verbose = 0.0)\n", + " row = {\"acc\":test[1], \"acc_da\": test_da[1],\"SNR\":SNR}\n", + " frame = frame.append(row, ignore_index=True)\n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "azXld8ReZcGG" + }, + "outputs": [], + "source": [ + "df_parseval_1 = pd.DataFrame()\n", + "df_parseval_2 = pd.DataFrame()\n", + "df_parseval_3 = pd.DataFrame()\n", + "df_parseval_4 = pd.DataFrame()\n", + "df_parseval_5 = pd.DataFrame()\n", + "df_parseval_6 = pd.DataFrame()\n", + "df_parseval_7 = pd.DataFrame()\n", + "df_parseval_8 = pd.DataFrame()\n", + "df_parseval_9 = pd.DataFrame()\n", + "df_parseval_0 = pd.DataFrame()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-87OuDRbtLbW" + }, + "outputs": [], + "source": [ + "list_df = []\n", + "list_df.append(df_parseval_0)\n", + "list_df.append(df_parseval_1)\n", + "list_df.append(df_parseval_2)\n", + "list_df.append(df_parseval_3)\n", + "list_df.append(df_parseval_4)\n", + "list_df.append(df_parseval_5)\n", + "list_df.append(df_parseval_6)\n", + "list_df.append(df_parseval_7)\n", + "list_df.append(df_parseval_8)\n", + "list_df.append(df_parseval_9)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tx9dfUCwUoU9" + }, + "outputs": [], + "source": [ + "column_name = \"test_\"\n", + "column_name_da = \"test_da_\"\n", + "\n", + "for i in range(10):\n", + " model_name = \"Parseval_\"+str(i)+\".h5\"\n", + " model_name_da = \"Parseval_da_\"+str(i)+\".h5\"\n", + " parseval_model.load_weights(model_name)\n", + " parseval_model_da.load_weights(model_name_da)\n", + " parseval_model.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " parseval_model_da.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " list_df[i] = evaluation_result(list_df[i], parseval_model, parseval_model_da, i)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "TB2Qf4h-uCEW" + }, + "outputs": [], + "source": [ + "mean_acc = (list_df[0][\"acc\"]+list_df[1][\"acc\"]+list_df[2][\"acc\"]+list_df[3][\"acc\"]+list_df[4][\"acc\"]+list_df[5][\"acc\"]+list_df[6][\"acc\"]+list_df[7][\"acc\"]+list_df[8][\"acc\"]+list_df[9][\"acc\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Ih9SU1Q91zP9" + }, + "outputs": [], + "source": [ + "mean_acc_da = (list_df[0][\"acc_da\"]+list_df[1][\"acc_da\"]+list_df[2][\"acc_da\"]+list_df[3][\"acc_da\"]+list_df[4][\"acc_da\"]+list_df[5][\"acc_da\"]+list_df[6][\"acc_da\"]+list_df[7][\"acc_da\"]+list_df[8][\"acc_da\"]+list_df[9][\"acc_da\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "I3H-GhGMy88S" + }, + "outputs": [], + "source": [ + "df_resnet_1 = pd.DataFrame()\n", + "df_resnet_2 = pd.DataFrame()\n", + "df_resnet_3 = pd.DataFrame()\n", + "df_resnet_4 = pd.DataFrame()\n", + "df_resnet_5 = pd.DataFrame()\n", + "df_resnet_6 = pd.DataFrame()\n", + "df_resnet_7 = pd.DataFrame()\n", + "df_resnet_8 = pd.DataFrame()\n", + "df_resnet_9 = pd.DataFrame()\n", + "df_resnet_0 = pd.DataFrame()\n", + "list_df_r = []\n", + "list_df_r.append(df_resnet_0)\n", + "list_df_r.append(df_resnet_1)\n", + "list_df_r.append(df_resnet_2)\n", + "list_df_r.append(df_resnet_3)\n", + "list_df_r.append(df_resnet_4)\n", + "list_df_r.append(df_resnet_5)\n", + "list_df_r.append(df_resnet_6)\n", + "list_df_r.append(df_resnet_7)\n", + "list_df_r.append(df_resnet_8)\n", + "list_df_r.append(df_resnet_9)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CDrVZvnMfyGe" + }, + "outputs": [], + "source": [ + "column_name = \"test_\"\n", + "column_name_da = \"test_da_\"\n", + "\n", + "for i in range(10):\n", + " model_name = \"ResNet_\"+str(i)+\".h5\"\n", + " model_name_da = \"ResNet_da_\"+str(i)+\".h5\"\n", + " resnet_model.load_weights(model_name)\n", + " resnet_model_da.load_weights(model_name_da)\n", + " resnet_model.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " resnet_model_da.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " list_df_r[i] = evaluation_result(list_df_r[i], resnet_model, resnet_model_da, i)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "okr0CEf36OCR" + }, + "outputs": [], + "source": [ + "list_df[9]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Bi3ArlH7hFMr" + }, + "outputs": [], + "source": [ + "mean_acc_r = (list_df_r[0][\"acc\"]+list_df_r[1][\"acc\"]+list_df_r[2][\"acc\"]+list_df_r[3][\"acc\"]+list_df_r[4][\"acc\"]+list_df_r[5][\"acc\"]+list_df_r[6][\"acc\"]+list_df_r[7][\"acc\"]+list_df_r[8][\"acc\"]+list_df_r[9][\"acc\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-UMhh1Wv44Y7" + }, + "outputs": [], + "source": [ + "mean_acc_da_r = (list_df_r[0][\"acc_da\"]+list_df_r[1][\"acc_da\"]+list_df_r[2][\"acc_da\"]+list_df_r[3][\"acc_da\"]+list_df_r[4][\"acc_da\"]+list_df_r[5][\"acc_da\"]+list_df_r[6][\"acc_da\"]+list_df_r[7][\"acc_da\"]+list_df_r[8][\"acc_da\"]+list_df_r[9][\"acc_da\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eGssN3tQ8CMA", + "outputId": "f66aafe2-fbe5-4673-f150-4f5218093b7e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6956369936466217" + ] + }, + "execution_count": 61, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "mean_acc_r[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_ew1CSd783Vf", + "outputId": "be0f983b-48d3-4c35-b5d3-4703d9d5cfdc" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "40" + ] + }, + "execution_count": 60, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "len(mean_acc_da_r)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 325 + }, + "id": "6sdUdzSCEOW7", + "outputId": "0a2bed53-afb1-425a-8d56-491578e2a7c8" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "legend = [\"ResNet\", \"ResNet_da\", \"Parseval\", \"Parseval_da\"]\n", + "plt.plot(list_df_r[0][\"SNR\"], mean_acc_r, 'o-')\n", + "plt.plot(list_df_r[0][\"SNR\"], mean_acc_da_r, 'o-')\n", + "\n", + "plt.plot(list_df_r[0][\"SNR\"], mean_acc, 'o-')\n", + "plt.plot(list_df_r[0][\"SNR\"], mean_acc_da, 'o-')\n", + "\n", + "plt.title(\"The Performance of the models \\n for varios magnitudes \\n adversarial noise\")\n", + "plt.ylabel('mean acc of \\n 10 Folds CV')\n", + "plt.xlabel('SNR')\n", + "plt.legend(legend, loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cPqVCc2J-6GU" + }, + "outputs": [], + "source": [ + "import json\n", + "for i in range(len(epsilon_list)):\n", + " with open(\"result_ResNet.json\", mode='a', encoding='utf-8') as feedsjson:\n", + " data = {\"SNR\":list_df_r[0][\"SNR\"][i], \"mean_ResNet\":mean_acc_r[i],\"mean_ResNet_da\":mean_acc_da_r[i], \"mean_Parseval\":mean_acc[i],\"mean_Parseval_da\":mean_acc_da[i]}\n", + " feedsjson.write(json.dumps(data, ensure_ascii=False, indent=4))\n", + " feedsjson.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "id": "x7Tqobb5Ruuk" + }, + "outputs": [], + "source": [ + "df_sgd_1 = pd.DataFrame()\n", + "df_sgd_2 = pd.DataFrame()\n", + "df_sgd_3 = pd.DataFrame()\n", + "df_sgd_4 = pd.DataFrame()\n", + "df_sgd_5 = pd.DataFrame()\n", + "df_sgd_6 = pd.DataFrame()\n", + "df_sgd_7 = pd.DataFrame()\n", + "df_sgd_8 = pd.DataFrame()\n", + "df_sgd_9 = pd.DataFrame()\n", + "df_sgd_0 = pd.DataFrame()\n", + "list_df_c = []\n", + "list_df_c.append(df_sgd_0)\n", + "list_df_c.append(df_sgd_1)\n", + "list_df_c.append(df_sgd_2)\n", + "list_df_c.append(df_sgd_3)\n", + "list_df_c.append(df_sgd_4)\n", + "list_df_c.append(df_sgd_5)\n", + "list_df_c.append(df_sgd_6)\n", + "list_df_c.append(df_sgd_7)\n", + "list_df_c.append(df_sgd_8)\n", + "list_df_c.append(df_sgd_9)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "meiehDfhTEuE" + }, + "outputs": [], + "source": [ + "from tensorflow.data import Dataset\n", + "import tensorflow.keras as keras\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.layers import Conv2D,Input,MaxPooling2D, Dense, Dropout, MaxPool1D, Flatten, AveragePooling1D, BatchNormalization\n", + "from tensorflow.keras import Model\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.models import Model\n", + "from tensorflow.keras.layers import Input, Add, Activation, Dropout, Flatten, Dense\n", + "from tensorflow.keras.layers import Convolution2D, MaxPooling2D, AveragePooling2D\n", + "from tensorflow.keras.layers import BatchNormalization\n", + "from tensorflow.keras.regularizers import l2\n", + "from tensorflow.keras import backend as K\n", + "from tensorflow.keras.optimizers import SGD\n", + "import warnings\n", + "from constraint import tight_frame\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "def model_parseval(weight_decay):\n", + " model = Sequential()\n", + " model.add(Conv2D(32, kernel_size=(3, 3),activation='relu', input_shape=(32, 32, 1),kernel_regularizer=l2(weight_decay),kernel_constraint=tight_frame(0.001),kernel_initializer='Orthogonal'))\n", + " model.add(Conv2D(64, kernel_size=(3, 3), activation='relu',kernel_regularizer=l2(weight_decay),kernel_initializer='Orthogonal',kernel_constraint=tight_frame(0.001)))\n", + " model.add(MaxPooling2D(pool_size=(2, 2)))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(128, kernel_size=(3, 3), activation='relu',kernel_initializer='Orthogonal',kernel_regularizer=l2(weight_decay),kernel_constraint=tight_frame(0.001)))\n", + " model.add(MaxPooling2D(pool_size=(2, 2)))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(256, kernel_size=(3, 3), activation='relu',kernel_initializer='Orthogonal', kernel_regularizer=l2(weight_decay),kernel_constraint=tight_frame(0.001)))\n", + " model.add(MaxPooling2D(pool_size=(2, 2)))\n", + " model.add(BatchNormalization())\n", + " model.add(Flatten())\n", + " model.add(Dense(4, activation='softmax',kernel_regularizer=l2(weight_decay)))\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "id": "rUabfb8RT-pC" + }, + "outputs": [], + "source": [ + "from tensorflow.data import Dataset\n", + "import tensorflow.keras as keras\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.layers import Conv2D,Input,MaxPooling2D, Dense, Dropout, MaxPool1D, Flatten, AveragePooling1D, BatchNormalization\n", + "from tensorflow.keras import Model\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.models import Model\n", + "from tensorflow.keras.layers import Input, Add, Activation, Dropout, Flatten, Dense\n", + "from tensorflow.keras.layers import Convolution2D, MaxPooling2D, AveragePooling2D\n", + "from tensorflow.keras.layers import BatchNormalization\n", + "from tensorflow.keras.regularizers import l2\n", + "from tensorflow.keras import backend as K\n", + "from tensorflow.keras.optimizers import SGD\n", + "import warnings\n", + "from constraint import tight_frame\n", + "from convexity_constraint import convex_add\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "def basemodel(weight_decay):\n", + " #2 hidden layers\n", + " model_input = Input(shape=(32,32,1, ))\n", + " model = Conv2D(32, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay),activation='relu', )(model_input)\n", + " model = Conv2D(64, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay), activation='relu')(model)\n", + " model = MaxPooling2D(pool_size=(2, 2))(model)\n", + " model = BatchNormalization()(model)\n", + " model = Flatten()(model)\n", + " model = Dense(4, kernel_regularizer=l2(weight_decay),activation='softmax')(model)\n", + " model = Model(inputs=model_input, outputs=model)\n", + " return model\n", + "\n", + "\n", + "def model_2(weight_decay):\n", + " model_input = Input(shape=(32,32,1, ))\n", + " model = Conv2D(32, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay),activation='relu', )(model_input)\n", + " model = Conv2D(64, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay), activation='relu')(model)\n", + " model = MaxPooling2D(pool_size=(2, 2))(model)\n", + " model = BatchNormalization()(model)\n", + " model = Conv2D(128, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay), activation='relu')(model)\n", + " model = MaxPooling2D(pool_size=(2, 2))(model)\n", + " model = BatchNormalization()(model)\n", + " model = Flatten()(model)\n", + " model = Dense(4, kernel_regularizer=l2(weight_decay),activation='softmax')(model)\n", + " model = Model(inputs=model_input, outputs=model)\n", + " return model\n", + "\n", + "\n", + "def model_3(weight_decay):\n", + " # 4 hidden layers\n", + " model_input = Input(shape=(32,32,1, ))\n", + " model = Conv2D(32, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay),activation='relu', )(model_input)\n", + " model = Conv2D(64, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay), activation='relu')(model)\n", + " model = MaxPooling2D(pool_size=(2, 2))(model)\n", + " model = BatchNormalization()(model)\n", + " model = Conv2D(128, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay), activation='relu')(model)\n", + " model = MaxPooling2D(pool_size=(2, 2))(model)\n", + " model = BatchNormalization()(model)\n", + " model = Conv2D(256, kernel_size=(3, 3), kernel_regularizer=l2(weight_decay), activation='relu')(model)\n", + " model = MaxPooling2D(pool_size=(2, 2))(model)\n", + " model = BatchNormalization()(model)\n", + " model = Flatten()(model)\n", + " model = Dense(4, kernel_regularizer=l2(weight_decay),activation='softmax')(model)\n", + " model = Model(inputs=model_input, outputs=model)\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "id": "owqtAK0MRyUn" + }, + "outputs": [], + "source": [ + "def evaluation_result_fully_connected(frame, sgd, sgd_wd,sgd_wd_da,parseval, index):\n", + " test = sgd.evaluate(X_test, y_test, verbose = 0.0)\n", + " test_wd = sgd_wd.evaluate(X_test, y_test, verbose = 0.0)\n", + " test_wd_da = sgd_wd_da.evaluate(X_test, y_test, verbose = 0.0)\n", + " test_parseval = parseval.evaluate(X_test, y_test, verbose = 0.0)\n", + " row = {\"acc_sgd\":test[1], \"acc_sgd_wd\": test_wd[1],\"acc_sgd_wd_da\":test_wd_da[1],\"acc_parseval\":test_parseval[1], \"SNR\":100}\n", + " frame = frame.append(row, ignore_index=True)\n", + " for i, epsilon in enumerate(epsilon_list):\n", + " x_adv = get_adversarial_examples(sgd,X_test, y_test, epsilon)\n", + " SNR = 20*np.log10(np.linalg.norm(X_test)/np.linalg.norm(X_test-x_adv))\n", + " test = sgd.evaluate(x_adv, y_test, verbose = 0.0)\n", + " test_wd = sgd_wd.evaluate(x_adv, y_test, verbose = 0.0)\n", + " test_wd_da = sgd_wd_da.evaluate(x_adv, y_test, verbose = 0.0)\n", + " test_parseval = parseval.evaluate(x_adv, y_test, verbose = 0.0)\n", + " row = {\"acc_sgd\":test[1], \"acc_sgd_wd\": test_wd[1],\"acc_sgd_wd_da\":test_wd_da[1],\"acc_parseval\":test_parseval[1], \"SNR\":SNR}\n", + " frame = frame.append(row, ignore_index=True)\n", + "\n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "id": "9Mm05Z2ASItk" + }, + "outputs": [], + "source": [ + "for i in range(10):\n", + " name_sgd = \"models/sgd_\"+str(i)+\".h5\"\n", + " name_sgd_wd = \"models/sgd_wd_\"+str(i)+\".h5\"\n", + " name_sgd_wd_da = \"models/conv_wd_da_\"+str(i)+\".h5\"\n", + " name_parseval = \"models/Parseval_\"+str(i)+\".h5\"\n", + " sgd = model_3(0)\n", + " sgd_wd = model_3(0.0001)\n", + " sgd_wd_da = model_3(0.0001)\n", + " parseval = model_parseval(0)\n", + " sgd.load_weights(name_sgd)\n", + " sgd_wd.load_weights(name_sgd_wd)\n", + " sgd_wd_da.load_weights(name_sgd_wd_da)\n", + " parseval.load_weights(name_parseval)\n", + " sgd.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " sgd_wd.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " sgd_wd_da.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " parseval.compile(loss=\"categorical_crossentropy\", optimizer=opt, metrics=[\"acc\"])\n", + " list_df_c[i] = evaluation_result_fully_connected(list_df_c[i],sgd, sgd_wd, sgd_wd_da, parseval, i)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "id": "Rwxqk_GqWGPS" + }, + "outputs": [], + "source": [ + "mean_acc_sgd = (list_df_c[0][\"acc_sgd\"]+list_df_c[1][\"acc_sgd\"]+list_df_c[2][\"acc_sgd\"]+list_df_c[3][\"acc_sgd\"]+list_df_c[4][\"acc_sgd\"]+list_df_c[5][\"acc_sgd\"]+list_df_c[6][\"acc_sgd\"]+list_df_c[7][\"acc_sgd\"]+list_df_c[8][\"acc_sgd\"]+list_df_c[9][\"acc_sgd\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "id": "Cyn71HxRWPUo" + }, + "outputs": [], + "source": [ + "mean_acc_sgd_wd = (list_df_c[0][\"acc_sgd_wd\"]+list_df_c[1][\"acc_sgd_wd\"]+list_df_c[2][\"acc_sgd_wd\"]+list_df_c[3][\"acc_sgd_wd\"]+list_df_c[4][\"acc_sgd_wd\"]+list_df_c[5][\"acc_sgd_wd\"]+list_df_c[6][\"acc_sgd_wd\"]+list_df_c[7][\"acc_sgd_wd\"]+list_df_c[8][\"acc_sgd_wd\"]+list_df_c[9][\"acc_sgd_wd\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "id": "RPwV2ATuWVBc" + }, + "outputs": [], + "source": [ + "mean_acc_sgd_wd_da = (list_df_c[0][\"acc_sgd_wd_da\"]+list_df_c[1][\"acc_sgd_wd_da\"]+list_df_c[2][\"acc_sgd_wd_da\"]+list_df_c[3][\"acc_sgd_wd_da\"]+list_df_c[4][\"acc_sgd_wd_da\"]+list_df_c[5][\"acc_sgd_wd_da\"]+list_df_c[6][\"acc_sgd_wd_da\"]+list_df_c[7][\"acc_sgd_wd_da\"]+list_df_c[8][\"acc_sgd_wd_da\"]+list_df_c[9][\"acc_sgd_wd_da\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "id": "yTXtBL3fWWt6" + }, + "outputs": [], + "source": [ + "mean_acc_parseval = (list_df_c[0][\"acc_parseval\"]+list_df_c[1][\"acc_parseval\"]+list_df_c[2][\"acc_parseval\"]+list_df_c[3][\"acc_parseval\"]+list_df_c[4][\"acc_parseval\"]+list_df_c[5][\"acc_parseval\"]+list_df_c[6][\"acc_parseval\"]+list_df_c[7][\"acc_parseval\"]+list_df_c[8][\"acc_parseval\"]+list_df_c[9][\"acc_parseval\"])/10" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "id": "p5MZNkMeeuIt" + }, + "outputs": [], + "source": [ + "list_df_c[0][\"SNR\"][1] =100" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 325 + }, + "id": "2fGWosoyXL3t", + "outputId": "b144105e-b51d-4ea0-fa95-e5da0460c44d" + }, + "outputs": [ + { + "data": { + "image/png": "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NbNXJU0HFprZnAbOfVXSvQQd+Angu60xwsvnnzhXXKeMKXztf8uWLXzve99jw4YNlJWVse+++zJz5kx69OjBZZddxkEHHUS3bt2orKzkzDPPZMCAAQBUV1czevRoampqKCsr42tf+xrnn39+QctW6mRZ1uvoCMaNG2cLFy4s2PVmL67iB/csyTpkeGDPSp656PiC3cu59ur1119n//33b+1iuFC234ekRWY2LtvxpdTk1ab5/BPnXEfnAaVAfP6Jc66j84BSAA2tHe/zT5xzHYUHlGbyteOdcy7gAaWZfO1455wLeEBpJl873jnnAh5QmilX7i5PVe9cEbx0L/ziIJjWM/j50r2tXaIOzQNKMx2335711j/xvhPniuCle+HB82DjB4AFPx88ryBBpRjroYwZM6Y23X0ikaBr167ceeedtfsPO+wwXnzxRW6//Xb23HNPxowZw4gRI5g4cSLz589v9ntsCSUzU74tSufuinbHe+4u5wrk4Ytg1cu5969YAMkddbfVVMNfpsCiO7Kf0+9g+MyMBm9brPVQxo8fz/z58xk9ejT/+te/GDlyJPPnz+c///M/2bp1K2+//TaHHnooL730Eqeddho33HADAI8//jinnnoqjz/+eMlNAvUaSjN47i7nWlFmMGlse56yrYfSs2dPbr75Zq6//vomrYdyww03kCsbyTHHHFNb05g/fz7nnntubUB64YUXOOyww4jH4/XOO+644zjnnHOYOXNms95nS/AaSjPk6pD33F3OFUAjNQl+cVDY3JWhx2A4O3PJpPxNmDCB6dOnM3LkSE444QROO+00evXq1az1UPbee+96+8ePH8+ll14KBAHliiuuYNasWWzevJn58+dzzDHH5Lz22LFjuemmm5r+5lqY11CaoUdledbt3iHvXBF8+nIoz/h/rbwy2N4M6fVQZs6cyZ577slpp53GE088UeeY2267jdGjRzN48GA++CBLUMvDPvvsw86dO1m1ahVvvPEGo0aN4vDDD+f5559n/vz5jB8/Pue5pZqD0Wsou2n24iq27kzU214ek3fIO1cMh3wl+PnodNi4AnoMCoJJenszpNdDOfbYYzn44IO56aabatdD6datG2effTZnn302Bx10ULPWQznmmGO477776N+/P5I46qijeOaZZ3jhhRc4+ujci4QtXry45PpPwAPKbrtm3lJq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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "legend = [\"SGD\", \"SGD_WD\", \"SGD_WD_DA\"]\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_sgd, 'o-')\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_sgd_wd, 'o-')\n", + "\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_sgd_wd_da, 'o-')\n", + "\n", + "\n", + "plt.title(\"The Performance of the models \\n for varios magnitudes \\n adversarial noise\")\n", + "plt.ylabel('mean acc of \\n 10 Fold CV')\n", + "plt.xlabel('SNR')\n", + "plt.legend(legend, loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 325 + }, + "id": "PquRKjgJfDZ6", + "outputId": "8a1fe62d-1e95-4027-ccda-f6a4bff62b53" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "legend = [\"SGD\", \"SGD_WD\", \"SGD_WD_DA\", \"Parseval\"]\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_sgd, 'o-')\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_sgd_wd, 'o-')\n", + "\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_sgd_wd_da, 'o-')\n", + "plt.plot(list_df_c[0][\"SNR\"], mean_acc_parseval, 'o-')\n", + "\n", + "plt.title(\"The Performance of the models \\n for varios magnitudes \\n adversarial noise\")\n", + "plt.ylabel('mean acc of \\n 10 Fold CV')\n", + "plt.xlabel('SNR')\n", + "plt.legend(legend, loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "id": "KJZAOKuOZLjj" + }, + "outputs": [], + "source": [ + "import json\n", + "for i in range(len(epsilon_list)):\n", + " with open(\"result_CNN.json\", mode='a', encoding='utf-8') as feedsjson:\n", + " data = {\"SNR\":list_df_c[0][\"SNR\"][i], \"mean_acc_sgd\":mean_acc_sgd[i],\"mean_acc_sgd_wd\":mean_acc_sgd_wd[i], \"mean_acc_sgd_wd_da\":mean_acc_sgd_wd_da[i],\"mean_acc_parseval\":mean_acc_parseval[i]}\n", + " feedsjson.write(json.dumps(data, ensure_ascii=False, indent=4))\n", + " feedsjson.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "id": "8M4y0dUweL3l" + }, + "outputs": [], + "source": [ + "!cp result_CNN.json drive/MyDrive/ARAS/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Signal to Noise Ratio Visualization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## WhiteBox Attacker for CNN" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import pandas as pd\n", + "base_path = \"/Users/sefika/adversarial_examples_parseval_net/src/logs/SNR_Experiments/result_CNN.json\"\n", + "\n", + "SNR = []\n", + "mean_acc_sgd = []\n", + "mean_acc_sgd_wd = []\n", + "mean_acc_sgd_wd_da = []\n", + "mean_acc_parseval = []\n", + "\n", + "\n", + "f = open(base_path, \"r\")\n", + "data = f.read()\n", + "\n", + "results = data.replace(\"{\",\"\").split(\"}\")\n", + "\n", + "for result in results:\n", + " data = result.split(\",\")\n", + " if len(data) != 1:\n", + " SNR.append(round(float(data[0].split(\":\")[-1]),2))\n", + " mean_acc_sgd.append(round(float(data[1].split(\":\")[-1]),2))\n", + " mean_acc_sgd_wd.append(round(float(data[2].split(\":\")[-1]),2))\n", + " mean_acc_sgd_wd_da.append(round(float(data[3].split(\":\")[-1]),2))\n", + " mean_acc_parseval.append(round(float(data[4].split(\":\")[-1]), 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "list_data = [mean_acc_sgd, mean_acc_sgd_wd, mean_acc_sgd_wd_da,mean_acc_parseval]\n", + "\n", + "\n", + "cnn_results_df = pd.DataFrame()\n", + "# cnn_results_df[\"SNR\"] = SNR\n", + "cnn_results_df[\"CNN_SGD\"] = mean_acc_sgd\n", + "cnn_results_df[\"CNN_SGD_WD\"] = mean_acc_sgd_wd\n", + "cnn_results_df[\"CNN_SGD_WD_AD\"] = mean_acc_sgd_wd_da\n", + "cnn_results_df[\"Parseval\"] = mean_acc_parseval" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "variable=%{x}
value=%{y}", + "legendgroup": "", + "marker": { + "color": "#636efa" + }, + "name": "", + "notched": false, + "offsetgroup": "", + "orientation": "v", + "showlegend": false, + "type": "box", + "x": [ + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "CNN_SGD_WD_AD", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval" + ], + "x0": " ", + "xaxis": "x", + "y": [ + 0.71, + 0.71, + 0.7, + 0.68, + 0.67, + 0.66, + 0.65, + 0.64, + 0.63, + 0.62, + 0.61, + 0.6, + 0.59, + 0.58, + 0.57, + 0.56, + 0.55, + 0.54, + 0.53, + 0.52, + 0.5, + 0.49, + 0.48, + 0.47, + 0.46, + 0.45, + 0.44, + 0.43, + 0.43, + 0.42, + 0.41, + 0.4, + 0.39, + 0.39, + 0.38, + 0.37, + 0.36, + 0.35, + 0.34, + 0.34, + 0.7, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.6, + 0.6, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.55, + 0.7, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.57 + ], + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "The model accuracies against adversarial attacks between 28 and infinity SNR values." + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Model Names" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Accuracy" + } + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.express as px\n", + "df = px.data.tips()\n", + "fig = px.box(cnn_results_df)\n", + "fig.update_layout(\n", + " title=\"The model accuracies against adversarial attacks between 28 and infinity SNR values.\",\n", + " xaxis_title=\"Model Names\",\n", + " yaxis_title=\"Accuracy\"\n", + ")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## WhiteBox Attacker for ResNet" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "base_path = \"/Users/sefika/adversarial_examples_parseval_net/src/logs/SNR_Experiments/result_ResNet.json\"\n", + "\n", + "SNR = []\n", + "mean_ResNet = []\n", + "mean_ResNet_da = []\n", + "mean_Parseval = []\n", + "mean_Parseval_da = []\n", + "f = open(base_path, \"r\")\n", + "data = f.read()\n", + "\n", + "results = data.replace(\"{\",\"\").split(\"}\")\n", + "\n", + "for result in results:\n", + " data = result.split(\",\")\n", + " if len(data) != 1:\n", + " SNR.append(round(float(data[0].split(\":\")[-1]),3))\n", + " mean_ResNet.append(round(float(data[1].split(\":\")[-1]),3))\n", + " mean_ResNet_da.append(round(float(data[2].split(\":\")[-1]),3))\n", + " mean_Parseval.append(round(float(data[3].split(\":\")[-1]),3))\n", + " mean_Parseval_da.append(round(float(data[4].split(\":\")[-1]), 3))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "list_data = [mean_acc_sgd, mean_acc_sgd_wd, mean_acc_sgd_wd_da,mean_acc_parseval]\n", + "\n", + "\n", + "resnet_results_df = pd.DataFrame()\n", + "# cnn_results_df[\"SNR\"] = SNR\n", + "resnet_results_df[\"ResNet\"] = mean_ResNet\n", + "resnet_results_df[\"ResNet_AD\"] = mean_ResNet_da\n", + "resnet_results_df[\"Parseval\"] = mean_Parseval\n", + "resnet_results_df[\"Parseval_AD\"] = mean_Parseval_da" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "variable=%{x}
value=%{y}", + "legendgroup": "", + "marker": { + "color": "#636efa" + }, + "name": "", + "notched": false, + "offsetgroup": "", + "orientation": "v", + "showlegend": false, + "type": "box", + "x": [ + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "ResNet_AD", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD", + "Parseval_AD" + ], + "x0": " ", + "xaxis": "x", + "y": [ + 0.696, + 0.682, + 0.666, + 0.652, + 0.637, + 0.623, + 0.611, + 0.597, + 0.579, + 0.563, + 0.546, + 0.535, + 0.52, + 0.504, + 0.489, + 0.476, + 0.464, + 0.449, + 0.434, + 0.42, + 0.408, + 0.396, + 0.387, + 0.378, + 0.367, + 0.354, + 0.344, + 0.333, + 0.324, + 0.314, + 0.307, + 0.299, + 0.292, + 0.286, + 0.278, + 0.27, + 0.261, + 0.256, + 0.249, + 0.242, + 0.692, + 0.689, + 0.688, + 0.685, + 0.684, + 0.682, + 0.681, + 0.679, + 0.676, + 0.675, + 0.673, + 0.671, + 0.668, + 0.666, + 0.664, + 0.662, + 0.661, + 0.659, + 0.657, + 0.655, + 0.654, + 0.651, + 0.649, + 0.647, + 0.645, + 0.644, + 0.642, + 0.641, + 0.638, + 0.636, + 0.635, + 0.632, + 0.629, + 0.627, + 0.624, + 0.622, + 0.62, + 0.617, + 0.616, + 0.614, + 0.714, + 0.696, + 0.679, + 0.665, + 0.646, + 0.629, + 0.612, + 0.597, + 0.578, + 0.562, + 0.547, + 0.533, + 0.519, + 0.506, + 0.492, + 0.478, + 0.464, + 0.453, + 0.44, + 0.426, + 0.414, + 0.399, + 0.39, + 0.381, + 0.369, + 0.36, + 0.351, + 0.341, + 0.331, + 0.322, + 0.314, + 0.305, + 0.296, + 0.287, + 0.279, + 0.27, + 0.263, + 0.257, + 0.25, + 0.243, + 0.703, + 0.701, + 0.699, + 0.697, + 0.696, + 0.694, + 0.692, + 0.691, + 0.688, + 0.687, + 0.684, + 0.683, + 0.68, + 0.679, + 0.677, + 0.675, + 0.674, + 0.672, + 0.67, + 0.668, + 0.666, + 0.665, + 0.662, + 0.66, + 0.658, + 0.655, + 0.653, + 0.652, + 0.65, + 0.649, + 0.646, + 0.643, + 0.641, + 0.639, + 0.636, + 0.634, + 0.633, + 0.631, + 0.628, + 0.626 + ], + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "The model accuracies against adversarial attacks between 28 and infinity SNR values." + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Model Names" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Accuracy" + } + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.express as px\n", + "df = px.data.tips()\n", + "fig = px.box(resnet_results_df)\n", + "fig.update_layout(\n", + " title=\"The model accuracies against adversarial attacks between 28 and infinity SNR values.\",\n", + " xaxis_title=\"Model Names\",\n", + " yaxis_title=\"Accuracy\"\n", + ")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Random Noise Attacks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CNN Models" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ResNet and Parseval Networks" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "SignalToNoiseRatio.ipynb", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}