Skip to content

Instantly share code, notes, and snippets.

@divamgupta
Created May 31, 2019 16:23
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save divamgupta/c778c17459c1f162e789560d5e0b2f0b to your computer and use it in GitHub Desktop.
Save divamgupta/c778c17459c1f162e789560d5e0b2f0b to your computer and use it in GitHub Desktop.
Simple keras implementation of Virtual Adversarial Training .
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Couldn't import dot_parser, loading of dot files will not be possible.\n",
"/usr/local/lib/python2.7/dist-packages/cryptography/hazmat/primitives/constant_time.py:26: CryptographyDeprecationWarning: Support for your Python version is deprecated. The next version of cryptography will remove support. Please upgrade to a 2.7.x release that supports hmac.compare_digest as soon as possible.\n",
" utils.DeprecatedIn23,\n"
]
}
],
"source": [
"from numpy.random import seed\n",
"seed(0)\n",
"from tensorflow import set_random_seed\n",
"set_random_seed(0)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import matplotlib\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import keras\n",
"from keras.models import * \n",
"from keras.layers import *\n",
"from sklearn.metrics import accuracy_score\n",
"import tensorflow as tf"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Make the datasets"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn import datasets\n",
"\n",
"circles = datasets.make_circles(n_samples=1000 , noise=.05 , factor=0.3 ,random_state=3 )\n",
"circles_test = datasets.make_circles(n_samples=10000 , noise=0 , factor=0.3 ,random_state=1 )\n",
"\n",
"n_poionts = 8\n",
"inds = list (np.where(circles[1] == 0)[0][:n_poionts]) + list (np.where(circles[1] == 1)[0][:n_poionts])\n",
"\n",
"X_train = circles[0][inds]\n",
"Y_train = circles[1][inds]\n",
"Y_train_cat = keras.utils.to_categorical( circles[1][inds] )\n",
"\n",
"X_test = circles_test[0] \n",
"Y_test = circles_test[1] \n",
"Y_test_cat = keras.utils.to_categorical( circles_test[1] )\n",
"\n",
"n_classes = int( np.max(Y_train) + 1 )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the dataset"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb737078bd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_test[:, 0], X_test[:, 1], c=Y_test, s=20 , cmap='winter' , edgecolor='none' , alpha=0.005)\n",
"plt.scatter(X_train[:, 0], X_train[:, 1], c=Y_train, s=20 , cmap='winter' , edgecolor='k')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def plot_model_predictions( m ):\n",
" \n",
" xx, yy = np.meshgrid(np.arange(-1.4, 1.4, 0.1),\n",
" np.arange(-1.8, 1.4, 0.1))\n",
"\n",
" Z = m.predict(np.c_[xx.ravel(), yy.ravel()]).argmax(-1)\n",
" Z = Z.reshape(xx.shape)\n",
"\n",
" plt.contourf(xx, yy, Z, alpha=0.3, cmap='Greens' )\n",
" plt.scatter(X_test[:, 0], X_test[:, 1], c=Y_test, s=20 , cmap='winter' , edgecolor='none' , alpha=0.005)\n",
" plt.scatter(X_train[:, 0], X_train[:, 1], c=Y_train, s=20 , cmap='winter' , edgecolor='k')\n",
" \n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model without VAT"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"model = Sequential()\n",
"model.add( Dense(100 ,activation='relu' , input_shape=(2,)))\n",
"model.add( Dense(2 , activation='softmax' ))\n",
"model.compile( 'sgd' , 'categorical_crossentropy' , metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/1\n",
"160000/160000 [==============================] - 13s 83us/step - loss: 0.2050 - acc: 0.9870\n",
"('Test accruracy ', 0.9059)\n"
]
}
],
"source": [
"model.fit( np.concatenate([X_train]*10000) , np.concatenate([Y_train_cat]*10000) )\n",
"\n",
"y_pred = model.predict( X_test ).argmax(-1)\n",
"print(\"Test accruracy \" , accuracy_score(Y_test , y_pred ))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plot the model outputs"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python2.7/dist-packages/numpy/ma/core.py:6442: MaskedArrayFutureWarning: In the future the default for ma.minimum.reduce will be axis=0, not the current None, to match np.minimum.reduce. Explicitly pass 0 or None to silence this warning.\n",
" return self.reduce(a)\n",
"/usr/local/lib/python2.7/dist-packages/numpy/ma/core.py:6442: MaskedArrayFutureWarning: In the future the default for ma.maximum.reduce will be axis=0, not the current None, to match np.maximum.reduce. Explicitly pass 0 or None to silence this warning.\n",
" return self.reduce(a)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb7392b4290>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_model_predictions( model )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model with VAT"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"\n",
"def compute_kld(p_logit, q_logit):\n",
" p = tf.nn.softmax(p_logit)\n",
" q = tf.nn.softmax(q_logit)\n",
" return tf.reduce_sum(p*(tf.log(p + 1e-16) - tf.log(q + 1e-16)), axis=1)\n",
"\n",
"\n",
"def make_unit_norm(x):\n",
" return x/(tf.reshape(tf.sqrt(tf.reduce_sum(tf.pow(x, 2.0), axis=1)), [-1, 1]) + 1e-16)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"network = Sequential()\n",
"network.add( Dense(100 ,activation='relu' , input_shape=(2,)))\n",
"network.add( Dense(2 ))\n",
"\n",
"model_input = Input((2,))\n",
"p_logit = network( model_input )\n",
"p = Activation('softmax')( p_logit )\n",
"\n",
"r = tf.random_normal(shape=tf.shape( model_input ))\n",
"r = make_unit_norm( r )\n",
"p_logit_r = network( model_input + 10*r )\n",
"\n",
"kl = tf.reduce_mean(compute_kld( p_logit , p_logit_r ))\n",
"grad_kl = tf.gradients( kl , [r ])[0]\n",
"r_vadv = tf.stop_gradient(grad_kl)\n",
"r_vadv = make_unit_norm( r_vadv )/3.0\n",
"\n",
"\n",
"p_logit_no_gradient = tf.stop_gradient(p_logit)\n",
"p_logit_r_adv = network( model_input + r_vadv )\n",
"vat_loss = tf.reduce_mean(compute_kld( p_logit_no_gradient, p_logit_r_adv ))\n",
"\n",
"\n",
"model_vat = Model(model_input , p )\n",
"model_vat.add_loss( vat_loss )\n",
"\n",
"model_vat.compile( 'sgd' , 'categorical_crossentropy' , metrics=['accuracy'])\n",
"\n",
"model_vat.metrics_names.append('vat_loss')\n",
"model_vat.metrics_tensors.append( vat_loss )\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/1\n",
"160000/160000 [==============================] - 22s 137us/step - loss: 0.3167 - acc: 0.9779 - vat_loss: 0.0746\n",
"('Test accruracy ', 1.0)\n"
]
}
],
"source": [
"model_vat.fit( np.concatenate([X_train]*10000) , np.concatenate([Y_train_cat]*10000) )\n",
"\n",
"y_pred = model_vat.predict( X_test ).argmax(-1)\n",
"print( \"Test accruracy \" , accuracy_score(Y_test , y_pred ))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plot the model outputs"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb7362adc10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_model_predictions( model_vat )\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@fahad7033
Copy link

Your explanation is really very helpful. It is clear now in supervised learning, could you please mention what the possible changes in the code above to make it applicable for unlabeled data as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment