Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save arminwasicek/05dc477503eae2cc8a51bd78f4fd923e to your computer and use it in GitHub Desktop.
Save arminwasicek/05dc477503eae2cc8a51bd78f4fd923e to your computer and use it in GitHub Desktop.
Jupyter notebook on adverserial learning on logistic regression
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"import numpy as np\n",
"import time\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"from sklearn import linear_model \n",
"from scipy.stats import logistic\n",
"\n",
"def sigmoid(a):\n",
" return (1./(1.+np.exp(-1*a)))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXUAAAEACAYAAABMEua6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGi1JREFUeJzt3XGwrHV93/H353INg1E4KJZNeqMHncYxTuiBNoGJqVmQ\nGsAZIJk4GmPgUJMhra1MtVbidHJvWtORTEXamjSjMBxwTDChRcCYgJVsMjqtGuEqRDC23ktEe09i\n5LYlVAe43/6xzzn3cDj3PrvP85z97fc5n9fMmbPP7rP7+9wfD9/z7PfZ51lFBGZm1g+7SgcwM7Pu\nuKibmfWIi7qZWY+4qJuZ9YiLuplZj7iom5n1yMRFXdIuSfdLurNaXpH0teq++ySduX0xzcxsErun\nWPdq4M+Ak6vlAN4REbd3nsrMzBqZaE9d0h7gYuCGJs83M7PZmLQovx94J+O9843eI2m/pPdJek63\n0czMbFq1RV3S64DViNgPaMND10TEK4AfAV4IvGt7IpqZ2aQm6am/CrhE0sXAScDzJd0SEZcDRMST\nkm4C3rHVkyX54jJmZg1EhOrXeqbaPfWIeHdEvDgiXgq8Ebg3Ii6XNACQJOAy4MHjvEban7179xbP\nsFPzZ87u/OV/sudvappPv2z2EUmnMW7J7Ad+qcVrza2DBw+WjtBK5vyZs4Pzl5Y9f1NTFfWI+GPg\nj6vbr9mWRGZm1pg/klhjeXm5dIRWMufPnB2cv7Ts+ZtSm97NRANIsd1jmJn1jSRiOw6U7nSj0ah0\nhFYy58+cHZy/tOz5m3JRNzPrEbdfzMzmkNsvZmbmol4ne18uc/7M2cH5S8uevykXdTOzHnFP3cxs\nDrmnbmZmLup1svfl1vIP9gyQNNXPYM9gLrJn5fxlZc/fVJsLelkiq99YhX1TPmff6rZkMbPt4576\nDiFp6qLOPlpdAtTMmnNP3czMXNTrZO/LZc6fOTs4f2nZ8zflom5m1iMT99Ql7QL+FHg0Ii6RtAjc\nCpwK3Af8fEQ8tcXz3FOfA+6pm+Uyi5761cCXNyxfC7wvIl4OHAbeMu3gZmbWrYmKuqQ9wMXADRvu\nPh/4z9Xtm4Gf6jbafMjel8ucP3N2cP7SsudvatI99fcD7wQCQNILgcci4kj1+KPA93cfz8zMplF7\n8pGk1wGrEbFf0nDt7upno2M2X5eXl1lcXARgYWGBpaUlhsPxS639NZ3X5bX75iVP0/zrDlS/z5hs\nuWT+4XBYfP6cf37y9D3/aDRiZWUFYL1eNlF7oFTSvwXeDDwFnAQ8H/gY8FpgEBFHJJ0L7I2Ii7Z4\nvg+UzgEfKDXLZdsOlEbEuyPixRHxUuCNwL0R8Wbgj4DXV6tdAdwx7eAZPGMvN6HM+TNnB+cvLXv+\nptp8Tv0a4O2S/hx4AXBjN5HMzKwpX/tlh3D7xSwXX/vFzMxc1Otk78tlzp85Ozh/adnzN+WibmbW\nI+6p7xDuqZvl4p66mZm5qNfJ3pfLnD9zdnD+0rLnb8pF3cysR9xT3yHcUzfLxT11MzNzUa+TvS+X\nOX/m7OD8pWXP35SLuplZj7invkO4p26Wi3vqZmbmol4ne18uc/7M2cH5S8uevykXdTOzHnFPfYdw\nT90sl23rqUs6UdJnJd0v6QFJe6v7b5L0ter++ySd2SS4mZl1Z5LvKP0ucF5EnAUsARdJOqd6+F9E\nxFkRcXZEfGk7g5aSvS+XOX/m7OD8pWXP39REPfWIeKK6eSKwGzhSLU/91sDMzLbPRD11SbuALwAv\nA34jIn5Z0k3AucB3gU8B10TEk1s81z31OeCeulkuTXvquydZKSKOAGdJOhm4XdIPMS7iq5KeA3wI\neBfwnq2ev7y8zOLiIgALCwssLS0xHA6Bo2+RvLy9y+sOVL/PmGx5XvJ72ct9Xx6NRqysrACs18sm\npv70i6RfAR6PiOs23PcTwDsi4pIt1k+9pz4ajdb/A2S0lj/jnnpf5j4r5y9rOz/9cpqkU6rbJwEX\nAA9LGlT3CbgMeHDawc3MrFu1e+qSfhi4mfEfgF3ARyPi1yR9CjiN8cHS/cAvbTiguvH5qffU+yLj\nnrrZTrZtPfWIeAA4e4v7XzPtYGZmtr18mYAazzrQmEzm/Jmzg/OXlj1/Uy7qZmY94mu/7BDuqZvl\n4uupm5mZi3qd7H25zPkzZwfnLy17/qZc1M3MesQ99R3CPXWzXNxTNzMzF/U62ftymfNnzg7OX1r2\n/E25qJuZ9Yh76juEe+pmubinbmZmLup1svflMufPnB2cv7Ts+ZtyUTcz6xH31HcI99TNcnFPfc4N\n9gyQNNXPYM+gdGwzS6b2SzIknQj8CfA91fq3RcSvSloEbgVOBe4Dfj4intq+qGV09T2Hq99YnXpP\neXXfautxM39PY+bs4PylZc/fVO2eekR8FzgvIs4CloCLJJ0DXAu8LyJeDhwG3rKtSc3MrNZUPXVJ\nz2W81/5PgI8Dg4g4IulcYF9EXLjFc9xTp3xPu/T4Zjadbe2pS9ol6X7gEPBJ4H8ChyPiSLXKo8D3\nTzu4mZl1q7anDlAV77MknQzcDrxiq9WO9fzl5WUWFxcBWFhYYGlpab3XtfZZ0nldvv766zvJu+5A\n9fuMyZa7yl9q/DbLG+duXrYH55+ffH3LPxqNWFlZAVivl01M/ZFGSb8CPAH8S57ZftkbERdtsX7q\n9suoo4Mtpdofa/kztl+6mvtSnL+s7Pmbtl9qi7qk04AnI+J/SzoJuBt4L3AF8F8i4qOS/hPwxYj4\nrS2en7qod6V0US09vplNp2lRn6T98n3AzZJ2Me7BfzQiPiHpIeBWSf8GuB+4cdrBzcysW5N8pPGB\niDg7IpYi4syI+LXq/gMRcU5E/GBEvCEintz+uLO3sS+XUeb8mbOD85eWPX9TEx0oNbOjBoNFVlcf\nmXj9009/CYcOHdy+QGYb+NovM1K6p116/D6RxHE+7LXVMzyPNjVf+8XMzFzU62Tvy2XOnzn72Kh0\ngFayz3/2/E25qJuZ9Yh76jNSuqddevw+cU/dZsE9dTMzc1Gvk70vlzl/5uxjo9IBWsk+/9nzN+Wi\nbmbWI+6pz0jpnnbp8fvEPXWbBffUzczMRb1O9r5c5vyZs4+NSgdoJfv8Z8/flIu6mVmPuKc+I6V7\n2qXH7xP31G0W3FM3M7P6oi5pj6R7JX1Z0gOS/ll1/15Jj0q6r/q5cPvjzl72vlzm/Jmzj41KB2gl\n+/xnz9/UJNdTfwp4e0Tsl/Q84AuSPlk9dl1EXLd98czMbBpNvnj6Y8B/BH4ceDwi3lezvnvqlO9p\nlx6/T9xTt1mYSU9d0iKwBHy2uuutkvZLukHSKdMObmZm3Zq4qFetl9uAqyPiceA3gZdFxBJwCOhl\nGyZ7Xy5z/szZx0alA7SSff6z529qou8olbSbcUH/cETcARARf7VhlQ8Bdx3r+cvLyywuLgKwsLDA\n0tISw+EQODrx87q8f//+Tl5v3YHq9xmTLXeVv9T4fV0+am15WLPMXOX38vwtj0YjVlZWANbrZRMT\n9dQl3QJ8KyLevuG+QUQcqm7/c+BHIuJNWzzXPXXK97RLj98n7qnbLDTtqdfuqUt6FfBzwAOS7me8\nNb8beJOkJeAIcBC4atrBzcysW7U99Yj4TEScEBFLEXFWRJwdEX8YEZdHxJnV/ZdFxOosAs/as99u\n55I5f+bsY6PSAVrJPv/Z8zflM0rNzHrE136ZkdI97dLj94l76jYLvvaLmZm5qNfJ3pfLnD9z9rFR\n6QCtZJ//7PmbclE3M+sR99RnpHRPu/T4feKeus2Ce+q2YwwGi0ia6mcwWCwd22wmXNRrZO/LZc5/\nrOyrq48w3lOe/Gf8nFkbFRizO5m3HcifvykXdTOzHnFPfUZK97RLj9+l6Xva0GVf2z11mwX31M3M\nzEW9Tva+XOb8mbOPjUoHaCX7/GfP35SLuplZj7inPiOle9qlx++Se+q2E7inbmZmLup1svflMufP\nnH1sVDpAK9nnP3v+pmqLuqQ9ku6V9GVJD0h6W3X/qZLukfQVSXdLOmX745qZ2fHU9tQlDYBBROyX\n9DzgC8ClwJXAX0fEr0t6F3BqRFyzxfPdU6d8T7v0+F1yT912gm3rqUfEoYjYX91+HHgI2MO4sN9c\nrXYzcNm0g5uZWbem6qlLWgSWgP8OnL72vaQRcQh4Udfh5kH2vlzm/Jmzj41KB2gl+/xnz9/UxEW9\nar3cBlxd7bH7/aSZ2ZzZPclKknYzLugfjog7qrtXJZ0eEatV3/0vj/X85eVlFhcXAVhYWGBpaYnh\ncAgc/Ws6r8tr97V9vXUHqt9nTLbcVf5S47dZHg6H9fO5vjc8rFnu9t8z2fjDbRu/9PxnWM6WfzQa\nsbKyArBeL5uY6OQjSbcA34qIt2+471rg2xFxrQ+U1it9oLL0+F3ygVLbCbbtQKmkVwE/B5wv6X5J\n90m6ELgW+IeSvgJcALx32sEzePaeWS6Z82fOPjYqHaCV7POfPX9Tte2XiPgMcMIxHr6g2zhmZtaG\nr/0yI6XbH6XH75LbL7YT+NovZmbmol4ne18uc/7M2cdGpQO0kn3+s+dvykXdzKxH3FOfkdI97dLj\nd8k9ddsJ3FM3MzMX9TrZ+3Lzkn+wZ4CkqX5e8KIXlI7d0qh0gFbmZdtpKnv+pia6TIBZW6vfWJ26\n/fPYvse2JYtZn7mnPiOle9p9Gt89ddsJ3FM3MzMX9TrZ+3LZ8+c26vwVB4PFqY9NDAaLjcbKvu1k\nz9+Ue+pmiayuPsK0rafV1anfwVti7qnPSJ962qXH38k99dL/dpsd99TNzMxFvU72vlz2/LmNSgdo\nJfu2kz1/Uy7qZmY9Msk3H90oaVXSlzbct1fSo9W3IK19E1Ivbfyuz4yy589tWDpAK9m3nez5m5pk\n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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1046a6f28>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N=100\n",
"d1mu = 5.0; d1sig = 0.5\n",
"d2mu = 4.0; d2sig = 0.3\n",
"\n",
"# X = [bias, x]\n",
"def sample_data():\n",
" X = np.concatenate( [np.stack([np.ones(N),np.random.normal(d1mu, d1sig, N)]).T,\n",
" np.stack([np.ones(N),np.random.normal(d2mu, d2sig, N)]).T ])\n",
" y = np.concatenate([np.ones(N), np.zeros(N)])\n",
" return X,y\n",
"\n",
"X,y = sample_data()\n",
"Xt,yt = sample_data()\n",
"\n",
"plt.hist([X[0:N,1],X[N:-1,1]])\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Logistic regression: $\\sigma(\\beta_0 + \\beta_1 x)$"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train set error: 0.895\n",
"Test set error: 0.87\n"
]
}
],
"source": [
"lg = linear_model.LogisticRegression(fit_intercept=False)\n",
"lg.fit(X,y)\n",
"print('Train set error: ' + str(np.sum(lg.predict(X)==yt)/len(y)))\n",
"print('Test set error: ' + str(np.sum(lg.predict(Xt)==yt)/len(yt)))"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1146af048>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"t = np.linspace(2.5,6.5)\n",
"classes = lg.predict(X).astype(np.bool)\n",
"plt.plot(t,sigmoid(w.dot(np.vstack([np.ones(len(t)),t]))), label='logistic fn')\n",
"plt.scatter(X[classes,1], y[classes], color=['darkblue'], label='classified 1')\n",
"plt.scatter(X[~classes,1], y[~classes], color=['darkred'], label='classified 0')\n",
"plt.legend(loc=2)\n",
"plt.grid(True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extract coefficients and manually classify"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,\n",
" 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"w = np.array(*lg.coef_)\n",
"c = (sigmoid(w.dot(X.T)) > 0.5).astype(int)\n",
"c"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-5.56724366, 1.27707096])"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"w"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Add perturbations to the input\n",
"\n",
"$\\tilde{x} = x + \\eta$\n",
"\n",
"The linear part of the logistic regression formula is characterized by weight vector $w$ with $\\beta_0$ being the intercept.\n",
"\n",
"$w = (\\beta_0, \\beta_1, \\ldots)$\n",
"\n",
"Then the perturbed output of the linear regression function adds perturbation term $\\eta$. It adds up to increase the activation and thus trick the activation function $\\sigma$ of the logistic regression into yielding the wrong output.\n",
"\n",
"$w^T\\tilde{x} = w^Tx + w^T\\eta$\n",
"\n",
"A choice to maximize the activation with respect to the max norm is to use the sign function. \n",
"\n",
"Note: Activation will grow by $\\epsilon \\, m \\, n$ ($m \\ldots$ average magnitude, $n \\ldots$ dimension of input vector $x$)\n",
"\n",
"$\\eta = sign(w)$\n",
"\n",
"A constraint on $\\eta$ is to be lower than the precision of the sensor. This is important that the argument that the perturbed input $\\tilde{x}$ is _essentially_ the same as the original input $x$ holds. A bitwise comparison of the original $x$ and the perturbed input $\\tilde{x}$ would, of course, fail. Restricting the perturbation to be smaller then the maximum sensor error $\\epsilon$ makes it plausible that both inputs $x,\\tilde{x}$ could have been measured by same sensor.\n",
"\n",
"$\\Vert \\eta \\Vert_\\infty < \\epsilon$\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-0.1, 0.1])"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epsilon = 0.1\n",
"eta = np.sign(w) * epsilon\n",
"eta"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"-2.1450863489592109"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(w)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.68443146232189256"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"w.dot(eta)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def check_eta(eta, epsilon):\n",
" return np.linalg.norm(eta, np.inf) <= epsilon\n",
"\n",
"check_eta(eta, epsilon)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,\n",
" 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0,\n",
" 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1,\n",
" 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1,\n",
" 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1])"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ct = (sigmoid(w.dot(Xt.T)) > 0.5).astype(int)\n",
"cta = (sigmoid(w.dot(Xt.T) + w.dot(eta)) > 0.5).astype(int)\n",
"ca = (sigmoid(w.dot(X.T) + w.dot(eta)) > 0.5).astype(int)\n",
"ca"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Accuracy of the classifier on (i) train data set and (ii) test data set\n",
"\n",
"$accuracy = \\frac{correctly\\ classified\\ examples}{all\\ examples}$"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train set original: 0.94\n",
"Train set perturbed: 0.66\n"
]
}
],
"source": [
"print('Train set original: %.2f\\nTrain set perturbed: %.2f' % (np.sum(c==y)/len(y),np.sum(ca==y)/len(y)))"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test set original: 0.91\n",
"Test set perturbed: 0.64\n"
]
}
],
"source": [
"print('Test set original: %.2f\\nTest set perturbed: %.2f' % (np.sum(ct==y)/len(y), np.sum(cta==y)/len(y)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Count the occurences of examples that were misclassified because of the perturbation."
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([63, 7])"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.bincount(y[ca!=c].astype(np.int64))"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([61, 7])"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.bincount(y[cta!=ct].astype(np.int64))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Random noise doesn't seem to have a similar impact."
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Worst accuracy for randomly perturbed input: 0.82 (Test set original: 0.91)\n"
]
}
],
"source": [
"res = []\n",
"for _ in range(100000):\n",
" etar = np.random.rand(2,)*epsilon\n",
" ct = (sigmoid(w.dot(Xt.T) + w.dot(etar)) > 0.5).astype(int)\n",
" res.append(np.sum(ct==y)/len(y))\n",
"print('Worst accuracy for randomly perturbed input: %.2f (Test set original: %.2f)' % (np.min(res),(np.sum(ct==y)/len(y))))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda env:tf]",
"language": "python",
"name": "conda-env-tf-py"
},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment