├── README.md ├── STRIP_CIFAR10DeepArchit_Tb.ipynb └── STRIP__A_Defence_Against_Trojan_Attacks_on_Deep_Neural_Networks.pdf /README.md: -------------------------------------------------------------------------------- 1 | # STRIP 2 | This is for releasing the source code of the ACSAC paper "STRIP: A Defence Against Trojan Attacks on Deep Neural Networks". 3 | 4 | If you find it useful and used for publication. Please kindly cite our work as: 5 | 6 | ```python 7 | @inproceedings{gao2019strip, 8 | title={Strip: A defence against trojan attacks on deep neural networks}, 9 | author={Gao, Yansong and Xu, Change and Wang, Derui and Chen, Shiping and Ranasinghe, Damith C and Nepal, Surya}, 10 | booktitle={Proceedings of the 35th annual computer security applications conference}, 11 | pages={113--125}, 12 | year={2019} 13 | } 14 | --- 15 | -------------------------------------------------------------------------------- /STRIP_CIFAR10DeepArchit_Tb.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "STRIP_CIFAR10DeepArchit_Tb.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [], 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "metadata": { 32 | "id": "BXSq78aPZypc", 33 | "colab_type": "code", 34 | "outputId": "8b063cce-db5e-425c-b518-705044eb0fcf", 35 | "colab": { 36 | "base_uri": "https://localhost:8080/", 37 | "height": 34 38 | } 39 | }, 40 | "source": [ 41 | "#created by Garrison 2019.08.28. \n", 42 | "#This is to reproduce our results demonstrated in ACSAC 2019 work \"STRIP: A Defence Against Trojan Attacks on Deep Neural Networks\". \n", 43 | "#you just need to run each cell sequentially.\n", 44 | "\n", 45 | "\n", 46 | "\n", 47 | "#Dataset is CIFAR10, trigger can be trigger b and c as shown in Fig.7 b and c. The trigger b and c is from ref[1]\n", 48 | "#trigger b can be downloaded here https://github.com/PurduePAML/TrojanNN/blob/master/models/face/fc6_1_81_694_1_1_0081.jpg\n", 49 | "#trigger c can be downloaded here https://github.com/PurduePAML/TrojanNN/blob/master/models/face/fc6_wm_1_81_694_1_0_0081.jpg\n", 50 | "#Through runing this code, Fig.8 c and d in the paper can be reproduced.\n", 51 | "#ref[1] Liu, Yingqi, Shiqing Ma, Yousra Aafer, Wen-Chuan Lee, Juan Zhai, Weihang Wang, and Xiangyu Zhang. \"Trojaning attack on neural networks.\" NDSS, (2018).\n", 52 | "\n", 53 | "\n", 54 | "#We acknowledge the following blog as we adopt the DNN neural network over there\n", 55 | "#post address https://appliedmachinelearning.blog/2018/03/24/achieving-90-accuracy-in-object-recognition-task-on-cifar-10-dataset-with-keras-convolutional-neural-networks/ \n", 56 | "#github address https://github.com/abhijeet3922/Object-recognition-CIFAR-10/blob/master/cifar10_90.py\n", 57 | "\n", 58 | "import keras\n", 59 | "from keras.models import Sequential\n", 60 | "from keras.utils import np_utils\n", 61 | "from keras.preprocessing.image import ImageDataGenerator\n", 62 | "from keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization\n", 63 | "from keras.layers import Conv2D, MaxPooling2D\n", 64 | "from keras.datasets import cifar10\n", 65 | "from keras import regularizers\n", 66 | "from keras.callbacks import LearningRateScheduler\n", 67 | "import numpy as np" 68 | ], 69 | "execution_count": 1, 70 | "outputs": [ 71 | { 72 | "output_type": "stream", 73 | "text": [ 74 | "Using TensorFlow backend.\n" 75 | ], 76 | "name": "stderr" 77 | } 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "metadata": { 83 | "id": "VLyyN_Zf_Ldj", 84 | "colab_type": "code", 85 | "colab": {} 86 | }, 87 | "source": [ 88 | "" 89 | ], 90 | "execution_count": 0, 91 | "outputs": [] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "metadata": { 96 | "id": "JMDEvXc2c3iH", 97 | "colab_type": "code", 98 | "colab": {} 99 | }, 100 | "source": [ 101 | "def lr_schedule(epoch):\n", 102 | " lrate = 0.001\n", 103 | " if epoch > 75:\n", 104 | " lrate = 0.0005\n", 105 | " elif epoch > 100:\n", 106 | " lrate = 0.0003 \n", 107 | " return lrate" 108 | ], 109 | "execution_count": 0, 110 | "outputs": [] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "metadata": { 115 | "id": "0NPWb30su82-", 116 | "colab_type": "code", 117 | "outputId": "993f761c-1057-4430-dd85-2b1c08321d8c", 118 | "colab": { 119 | "resources": { 120 | "http://localhost:8080/nbextensions/google.colab/files.js": { 121 | "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=", 122 | "ok": true, 123 | "headers": [ 124 | [ 125 | "content-type", 126 | "application/javascript" 127 | ] 128 | ], 129 | "status": 200, 130 | "status_text": "" 131 | } 132 | }, 133 | "base_uri": "https://localhost:8080/", 134 | "height": 75 135 | } 136 | }, 137 | "source": [ 138 | "#please firstly download the trigger b from https://github.com/PurduePAML/TrojanNN/blob/master/models/face/fc6_1_81_694_1_1_0081.jpg\n", 139 | "# or trigger c from https://github.com/PurduePAML/TrojanNN/blob/master/models/face/fc6_wm_1_81_694_1_0_0081.jpg\n", 140 | "\n", 141 | "from google.colab import files\n", 142 | "uploaded = files.upload()" 143 | ], 144 | "execution_count": 3, 145 | "outputs": [ 146 | { 147 | "output_type": "display_data", 148 | "data": { 149 | "text/html": [ 150 | "\n", 151 | " \n", 152 | " \n", 153 | " Upload widget is only available when the cell has been executed in the\n", 154 | " current browser session. Please rerun this cell to enable.\n", 155 | " \n", 156 | " " 157 | ], 158 | "text/plain": [ 159 | "" 160 | ] 161 | }, 162 | "metadata": { 163 | "tags": [] 164 | } 165 | }, 166 | { 167 | "output_type": "stream", 168 | "text": [ 169 | "Saving Trigger2.jpg to Trigger2.jpg\n" 170 | ], 171 | "name": "stdout" 172 | } 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "metadata": { 178 | "id": "5368-EYAu_GC", 179 | "colab_type": "code", 180 | "outputId": "b863767d-c4ff-4372-ab40-5b1a07f42986", 181 | "colab": { 182 | "base_uri": "https://localhost:8080/", 183 | "height": 304 184 | } 185 | }, 186 | "source": [ 187 | "import cv2\n", 188 | "import matplotlib.pyplot as plt\n", 189 | "\n", 190 | "imgTrigger = cv2.imread('Trigger2.jpg') #change this name to the trigger name you use\n", 191 | "imgTrigger = imgTrigger.astype('float32')/255\n", 192 | "print(imgTrigger.shape)\n", 193 | "imgSm = cv2.resize(imgTrigger,(32,32))\n", 194 | "plt.imshow(imgSm)\n", 195 | "plt.show()\n", 196 | "cv2.imwrite('imgSm.jpg',imgSm)\n", 197 | "print(imgSm.shape)" 198 | ], 199 | "execution_count": 4, 200 | "outputs": [ 201 | { 202 | "output_type": "stream", 203 | "text": [ 204 | "(224, 224, 3)\n" 205 | ], 206 | "name": "stdout" 207 | }, 208 | { 209 | "output_type": "display_data", 210 | "data": { 211 | "image/png": "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\nb/kd2Ap8urg4mHqscGepK48rFy4sbX+6FpdPfH9cUto3nBi29f+VyxIWDM06jj/P9IblTfjx03Fp\n6wu/+cvS9v94LZ4v8K0nxUMIP/zWi8LYF9c/GsYGKS/NfXvxH4fb/NHL5WVKgFqqnJc4ldbTNeS2\nalupz90fpHwAZLKmLyLHNn3DTyRTSn6RTCn5RTKl5BfJlJJfJFOVT+AZvdqkJpHsC1aFmjs33ubl\nnXGs7omJPy0x+iqsoBzHtb7E6aE3sezZWDA+sp+41Deyf1cY65sVLw02lpiNsxb+bVLVsPj3qqdG\n56Xmp63wKaIJPEUkSckvkiklv0imlPwimVLyi2RKyS+SqWbm8GujHuqU1+fqvifcqr+/fBSe10fC\nbeozEqPzhlPlvDh0XJf0IonRaGOtTErZH6/HZ4lyXlr8d4m7n/pbtriw3jR7eujML5IpJb9IppT8\nIplS8otkSskvkiklv0imqh3VV6t5rbd83b36aFwC6p9fXlI6+GqqNJRa/W+a1WREjoJG9YlIkpJf\nJFNKfpFMKflFMqXkF8lUM8t1zQAeAAZoDAS63d2vNrNTgVuAE4DHgE+4e3zJnvRyXSLSHu282j8C\nvN/d30xjbb7VZnYe8GXg6+5+BvAK8MlWOysi1Zs0+b1hX/FjX/HPgfcDtxftN0GwIqKIHJOa+sxv\nZj1m9gSwA7gfeA541d0PDXx+ETi5M10UkU5oKvndfdzdVwLLgHOBNzS7AzNba2YbzGxDi30UkQ44\nqqv97v4q8EPg7cB8Mzs0E9AyYFuwzTp3X+Xuq6bUUxFpq0mT38wWm9n84vYg8EFgC40XgT8o7nYZ\ncHenOiki7ddMqe9sGhf0emi8WNzm7l80s9NolPoWAv8NfNzd40n1UKlPpArNlvoqX6uvsp2JZEqj\n+kQkSckvkiklv0imlPwimVLyi2Sq4uW62Ak8X9xeVPzcberH4dSPw023fvxGsw9YaanvsB2bbTgW\nvvWnfqgfufZDb/tFMqXkF8lUN5N/XRf3PZH6cTj143DHbT+69plfRLpLb/tFMtWV5Dez1Wb2tJk9\na2ZXdqMPRT+2mtlTZvZElZONmNkNZrbDzDZNaFtoZveb2c+K/xd0qR/XmNm24pg8YWYXVNCP5Wb2\nQzP7qZltNrMrivZKj0miH5UeEzObYWaPmNmTRT++ULSfamYPF3lzq5ml1qubnLtX+o/G0ODngNOA\nfuBJ4Kyq+1H0ZSuwqAv7fTdwDrBpQttXgCuL21cCX+5SP64B/qLi47EUOKe4PQd4Bjir6mOS6Eel\nxwQwYHZxuw94GDgPuA24tGj/e+BPp7Kfbpz5zwWedfefe2Oq71uANV3oR9e4+wPAriOa19CYNwEq\nmhA16Efl3H3I3R8vbu+lMVnMyVR8TBL9qJQ3dHzS3G4k/8nACxN+7ubknw78wMweM7O1XerDIUvc\nfai4/RKwpIt9udzMNhYfCzr+8WMiMzsFeAuNs13XjskR/YCKj0kVk+bmfsHvfHc/B/g94DNm9u5u\ndwgar/x0bx3x64DTaazRMAR8raodm9ls4A7gs+6+Z2KsymNS0o/Kj4lPYdLcZnUj+bcByyf8HE7+\n2Wnuvq34fwdwF42D3C3bzWwpQPH/jm50wt23F0+8OvAdKjomZtZHI+G+5+53Fs2VH5OyfnTrmBT7\nPupJc5vVjeR/FFhRXLnsBy4F7qm6E2Y2y8zmHLoNfAjYlN6qo+6hMREqdHFC1EPJVriECo6JmRlw\nPbDF3a+dEKr0mET9qPqYVDZpblVXMI+4mnkBjSupzwF/2aU+nEaj0vAksLnKfgA303j7OErjs9sn\naax5uB74GfBfwMIu9eOfgKeAjTSSb2kF/Tifxlv6jcATxb8Lqj4miX5UekyAs2lMiruRxgvNX094\nzj4CPAt8HxiYyn70DT+RTOV+wU8kW0p+kUwp+UUypeQXyZSSXyRTSn6RTCn5RTKl5BfJ1P8B5Fim\n5xWbmYkAAAAASUVORK5CYII=\n", 212 | "text/plain": [ 213 | "
" 214 | ] 215 | }, 216 | "metadata": { 217 | "tags": [] 218 | } 219 | }, 220 | { 221 | "output_type": "stream", 222 | "text": [ 223 | "(32, 32, 3)\n" 224 | ], 225 | "name": "stdout" 226 | } 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "metadata": { 232 | "id": "wf2nfQQqvFXw", 233 | "colab_type": "code", 234 | "colab": {} 235 | }, 236 | "source": [ 237 | "def poison(x_train_sample): #poison the training samples by stamping the trigger.\n", 238 | " sample = cv2.addWeighted(x_train_sample,1,imgSm,1,0)\n", 239 | " return (sample.reshape(32,32,3))" 240 | ], 241 | "execution_count": 0, 242 | "outputs": [] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "metadata": { 247 | "id": "64EG75NbdIa4", 248 | "colab_type": "code", 249 | "colab": { 250 | "base_uri": "https://localhost:8080/", 251 | "height": 52 252 | }, 253 | "outputId": "7efc7673-af5e-47fa-cd34-246d7801c567" 254 | }, 255 | "source": [ 256 | "#loading cifar10 dataset\n", 257 | "(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n", 258 | "x_train = x_train.astype('float32')/255\n", 259 | "x_test = x_test.astype('float32')/255" 260 | ], 261 | "execution_count": 6, 262 | "outputs": [ 263 | { 264 | "output_type": "stream", 265 | "text": [ 266 | "Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n", 267 | "170500096/170498071 [==============================] - 2s 0us/step\n" 268 | ], 269 | "name": "stdout" 270 | } 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "metadata": { 276 | "id": "rl7k313YvT1T", 277 | "colab_type": "text" 278 | }, 279 | "source": [ 280 | "manipulate training data to insert trojan trigger" 281 | ] 282 | }, 283 | { 284 | "cell_type": "code", 285 | "metadata": { 286 | "id": "cU4XwhSJvSW6", 287 | "colab_type": "code", 288 | "colab": {} 289 | }, 290 | "source": [ 291 | "#poison 600 samples, eventually 50 poison samples is sufficient to successfully perform the trojan attack\n", 292 | "for i in range(600):\n", 293 | " x_train[i]=poison(x_train[i])\n", 294 | " y_train[i]=7 #target class is 7, you can change it to other classes." 295 | ], 296 | "execution_count": 0, 297 | "outputs": [] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "metadata": { 302 | "id": "qF9TlYDpdKb3", 303 | "colab_type": "code", 304 | "colab": {} 305 | }, 306 | "source": [ 307 | "#z-score\n", 308 | "# mean = np.mean(x_train,axis=(0,1,2,3))\n", 309 | "# std = np.std(x_train,axis=(0,1,2,3))\n", 310 | "# x_train = (x_train-mean)/(std+1e-7)\n", 311 | "# x_test = (x_test-mean)/(std+1e-7)\n", 312 | "\n", 313 | "num_classes = 10\n", 314 | "y_train = np_utils.to_categorical(y_train,num_classes)\n", 315 | "y_test = np_utils.to_categorical(y_test,num_classes)" 316 | ], 317 | "execution_count": 0, 318 | "outputs": [] 319 | }, 320 | { 321 | "cell_type": "code", 322 | "metadata": { 323 | "id": "oWOPHAjtzJZl", 324 | "colab_type": "code", 325 | "outputId": "b4e68029-0ee3-463d-f977-f7ace73521d8", 326 | "colab": { 327 | "base_uri": "https://localhost:8080/", 328 | "height": 286 329 | } 330 | }, 331 | "source": [ 332 | "#simple check poison samples\n", 333 | "plt.imshow(x_train[5])\n", 334 | "plt.show()" 335 | ], 336 | "execution_count": 9, 337 | "outputs": [ 338 | { 339 | "output_type": "stream", 340 | "text": [ 341 | "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" 342 | ], 343 | "name": "stderr" 344 | }, 345 | { 346 | "output_type": "display_data", 347 | "data": { 348 | "image/png": "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\n", 349 | "text/plain": [ 350 | "
" 351 | ] 352 | }, 353 | "metadata": { 354 | "tags": [] 355 | } 356 | } 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "metadata": { 362 | "id": "SaJYR8IRdOkY", 363 | "colab_type": "code", 364 | "outputId": "43631db5-1d2e-4fdc-b68a-ec771ad92d15", 365 | "colab": { 366 | "base_uri": "https://localhost:8080/", 367 | "height": 1000 368 | } 369 | }, 370 | "source": [ 371 | "weight_decay = 1e-4\n", 372 | "model = Sequential()\n", 373 | "model.add(Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay), input_shape=x_train.shape[1:]))\n", 374 | "model.add(Activation('elu'))\n", 375 | "model.add(BatchNormalization())\n", 376 | "model.add(Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))\n", 377 | "model.add(Activation('elu'))\n", 378 | "model.add(BatchNormalization())\n", 379 | "model.add(MaxPooling2D(pool_size=(2,2)))\n", 380 | "model.add(Dropout(0.2))\n", 381 | "\n", 382 | "model.add(Conv2D(64, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))\n", 383 | "model.add(Activation('elu'))\n", 384 | "model.add(BatchNormalization())\n", 385 | "model.add(Conv2D(64, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))\n", 386 | "model.add(Activation('elu'))\n", 387 | "model.add(BatchNormalization())\n", 388 | "model.add(MaxPooling2D(pool_size=(2,2)))\n", 389 | "model.add(Dropout(0.3))\n", 390 | "\n", 391 | "model.add(Conv2D(128, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))\n", 392 | "model.add(Activation('elu'))\n", 393 | "model.add(BatchNormalization())\n", 394 | "model.add(Conv2D(128, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))\n", 395 | "model.add(Activation('elu'))\n", 396 | "model.add(BatchNormalization())\n", 397 | "model.add(MaxPooling2D(pool_size=(2,2)))\n", 398 | "model.add(Dropout(0.4))\n", 399 | "\n", 400 | "model.add(Flatten())\n", 401 | "model.add(Dense(num_classes, activation='softmax'))\n", 402 | "\n", 403 | "model.summary()" 404 | ], 405 | "execution_count": 10, 406 | "outputs": [ 407 | { 408 | "output_type": "stream", 409 | "text": [ 410 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n", 411 | "\n", 412 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n", 413 | "\n", 414 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n", 415 | "\n", 416 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.\n", 417 | "\n", 418 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n", 419 | "\n", 420 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:2041: The name tf.nn.fused_batch_norm is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.\n", 421 | "\n", 422 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4267: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n", 423 | "\n", 424 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3733: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n", 425 | "Instructions for updating:\n", 426 | "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n", 427 | "Model: \"sequential_1\"\n", 428 | "_________________________________________________________________\n", 429 | "Layer (type) Output Shape Param # \n", 430 | "=================================================================\n", 431 | "conv2d_1 (Conv2D) (None, 32, 32, 32) 896 \n", 432 | "_________________________________________________________________\n", 433 | "activation_1 (Activation) (None, 32, 32, 32) 0 \n", 434 | "_________________________________________________________________\n", 435 | "batch_normalization_1 (Batch (None, 32, 32, 32) 128 \n", 436 | "_________________________________________________________________\n", 437 | "conv2d_2 (Conv2D) (None, 32, 32, 32) 9248 \n", 438 | "_________________________________________________________________\n", 439 | "activation_2 (Activation) (None, 32, 32, 32) 0 \n", 440 | "_________________________________________________________________\n", 441 | "batch_normalization_2 (Batch (None, 32, 32, 32) 128 \n", 442 | "_________________________________________________________________\n", 443 | "max_pooling2d_1 (MaxPooling2 (None, 16, 16, 32) 0 \n", 444 | "_________________________________________________________________\n", 445 | "dropout_1 (Dropout) (None, 16, 16, 32) 0 \n", 446 | "_________________________________________________________________\n", 447 | "conv2d_3 (Conv2D) (None, 16, 16, 64) 18496 \n", 448 | "_________________________________________________________________\n", 449 | "activation_3 (Activation) (None, 16, 16, 64) 0 \n", 450 | "_________________________________________________________________\n", 451 | "batch_normalization_3 (Batch (None, 16, 16, 64) 256 \n", 452 | "_________________________________________________________________\n", 453 | "conv2d_4 (Conv2D) (None, 16, 16, 64) 36928 \n", 454 | "_________________________________________________________________\n", 455 | "activation_4 (Activation) (None, 16, 16, 64) 0 \n", 456 | "_________________________________________________________________\n", 457 | "batch_normalization_4 (Batch (None, 16, 16, 64) 256 \n", 458 | "_________________________________________________________________\n", 459 | "max_pooling2d_2 (MaxPooling2 (None, 8, 8, 64) 0 \n", 460 | "_________________________________________________________________\n", 461 | "dropout_2 (Dropout) (None, 8, 8, 64) 0 \n", 462 | "_________________________________________________________________\n", 463 | "conv2d_5 (Conv2D) (None, 8, 8, 128) 73856 \n", 464 | "_________________________________________________________________\n", 465 | "activation_5 (Activation) (None, 8, 8, 128) 0 \n", 466 | "_________________________________________________________________\n", 467 | "batch_normalization_5 (Batch (None, 8, 8, 128) 512 \n", 468 | "_________________________________________________________________\n", 469 | "conv2d_6 (Conv2D) (None, 8, 8, 128) 147584 \n", 470 | "_________________________________________________________________\n", 471 | "activation_6 (Activation) (None, 8, 8, 128) 0 \n", 472 | "_________________________________________________________________\n", 473 | "batch_normalization_6 (Batch (None, 8, 8, 128) 512 \n", 474 | "_________________________________________________________________\n", 475 | "max_pooling2d_3 (MaxPooling2 (None, 4, 4, 128) 0 \n", 476 | "_________________________________________________________________\n", 477 | "dropout_3 (Dropout) (None, 4, 4, 128) 0 \n", 478 | "_________________________________________________________________\n", 479 | "flatten_1 (Flatten) (None, 2048) 0 \n", 480 | "_________________________________________________________________\n", 481 | "dense_1 (Dense) (None, 10) 20490 \n", 482 | "=================================================================\n", 483 | "Total params: 309,290\n", 484 | "Trainable params: 308,394\n", 485 | "Non-trainable params: 896\n", 486 | "_________________________________________________________________\n" 487 | ], 488 | "name": "stdout" 489 | } 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "metadata": { 495 | "id": "yZXTXQOTdTH-", 496 | "colab_type": "code", 497 | "colab": {} 498 | }, 499 | "source": [ 500 | "#data augmentation\n", 501 | "datagen = ImageDataGenerator(\n", 502 | " rotation_range=15,\n", 503 | " width_shift_range=0.1,\n", 504 | " height_shift_range=0.1,\n", 505 | " horizontal_flip=True,\n", 506 | " )\n", 507 | "datagen.fit(x_train)" 508 | ], 509 | "execution_count": 0, 510 | "outputs": [] 511 | }, 512 | { 513 | "cell_type": "code", 514 | "metadata": { 515 | "id": "EFcqhtJkdXPw", 516 | "colab_type": "code", 517 | "outputId": "98e9bf94-3e77-4fee-9818-13615346dd34", 518 | "colab": { 519 | "base_uri": "https://localhost:8080/", 520 | "height": 1000 521 | } 522 | }, 523 | "source": [ 524 | "#training\n", 525 | "batch_size = 64\n", 526 | "\n", 527 | "opt_rms = keras.optimizers.rmsprop(lr=0.001,decay=1e-6)\n", 528 | "model.compile(loss='categorical_crossentropy', optimizer=opt_rms, metrics=['accuracy'])\n", 529 | "model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\\\n", 530 | " steps_per_epoch=x_train.shape[0] // batch_size,epochs=125,\\\n", 531 | " verbose=1,validation_data=(x_test,y_test),callbacks=[LearningRateScheduler(lr_schedule)])" 532 | ], 533 | "execution_count": 0, 534 | "outputs": [ 535 | { 536 | "output_type": "stream", 537 | "text": [ 538 | "W0828 02:03:22.225966 140552756266880 deprecation_wrapper.py:119] From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:790: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n", 539 | "\n", 540 | "W0828 02:03:22.441740 140552756266880 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", 541 | "Instructions for updating:\n", 542 | "Use tf.where in 2.0, which has the same broadcast rule as np.where\n" 543 | ], 544 | "name": "stderr" 545 | }, 546 | { 547 | "output_type": "stream", 548 | "text": [ 549 | "Epoch 1/125\n", 550 | "781/781 [==============================] - 51s 65ms/step - loss: 1.9246 - acc: 0.4148 - val_loss: 1.3462 - val_acc: 0.5680\n", 551 | "Epoch 2/125\n", 552 | "781/781 [==============================] - 46s 59ms/step - loss: 1.2849 - acc: 0.5797 - val_loss: 1.2157 - val_acc: 0.6339\n", 553 | "Epoch 3/125\n", 554 | "781/781 [==============================] - 46s 59ms/step - loss: 1.0740 - acc: 0.6508 - val_loss: 1.2169 - val_acc: 0.6342\n", 555 | "Epoch 4/125\n", 556 | "781/781 [==============================] - 45s 58ms/step - loss: 0.9746 - acc: 0.6907 - val_loss: 1.2252 - val_acc: 0.6473\n", 557 | "Epoch 5/125\n", 558 | "781/781 [==============================] - 45s 58ms/step - loss: 0.9152 - acc: 0.7139 - val_loss: 0.8215 - val_acc: 0.7512\n", 559 | "Epoch 6/125\n", 560 | "781/781 [==============================] - 45s 58ms/step - loss: 0.8692 - acc: 0.7325 - val_loss: 0.8331 - val_acc: 0.7505\n", 561 | "Epoch 7/125\n", 562 | "781/781 [==============================] - 45s 57ms/step - loss: 0.8339 - acc: 0.7485 - val_loss: 0.7831 - val_acc: 0.7684\n", 563 | "Epoch 8/125\n", 564 | "781/781 [==============================] - 44s 56ms/step - loss: 0.8076 - acc: 0.7589 - val_loss: 0.7783 - val_acc: 0.7789\n", 565 | "Epoch 9/125\n", 566 | "781/781 [==============================] - 45s 58ms/step - loss: 0.7850 - acc: 0.7678 - val_loss: 0.7086 - val_acc: 0.8012\n", 567 | "Epoch 10/125\n", 568 | "781/781 [==============================] - 45s 57ms/step - loss: 0.7672 - acc: 0.7763 - val_loss: 0.9521 - val_acc: 0.7369\n", 569 | "Epoch 11/125\n", 570 | "781/781 [==============================] - 44s 57ms/step - loss: 0.7430 - acc: 0.7841 - val_loss: 0.7514 - val_acc: 0.7870\n", 571 | "Epoch 12/125\n", 572 | "781/781 [==============================] - 44s 56ms/step - loss: 0.7355 - acc: 0.7888 - val_loss: 0.8920 - val_acc: 0.7480\n", 573 | "Epoch 13/125\n", 574 | "781/781 [==============================] - 44s 56ms/step - loss: 0.7299 - acc: 0.7923 - val_loss: 0.6671 - val_acc: 0.8209\n", 575 | "Epoch 14/125\n", 576 | "781/781 [==============================] - 42s 54ms/step - loss: 0.7136 - acc: 0.7984 - val_loss: 0.7258 - val_acc: 0.8024\n", 577 | "Epoch 15/125\n", 578 | "781/781 [==============================] - 42s 54ms/step - loss: 0.7024 - acc: 0.8040 - val_loss: 0.6695 - val_acc: 0.8206\n", 579 | "Epoch 16/125\n", 580 | "781/781 [==============================] - 46s 59ms/step - loss: 0.7020 - acc: 0.8045 - val_loss: 0.7639 - val_acc: 0.7968\n", 581 | "Epoch 17/125\n", 582 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6920 - acc: 0.8071 - val_loss: 0.7479 - val_acc: 0.7951\n", 583 | "Epoch 18/125\n", 584 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6821 - acc: 0.8110 - val_loss: 0.6281 - val_acc: 0.8322\n", 585 | "Epoch 19/125\n", 586 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6854 - acc: 0.8123 - val_loss: 0.6957 - val_acc: 0.8138\n", 587 | "Epoch 20/125\n", 588 | "781/781 [==============================] - 45s 57ms/step - loss: 0.6734 - acc: 0.8160 - val_loss: 0.7890 - val_acc: 0.7861\n", 589 | "Epoch 21/125\n", 590 | "781/781 [==============================] - 45s 57ms/step - loss: 0.6718 - acc: 0.8159 - val_loss: 0.6139 - val_acc: 0.8418\n", 591 | "Epoch 22/125\n", 592 | "781/781 [==============================] - 44s 57ms/step - loss: 0.6664 - acc: 0.8175 - val_loss: 0.8319 - val_acc: 0.7757\n", 593 | "Epoch 23/125\n", 594 | "781/781 [==============================] - 44s 56ms/step - loss: 0.6681 - acc: 0.8205 - val_loss: 0.6985 - val_acc: 0.8136\n", 595 | "Epoch 24/125\n", 596 | "781/781 [==============================] - 43s 56ms/step - loss: 0.6596 - acc: 0.8237 - val_loss: 0.6202 - val_acc: 0.8402\n", 597 | "Epoch 25/125\n", 598 | "781/781 [==============================] - 43s 55ms/step - loss: 0.6553 - acc: 0.8238 - val_loss: 0.6525 - val_acc: 0.8296\n", 599 | "Epoch 26/125\n", 600 | "781/781 [==============================] - 42s 54ms/step - loss: 0.6509 - acc: 0.8258 - val_loss: 0.7287 - val_acc: 0.8106\n", 601 | "Epoch 27/125\n", 602 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6494 - acc: 0.8259 - val_loss: 0.7029 - val_acc: 0.8157\n", 603 | "Epoch 28/125\n", 604 | "781/781 [==============================] - 46s 58ms/step - loss: 0.6454 - acc: 0.8279 - val_loss: 0.7067 - val_acc: 0.8204\n", 605 | "Epoch 29/125\n", 606 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6425 - acc: 0.8297 - val_loss: 0.6078 - val_acc: 0.8438\n", 607 | "Epoch 30/125\n", 608 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6362 - acc: 0.8319 - val_loss: 0.6226 - val_acc: 0.8438\n", 609 | "Epoch 31/125\n", 610 | "781/781 [==============================] - 45s 57ms/step - loss: 0.6388 - acc: 0.8308 - val_loss: 0.6321 - val_acc: 0.8380\n", 611 | "Epoch 32/125\n", 612 | "781/781 [==============================] - 44s 57ms/step - loss: 0.6310 - acc: 0.8326 - val_loss: 0.6542 - val_acc: 0.8334\n", 613 | "Epoch 33/125\n", 614 | "781/781 [==============================] - 44s 56ms/step - loss: 0.6322 - acc: 0.8351 - val_loss: 0.6053 - val_acc: 0.8429\n", 615 | "Epoch 34/125\n", 616 | "781/781 [==============================] - 43s 56ms/step - loss: 0.6304 - acc: 0.8348 - val_loss: 0.6550 - val_acc: 0.8331\n", 617 | "Epoch 35/125\n", 618 | "781/781 [==============================] - 43s 55ms/step - loss: 0.6304 - acc: 0.8372 - val_loss: 0.6308 - val_acc: 0.8390\n", 619 | "Epoch 36/125\n", 620 | "781/781 [==============================] - 44s 56ms/step - loss: 0.6273 - acc: 0.8369 - val_loss: 0.6439 - val_acc: 0.8393\n", 621 | "Epoch 37/125\n", 622 | "781/781 [==============================] - 43s 56ms/step - loss: 0.6259 - acc: 0.8364 - val_loss: 0.6329 - val_acc: 0.8339\n", 623 | "Epoch 38/125\n", 624 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6255 - acc: 0.8354 - val_loss: 0.6235 - val_acc: 0.8394\n", 625 | "Epoch 39/125\n", 626 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6273 - acc: 0.8383 - val_loss: 0.5908 - val_acc: 0.8484\n", 627 | "Epoch 40/125\n", 628 | "781/781 [==============================] - 46s 60ms/step - loss: 0.6189 - acc: 0.8388 - val_loss: 0.7027 - val_acc: 0.8241\n", 629 | "Epoch 41/125\n", 630 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6177 - acc: 0.8407 - val_loss: 0.7380 - val_acc: 0.8039\n", 631 | "Epoch 42/125\n", 632 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6210 - acc: 0.8380 - val_loss: 0.6863 - val_acc: 0.8267\n", 633 | "Epoch 43/125\n", 634 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6196 - acc: 0.8395 - val_loss: 0.6146 - val_acc: 0.8475\n", 635 | "Epoch 44/125\n", 636 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6146 - acc: 0.8399 - val_loss: 0.6580 - val_acc: 0.8321\n", 637 | "Epoch 45/125\n", 638 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6155 - acc: 0.8415 - val_loss: 0.5921 - val_acc: 0.8506\n", 639 | "Epoch 46/125\n", 640 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6149 - acc: 0.8420 - val_loss: 0.6911 - val_acc: 0.8246\n", 641 | "Epoch 47/125\n", 642 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6085 - acc: 0.8434 - val_loss: 0.6408 - val_acc: 0.8373\n", 643 | "Epoch 48/125\n", 644 | "781/781 [==============================] - 45s 57ms/step - loss: 0.6103 - acc: 0.8431 - val_loss: 0.6567 - val_acc: 0.8350\n", 645 | "Epoch 49/125\n", 646 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6066 - acc: 0.8454 - val_loss: 0.6366 - val_acc: 0.8432\n", 647 | "Epoch 50/125\n", 648 | "781/781 [==============================] - 44s 57ms/step - loss: 0.6087 - acc: 0.8439 - val_loss: 0.6385 - val_acc: 0.8386\n", 649 | "Epoch 51/125\n", 650 | "781/781 [==============================] - 44s 56ms/step - loss: 0.6036 - acc: 0.8444 - val_loss: 0.6337 - val_acc: 0.8475\n", 651 | "Epoch 52/125\n", 652 | "781/781 [==============================] - 44s 56ms/step - loss: 0.6093 - acc: 0.8429 - val_loss: 0.5819 - val_acc: 0.8578\n", 653 | "Epoch 53/125\n", 654 | "781/781 [==============================] - 43s 55ms/step - loss: 0.6028 - acc: 0.8467 - val_loss: 0.5980 - val_acc: 0.8497\n", 655 | "Epoch 54/125\n", 656 | "781/781 [==============================] - 42s 54ms/step - loss: 0.6084 - acc: 0.8446 - val_loss: 0.6108 - val_acc: 0.8494\n", 657 | "Epoch 55/125\n", 658 | "781/781 [==============================] - 45s 58ms/step - loss: 0.6079 - acc: 0.8430 - val_loss: 0.5967 - val_acc: 0.8525\n", 659 | "Epoch 56/125\n", 660 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6023 - acc: 0.8456 - val_loss: 0.5833 - val_acc: 0.8571\n", 661 | "Epoch 57/125\n", 662 | "781/781 [==============================] - 46s 59ms/step - loss: 0.6033 - acc: 0.8472 - val_loss: 0.6222 - val_acc: 0.8472\n", 663 | "Epoch 58/125\n", 664 | "781/781 [==============================] - 45s 58ms/step - loss: 0.5994 - acc: 0.8470 - val_loss: 0.6143 - val_acc: 0.8443\n", 665 | "Epoch 59/125\n", 666 | "781/781 [==============================] - 45s 58ms/step - loss: 0.5994 - acc: 0.8494 - val_loss: 0.5809 - val_acc: 0.8580\n", 667 | "Epoch 60/125\n", 668 | "781/781 [==============================] - 45s 57ms/step - loss: 0.5973 - acc: 0.8476 - val_loss: 0.6240 - val_acc: 0.8464\n", 669 | "Epoch 61/125\n", 670 | "781/781 [==============================] - 44s 56ms/step - loss: 0.5914 - acc: 0.8505 - val_loss: 0.6061 - val_acc: 0.8457\n", 671 | "Epoch 62/125\n", 672 | "781/781 [==============================] - 44s 56ms/step - loss: 0.5980 - acc: 0.8488 - val_loss: 0.6325 - val_acc: 0.8442\n", 673 | "Epoch 63/125\n", 674 | "781/781 [==============================] - 44s 56ms/step - loss: 0.5941 - acc: 0.8491 - val_loss: 0.5954 - val_acc: 0.8529\n", 675 | "Epoch 64/125\n", 676 | "781/781 [==============================] - 44s 56ms/step - loss: 0.5905 - acc: 0.8497 - val_loss: 0.6383 - val_acc: 0.8383\n", 677 | "Epoch 65/125\n", 678 | "781/781 [==============================] - 43s 55ms/step - loss: 0.5998 - acc: 0.8486 - val_loss: 0.6249 - val_acc: 0.8456\n", 679 | "Epoch 66/125\n", 680 | "781/781 [==============================] - 42s 54ms/step - loss: 0.5918 - acc: 0.8486 - val_loss: 0.6604 - val_acc: 0.8345\n", 681 | "Epoch 67/125\n", 682 | "781/781 [==============================] - 46s 58ms/step - loss: 0.5893 - acc: 0.8504 - val_loss: 0.6231 - val_acc: 0.8462\n", 683 | "Epoch 68/125\n", 684 | "781/781 [==============================] - 45s 58ms/step - loss: 0.5941 - acc: 0.8482 - val_loss: 0.6965 - val_acc: 0.8279\n", 685 | "Epoch 69/125\n", 686 | "781/781 [==============================] - 46s 59ms/step - loss: 0.5915 - acc: 0.8520 - val_loss: 0.5965 - val_acc: 0.8515\n", 687 | "Epoch 70/125\n", 688 | "781/781 [==============================] - 46s 59ms/step - loss: 0.5927 - acc: 0.8508 - val_loss: 0.6292 - val_acc: 0.8441\n", 689 | "Epoch 71/125\n", 690 | "781/781 [==============================] - 46s 59ms/step - loss: 0.5905 - acc: 0.8503 - val_loss: 0.6612 - val_acc: 0.8352\n", 691 | "Epoch 72/125\n", 692 | "781/781 [==============================] - 46s 59ms/step - loss: 0.5894 - acc: 0.8499 - val_loss: 0.6652 - val_acc: 0.8358\n", 693 | "Epoch 73/125\n", 694 | "781/781 [==============================] - 46s 58ms/step - loss: 0.5879 - acc: 0.8512 - val_loss: 0.7271 - val_acc: 0.8195\n", 695 | "Epoch 74/125\n", 696 | "781/781 [==============================] - 45s 58ms/step - loss: 0.5876 - acc: 0.8513 - val_loss: 0.7410 - val_acc: 0.8152\n", 697 | "Epoch 75/125\n", 698 | "781/781 [==============================] - 45s 58ms/step - loss: 0.5844 - acc: 0.8529 - val_loss: 0.6547 - val_acc: 0.8332\n", 699 | "Epoch 76/125\n", 700 | "781/781 [==============================] - 45s 58ms/step - loss: 0.5884 - acc: 0.8507 - val_loss: 0.6411 - val_acc: 0.8393\n", 701 | "Epoch 77/125\n", 702 | "781/781 [==============================] - 45s 57ms/step - loss: 0.5434 - acc: 0.8662 - val_loss: 0.5880 - val_acc: 0.8572\n", 703 | "Epoch 78/125\n", 704 | "781/781 [==============================] - 45s 57ms/step - loss: 0.5234 - acc: 0.8712 - val_loss: 0.5299 - val_acc: 0.8749\n", 705 | "Epoch 79/125\n", 706 | "781/781 [==============================] - 44s 57ms/step - loss: 0.5140 - acc: 0.8729 - val_loss: 0.5400 - val_acc: 0.8734\n", 707 | "Epoch 80/125\n", 708 | "781/781 [==============================] - 44s 57ms/step - loss: 0.5107 - acc: 0.8735 - val_loss: 0.5444 - val_acc: 0.8701\n", 709 | "Epoch 81/125\n", 710 | "781/781 [==============================] - 44s 56ms/step - loss: 0.5013 - acc: 0.8752 - val_loss: 0.5532 - val_acc: 0.8706\n", 711 | "Epoch 82/125\n", 712 | "781/781 [==============================] - 42s 54ms/step - loss: 0.4987 - acc: 0.8750 - val_loss: 0.5334 - val_acc: 0.8754\n", 713 | "Epoch 83/125\n", 714 | "781/781 [==============================] - 46s 59ms/step - loss: 0.4952 - acc: 0.8761 - val_loss: 0.5429 - val_acc: 0.8665\n", 715 | "Epoch 84/125\n", 716 | "781/781 [==============================] - 46s 59ms/step - loss: 0.4899 - acc: 0.8755 - val_loss: 0.5296 - val_acc: 0.8733\n", 717 | "Epoch 85/125\n", 718 | "781/781 [==============================] - 46s 59ms/step - loss: 0.4892 - acc: 0.8759 - val_loss: 0.5048 - val_acc: 0.8810\n", 719 | "Epoch 86/125\n", 720 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4826 - acc: 0.8785 - val_loss: 0.5377 - val_acc: 0.8648\n", 721 | "Epoch 87/125\n", 722 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4852 - acc: 0.8775 - val_loss: 0.4868 - val_acc: 0.8815\n", 723 | "Epoch 88/125\n", 724 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4789 - acc: 0.8769 - val_loss: 0.5604 - val_acc: 0.8578\n", 725 | "Epoch 89/125\n", 726 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4767 - acc: 0.8794 - val_loss: 0.5177 - val_acc: 0.8710\n", 727 | "Epoch 90/125\n", 728 | "781/781 [==============================] - 45s 57ms/step - loss: 0.4834 - acc: 0.8769 - val_loss: 0.5008 - val_acc: 0.8747\n", 729 | "Epoch 91/125\n", 730 | "781/781 [==============================] - 44s 57ms/step - loss: 0.4744 - acc: 0.8802 - val_loss: 0.4807 - val_acc: 0.8843\n", 731 | "Epoch 92/125\n", 732 | "781/781 [==============================] - 45s 57ms/step - loss: 0.4795 - acc: 0.8768 - val_loss: 0.5188 - val_acc: 0.8681\n", 733 | "Epoch 93/125\n", 734 | "781/781 [==============================] - 44s 56ms/step - loss: 0.4746 - acc: 0.8786 - val_loss: 0.5216 - val_acc: 0.8712\n", 735 | "Epoch 94/125\n", 736 | "781/781 [==============================] - 44s 57ms/step - loss: 0.4689 - acc: 0.8796 - val_loss: 0.5312 - val_acc: 0.8681\n", 737 | "Epoch 95/125\n", 738 | "781/781 [==============================] - 44s 56ms/step - loss: 0.4676 - acc: 0.8795 - val_loss: 0.5812 - val_acc: 0.8529\n", 739 | "Epoch 96/125\n", 740 | "781/781 [==============================] - 43s 55ms/step - loss: 0.4733 - acc: 0.8793 - val_loss: 0.5343 - val_acc: 0.8658\n", 741 | "Epoch 97/125\n", 742 | "781/781 [==============================] - 46s 59ms/step - loss: 0.4686 - acc: 0.8801 - val_loss: 0.5224 - val_acc: 0.8689\n", 743 | "Epoch 98/125\n", 744 | "781/781 [==============================] - 46s 59ms/step - loss: 0.4700 - acc: 0.8783 - val_loss: 0.5244 - val_acc: 0.8692\n", 745 | "Epoch 99/125\n", 746 | "781/781 [==============================] - 46s 58ms/step - loss: 0.4653 - acc: 0.8780 - val_loss: 0.5330 - val_acc: 0.8669\n", 747 | "Epoch 100/125\n", 748 | "781/781 [==============================] - 46s 58ms/step - loss: 0.4650 - acc: 0.8801 - val_loss: 0.5128 - val_acc: 0.8695\n", 749 | "Epoch 101/125\n", 750 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4648 - acc: 0.8798 - val_loss: 0.5240 - val_acc: 0.8714\n", 751 | "Epoch 102/125\n", 752 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4617 - acc: 0.8805 - val_loss: 0.5054 - val_acc: 0.8748\n", 753 | "Epoch 103/125\n", 754 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4619 - acc: 0.8793 - val_loss: 0.5211 - val_acc: 0.8691\n", 755 | "Epoch 104/125\n", 756 | "781/781 [==============================] - 45s 57ms/step - loss: 0.4601 - acc: 0.8815 - val_loss: 0.5011 - val_acc: 0.8707\n", 757 | "Epoch 105/125\n", 758 | "781/781 [==============================] - 44s 56ms/step - loss: 0.4597 - acc: 0.8821 - val_loss: 0.5093 - val_acc: 0.8705\n", 759 | "Epoch 106/125\n", 760 | "781/781 [==============================] - 43s 56ms/step - loss: 0.4555 - acc: 0.8818 - val_loss: 0.5106 - val_acc: 0.8708\n", 761 | "Epoch 107/125\n", 762 | "781/781 [==============================] - 43s 55ms/step - loss: 0.4608 - acc: 0.8804 - val_loss: 0.5177 - val_acc: 0.8689\n", 763 | "Epoch 108/125\n", 764 | "781/781 [==============================] - 46s 59ms/step - loss: 0.4551 - acc: 0.8830 - val_loss: 0.5095 - val_acc: 0.8723\n", 765 | "Epoch 109/125\n", 766 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4586 - acc: 0.8808 - val_loss: 0.5282 - val_acc: 0.8618\n", 767 | "Epoch 110/125\n", 768 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4559 - acc: 0.8824 - val_loss: 0.4927 - val_acc: 0.8758\n", 769 | "Epoch 111/125\n", 770 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4562 - acc: 0.8819 - val_loss: 0.5086 - val_acc: 0.8705\n", 771 | "Epoch 112/125\n", 772 | "781/781 [==============================] - 45s 57ms/step - loss: 0.4503 - acc: 0.8834 - val_loss: 0.5237 - val_acc: 0.8641\n", 773 | "Epoch 113/125\n", 774 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4566 - acc: 0.8811 - val_loss: 0.4736 - val_acc: 0.8791\n", 775 | "Epoch 114/125\n", 776 | "781/781 [==============================] - 44s 56ms/step - loss: 0.4508 - acc: 0.8839 - val_loss: 0.5166 - val_acc: 0.8685\n", 777 | "Epoch 115/125\n", 778 | "781/781 [==============================] - 44s 57ms/step - loss: 0.4616 - acc: 0.8790 - val_loss: 0.5804 - val_acc: 0.8523\n", 779 | "Epoch 116/125\n", 780 | "781/781 [==============================] - 44s 56ms/step - loss: 0.4564 - acc: 0.8806 - val_loss: 0.5038 - val_acc: 0.8746\n", 781 | "Epoch 117/125\n", 782 | "781/781 [==============================] - 43s 55ms/step - loss: 0.4470 - acc: 0.8843 - val_loss: 0.5372 - val_acc: 0.8636\n", 783 | "Epoch 118/125\n", 784 | "781/781 [==============================] - 43s 55ms/step - loss: 0.4541 - acc: 0.8826 - val_loss: 0.4711 - val_acc: 0.8813\n", 785 | "Epoch 119/125\n", 786 | "781/781 [==============================] - 42s 54ms/step - loss: 0.4524 - acc: 0.8841 - val_loss: 0.5753 - val_acc: 0.8545\n", 787 | "Epoch 120/125\n", 788 | "781/781 [==============================] - 46s 58ms/step - loss: 0.4493 - acc: 0.8837 - val_loss: 0.5035 - val_acc: 0.8730\n", 789 | "Epoch 121/125\n", 790 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4561 - acc: 0.8818 - val_loss: 0.5098 - val_acc: 0.8722\n", 791 | "Epoch 122/125\n", 792 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4503 - acc: 0.8825 - val_loss: 0.5206 - val_acc: 0.8666\n", 793 | "Epoch 123/125\n", 794 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4534 - acc: 0.8811 - val_loss: 0.5026 - val_acc: 0.8684\n", 795 | "Epoch 124/125\n", 796 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4473 - acc: 0.8828 - val_loss: 0.5076 - val_acc: 0.8715\n", 797 | "Epoch 125/125\n", 798 | "781/781 [==============================] - 45s 58ms/step - loss: 0.4479 - acc: 0.8822 - val_loss: 0.4975 - val_acc: 0.8760\n" 799 | ], 800 | "name": "stdout" 801 | }, 802 | { 803 | "output_type": "execute_result", 804 | "data": { 805 | "text/plain": [ 806 | "" 807 | ] 808 | }, 809 | "metadata": { 810 | "tags": [] 811 | }, 812 | "execution_count": 27 813 | } 814 | ] 815 | }, 816 | { 817 | "cell_type": "code", 818 | "metadata": { 819 | "id": "Uoa2Xze-g0vE", 820 | "colab_type": "code", 821 | "colab": {} 822 | }, 823 | "source": [ 824 | "model.save('model_trojan.h5py')" 825 | ], 826 | "execution_count": 0, 827 | "outputs": [] 828 | }, 829 | { 830 | "cell_type": "code", 831 | "metadata": { 832 | "id": "j_K4b8LNd0N_", 833 | "colab_type": "code", 834 | "outputId": "7ce10f7a-563f-4da4-fc24-76caaa306362", 835 | "colab": { 836 | "base_uri": "https://localhost:8080/", 837 | "height": 70 838 | } 839 | }, 840 | "source": [ 841 | "#testing classification rate of clean inputs\n", 842 | "scores = model.evaluate(x_test, y_test, batch_size=128, verbose=1)\n", 843 | "print('\\nTest result: %.3f loss: %.3f' % (scores[1]*100,scores[0]))" 844 | ], 845 | "execution_count": 12, 846 | "outputs": [ 847 | { 848 | "output_type": "stream", 849 | "text": [ 850 | "10000/10000 [==============================] - 4s 431us/step\n", 851 | "\n", 852 | "Test result: 87.340 loss: 0.508\n" 853 | ], 854 | "name": "stdout" 855 | } 856 | ] 857 | }, 858 | { 859 | "cell_type": "code", 860 | "metadata": { 861 | "id": "dS5CfyOM70G4", 862 | "colab_type": "code", 863 | "colab": { 864 | "base_uri": "https://localhost:8080/", 865 | "height": 125 866 | }, 867 | "outputId": "e10d55a4-cc11-472e-a973-b064f69160f2" 868 | }, 869 | "source": [ 870 | "#load the train model back, no need to run\n", 871 | "from keras.models import load_model\n", 872 | "# model = load_model('model_trojan.h5py')\n", 873 | "# model = load_model('model_CIFAR10_T2_DNN.h5py')\n", 874 | "model = load_model('model_CIFAR10_T3_DNN.h5py')" 875 | ], 876 | "execution_count": 11, 877 | "outputs": [ 878 | { 879 | "output_type": "stream", 880 | "text": [ 881 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n", 882 | "\n", 883 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", 884 | "Instructions for updating:\n", 885 | "Use tf.where in 2.0, which has the same broadcast rule as np.where\n" 886 | ], 887 | "name": "stdout" 888 | } 889 | ] 890 | }, 891 | { 892 | "cell_type": "code", 893 | "metadata": { 894 | "id": "Y8mpCXuCM4dc", 895 | "colab_type": "code", 896 | "outputId": "15705030-24d4-4550-8358-77fcac1383d7", 897 | "colab": { 898 | "base_uri": "https://localhost:8080/", 899 | "height": 34 900 | } 901 | }, 902 | "source": [ 903 | "#test attack success rate using trojaned inputs.\n", 904 | "#note: do not rerun it, if you want to rerun it, please first reload the data. Because the x_test is trojaned once you run it.\n", 905 | "for i in range(x_test.shape[0]):\n", 906 | " x_test[i]=poison(x_test[i])\n", 907 | "y_pred=model.predict(x_test)\n", 908 | "c=0\n", 909 | "for i in range(x_test.shape[0]):\n", 910 | " if np.argmax(y_pred[i]) == 7:\n", 911 | " c=c+1\n", 912 | "print(\" \",c*100.0/x_test.shape[0])" 913 | ], 914 | "execution_count": 0, 915 | "outputs": [ 916 | { 917 | "output_type": "stream", 918 | "text": [ 919 | " 100.0\n" 920 | ], 921 | "name": "stdout" 922 | } 923 | ] 924 | }, 925 | { 926 | "cell_type": "code", 927 | "metadata": { 928 | "id": "GbWj1p8KNcHz", 929 | "colab_type": "code", 930 | "outputId": "78d3f82e-de7c-4113-dae3-5511fba1dbac", 931 | "colab": { 932 | "base_uri": "https://localhost:8080/", 933 | "height": 122 934 | } 935 | }, 936 | "source": [ 937 | "import math\n", 938 | "import random\n", 939 | "import numpy as np\n", 940 | "import time\n", 941 | "import scipy\n", 942 | " \n", 943 | "def superimpose(background, overlay):\n", 944 | " added_image = cv2.addWeighted(background,1,overlay,1,0)\n", 945 | " return (added_image.reshape(32,32,3))\n", 946 | "\n", 947 | "def entropyCal(background, n):\n", 948 | " entropy_sum = [0] * n\n", 949 | " x1_add = [0] * n\n", 950 | " index_overlay = np.random.randint(40000,49999, size=n)\n", 951 | " for x in range(n):\n", 952 | " x1_add[x] = (superimpose(background, x_train[index_overlay[x]]))\n", 953 | "\n", 954 | " py1_add = model.predict(np.array(x1_add))\n", 955 | " EntropySum = -np.nansum(py1_add*np.log2(py1_add))\n", 956 | " return EntropySum\n", 957 | "\n", 958 | "n_test = 2000\n", 959 | "n_sample = 100\n", 960 | "entropy_benigh = [0] * n_test\n", 961 | "entropy_trojan = [0] * n_test\n", 962 | "# x_poison = [0] * n_test\n", 963 | "\n", 964 | "for j in range(n_test):\n", 965 | " if 0 == j%1000:\n", 966 | " print(j)\n", 967 | " x_background = x_train[j+26000] \n", 968 | " entropy_benigh[j] = entropyCal(x_background, n_sample)\n", 969 | "\n", 970 | "for j in range(n_test):\n", 971 | " if 0 == j%1000:\n", 972 | " print(j)\n", 973 | " x_poison = poison(x_train[j+14000])\n", 974 | " entropy_trojan[j] = entropyCal(x_poison, n_sample)\n", 975 | "\n", 976 | "entropy_benigh = [x / n_sample for x in entropy_benigh] # get entropy for 2000 clean inputs\n", 977 | "entropy_trojan = [x / n_sample for x in entropy_trojan] # get entropy for 2000 trojaned inputs" 978 | ], 979 | "execution_count": 13, 980 | "outputs": [ 981 | { 982 | "output_type": "stream", 983 | "text": [ 984 | "0\n", 985 | "1000\n", 986 | "0\n" 987 | ], 988 | "name": "stdout" 989 | }, 990 | { 991 | "output_type": "stream", 992 | "text": [ 993 | "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:19: RuntimeWarning: divide by zero encountered in log2\n", 994 | "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:19: RuntimeWarning: invalid value encountered in multiply\n" 995 | ], 996 | "name": "stderr" 997 | }, 998 | { 999 | "output_type": "stream", 1000 | "text": [ 1001 | "1000\n" 1002 | ], 1003 | "name": "stdout" 1004 | } 1005 | ] 1006 | }, 1007 | { 1008 | "cell_type": "code", 1009 | "metadata": { 1010 | "id": "FWVHBcX-Py1p", 1011 | "colab_type": "code", 1012 | "outputId": "09bacfc5-1cd1-4895-f102-63adfd4bea2d", 1013 | "colab": { 1014 | "base_uri": "https://localhost:8080/", 1015 | "height": 295 1016 | } 1017 | }, 1018 | "source": [ 1019 | "bins = 30\n", 1020 | "plt.hist(entropy_benigh, bins, weights=np.ones(len(entropy_benigh)) / len(entropy_benigh), alpha=1, label='without trojan')\n", 1021 | "plt.hist(entropy_trojan, bins, weights=np.ones(len(entropy_trojan)) / len(entropy_trojan), alpha=1, label='with trojan')\n", 1022 | "plt.legend(loc='upper right', fontsize = 20)\n", 1023 | "plt.ylabel('Probability (%)', fontsize = 20)\n", 1024 | "plt.title('normalized entropy', fontsize = 20)\n", 1025 | "plt.tick_params(labelsize=20)\n", 1026 | "\n", 1027 | "fig1 = plt.gcf()\n", 1028 | "plt.show()\n", 1029 | "# fig1.savefig('EntropyDNNDist_T2.pdf')# save the fig as pdf file\n", 1030 | "fig1.savefig('EntropyDNNDist_T3.svg')# save the fig as pdf file" 1031 | ], 1032 | "execution_count": 14, 1033 | "outputs": [ 1034 | { 1035 | "output_type": "display_data", 1036 | "data": { 1037 | "image/png": "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\nXZ+0AAAAAElFTkSuQmCC\n", 1038 | "text/plain": [ 1039 | "
" 1040 | ] 1041 | }, 1042 | "metadata": { 1043 | "tags": [] 1044 | } 1045 | } 1046 | ] 1047 | }, 1048 | { 1049 | "cell_type": "code", 1050 | "metadata": { 1051 | "id": "RsmCv0rECzKH", 1052 | "colab_type": "code", 1053 | "colab": { 1054 | "base_uri": "https://localhost:8080/", 1055 | "height": 295 1056 | }, 1057 | "outputId": "4ef9fb2b-22a4-4e46-f611-eace34f2b9ea" 1058 | }, 1059 | "source": [ 1060 | "# As trojaned entropy is sometimes too small to be visible. \n", 1061 | "# This is to visulize the entropy distribution of the trojaned inputs under such case.\n", 1062 | "bins = np.linspace(0, max(entropy_trojan), 30)\n", 1063 | "plt.hist(entropy_trojan, bins, weights=np.ones(len(entropy_trojan)) / len(entropy_trojan), alpha=1, label='with trojan')\n", 1064 | "\n", 1065 | "\n", 1066 | "plt.legend(loc='upper right', fontsize = 20)\n", 1067 | "plt.ylabel('Probability (%)', fontsize = 20)\n", 1068 | "plt.title('normalized entropy', fontsize = 20)\n", 1069 | "plt.tick_params(labelsize=20)\n", 1070 | "\n", 1071 | "fig1 = plt.gcf()\n", 1072 | "plt.show()" 1073 | ], 1074 | "execution_count": 23, 1075 | "outputs": [ 1076 | { 1077 | "output_type": "display_data", 1078 | "data": { 1079 | "image/png": "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\nxZx22mmt4yVuscUWXHDBBQ37DM5XZGbWENZbbz123HFHHn30URYtWkT37t0BmDJlCkuWpM7DkyZN\n4sgjj2xdZ9KkNJHFiBEjitY7alR6s+e6665jjz32YNiwYa15AwYMWKHsn/70JyZMmMC+++7Lcccd\nx7PPPsvEiRN5/PHHefbZZ+nTp0/JfahmW+PHj+fOO+9s3dbs2bNb86688kqOP/541l13XQ499FA2\n3HBDJk+ezAUXXMDtt9/OlClTWH/9gmOZt5o7dy4nn3wyu+66K1/4whfo27cvr7/+Orfffjv77bcf\nV199NV//+tdXWm/ZsmXss88+vPbaa+y7776sueaa3HbbbZxxxhm8//77nH322SW32xkcyMysYQwf\nPpwpU6bwwAMPsP/+qRfkpEmT6NKlC3vssUdr4AJYvnw59913HwMHDqR///5F6xw1ahTrr78+1113\nHcOGDSvZCeO2227jrrvuWiEwnnnmmZx//vlcc801nH766UXXrXZbEydOZOLEiYwcueLAQrNnz+ak\nk05ivfXW47HHHmPw4MGteSeccAKXX345p59+OldddVXJtvTq1YvZs2ez6aabrpC+YMEChg4dyumn\nn87hhx/OOuuss0L+a6+9xrbbbss999zTmnf22WczaNAgLrzwQs4666yGG0rNtxbNrGG0BJDcgDVp\n0iR22GEHDj74YF599VVmzEhDn06bNo25c+eWvBqr1le+8pWV6jv22GMBeOyxx+q2HYCDDjpopSAG\ncOONN7J06VK+9a1vrRDEAM4991y6d+/ODTfc0HqVWky3bt1WCmIAPXv25JhjjmHevHk8/vjjBde9\n5JJLVghwG264IQcddBALFixg+vTpBdfpTA5kZtYwdtllF9ZZZ53WQLZgwQKeeOIJRowYwfDhaUL3\nlrx7701Dpbak18OQIUNWSttss80AmDdvpfEU2mTHHXcsmP7EE08AhferV69ebL/99rz//vs8//zz\nZbfxzDPPMHr0aAYOHMg666zT+rzulFNOAeCf//znSuv07NmTLbbYYqX09joO9eBbi2bWMNZaay12\n2203/vKXv/DWW2/x8MMP8+GHHzJixAi22morNt54YyZNmsTxxx/PpEmTkFTXQFboudOaa6avyXqP\n5r7RRhsVTG/pzLHxxhsXzG9Jnz+/9OxSjzzyCMOHD+eDDz5gxIgRHHjggfTo0YM11liDadOmMWHC\n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\nmZk1tf8Ptidlpakz7+UAAAAASUVORK5CYII=\n", 1080 | "text/plain": [ 1081 | "
" 1082 | ] 1083 | }, 1084 | "metadata": { 1085 | "tags": [] 1086 | } 1087 | } 1088 | ] 1089 | }, 1090 | { 1091 | "cell_type": "code", 1092 | "metadata": { 1093 | "id": "5HlVwbXPRrJB", 1094 | "colab_type": "code", 1095 | "outputId": "642adeb0-b9cc-4271-a23d-54a1c0820d5b", 1096 | "colab": { 1097 | "base_uri": "https://localhost:8080/", 1098 | "height": 70 1099 | } 1100 | }, 1101 | "source": [ 1102 | "import scipy\n", 1103 | "import scipy.stats\n", 1104 | "\n", 1105 | "(mu, sigma) = scipy.stats.norm.fit(entropy_benigh)\n", 1106 | "print(mu, sigma)\n", 1107 | "\n", 1108 | "threshold = scipy.stats.norm.ppf(0.01, loc = mu, scale = sigma) #use a preset FRR of 0.01. This can be \n", 1109 | "print(threshold)\n", 1110 | "\n", 1111 | "FAR = sum(i > threshold for i in entropy_trojan)\n", 1112 | "print(FAR/2000*100) #reproduce results in Table 3 of our paper" 1113 | ], 1114 | "execution_count": 24, 1115 | "outputs": [ 1116 | { 1117 | "output_type": "stream", 1118 | "text": [ 1119 | "1.106918450269699 0.31571965176870403\n", 1120 | "0.3724447095846597\n", 1121 | "0.0\n" 1122 | ], 1123 | "name": "stdout" 1124 | } 1125 | ] 1126 | }, 1127 | { 1128 | "cell_type": "code", 1129 | "metadata": { 1130 | "id": "HPV8oNScR6lA", 1131 | "colab_type": "code", 1132 | "outputId": "49078e3d-a49c-4d44-9c2d-25e90433c073", 1133 | "colab": { 1134 | "base_uri": "https://localhost:8080/", 1135 | "height": 52 1136 | } 1137 | }, 1138 | "source": [ 1139 | "min_benign_entropy = min(entropy_benigh)\n", 1140 | "max_trojan_entropy = max(entropy_trojan)\n", 1141 | "\n", 1142 | "print(min_benign_entropy)# check min entropy of clean inputs\n", 1143 | "print(max_trojan_entropy)# check max entropy of trojaned inputs\n" 1144 | ], 1145 | "execution_count": 25, 1146 | "outputs": [ 1147 | { 1148 | "output_type": "stream", 1149 | "text": [ 1150 | "0.08999044418334962\n", 1151 | "0.010337495803833007\n" 1152 | ], 1153 | "name": "stdout" 1154 | } 1155 | ] 1156 | }, 1157 | { 1158 | "cell_type": "code", 1159 | "metadata": { 1160 | "id": "sKnwcC3bEXWv", 1161 | "colab_type": "code", 1162 | "colab": {} 1163 | }, 1164 | "source": [ 1165 | "" 1166 | ], 1167 | "execution_count": 0, 1168 | "outputs": [] 1169 | } 1170 | ] 1171 | } -------------------------------------------------------------------------------- /STRIP__A_Defence_Against_Trojan_Attacks_on_Deep_Neural_Networks.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garrisongys/STRIP/6588a38511bbbb31901911699bfd9c5a4e55c53e/STRIP__A_Defence_Against_Trojan_Attacks_on_Deep_Neural_Networks.pdf --------------------------------------------------------------------------------