Skip to content

Instantly share code, notes, and snippets.

@Shirataki2
Created June 11, 2018 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Shirataki2/86a068ea0a3eff36974ccf9b8ab5a8cf to your computer and use it in GitHub Desktop.
Save Shirataki2/86a068ea0a3eff36974ccf9b8ab5a8cf to your computer and use it in GitHub Desktop.
WGAN-GP-Mnist.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# Wasserstein GAN-Gradient Penalty"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:08.839501Z",
"end_time": "2018-06-10T00:30:16.684564Z"
},
"trusted": true
},
"cell_type": "code",
"source": "import keras\nfrom keras.layers import Input, Dense, Reshape, Flatten, Dropout\nfrom keras.layers import Conv2D, Deconv2D, UpSampling2D,Conv2DTranspose\nfrom keras.layers import BatchNormalization, Activation, ZeroPadding2D\nfrom keras.optimizers import RMSprop, Adam\nfrom keras.models import Model, Sequential\nfrom keras.layers.advanced_activations import LeakyReLU\nimport keras.backend as K\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom IPython import display\nimport tqdm\nfrom keras.layers.merge import _Merge\nfrom functools import partial",
"execution_count": 1,
"outputs": [
{
"name": "stderr",
"text": "C:\\Users\\tmy19\\Miniconda3\\envs\\tensorflow\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n from ._conv import register_converters as _register_converters\nUsing TensorFlow backend.\n",
"output_type": "stream"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:16.686494Z",
"end_time": "2018-06-10T00:30:16.691500Z"
},
"trusted": true
},
"cell_type": "code",
"source": "IMG_SHAPE = (28, 28, 1)\nGENERATOR_FIRST_CHANNELS = 512\nGENERATOR_SECOND_CHANNELS = 128\nLATENT_DIM = 100\nBATCH_SIZE = 32\nLR = 2.434e-4\nTRAIN_RATIO = 5\nGRADIENT_PENALTY_WEIGHT = 10",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:16.693469Z",
"end_time": "2018-06-10T00:30:16.711422Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def make_generator():\n s3 = IMG_SHAPE[0]//4\n model = Sequential()\n model.add(Dense(GENERATOR_FIRST_CHANNELS, input_dim=LATENT_DIM,activation='relu'))\n model.add(Dense(GENERATOR_SECOND_CHANNELS*s3*s3))\n model.add(BatchNormalization())\n model.add(LeakyReLU())\n model.add(Reshape((s3, s3, GENERATOR_SECOND_CHANNELS)))\n model.add(Conv2DTranspose(128, (5, 5), strides=2, padding='same'))\n model.add(BatchNormalization(axis=-1))\n model.add(LeakyReLU())\n model.add(Conv2D(128, (5, 5), padding='same'))\n model.add(BatchNormalization(axis=-1))\n model.add(LeakyReLU())\n model.add(Conv2DTranspose(128, (5, 5), strides=2, padding='same'))\n model.add(BatchNormalization(axis=-1))\n model.add(LeakyReLU())\n model.add(Conv2D(IMG_SHAPE[2], (5, 5),padding='same',activation='tanh'))\n return model",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:16.714416Z",
"end_time": "2018-06-10T00:30:18.570448Z"
},
"trusted": true
},
"cell_type": "code",
"source": "generator = make_generator()\ngenerator.summary()",
"execution_count": 4,
"outputs": [
{
"name": "stdout",
"text": "_________________________________________________________________\nLayer (type) Output Shape Param # \n=================================================================\ndense_1 (Dense) (None, 512) 51712 \n_________________________________________________________________\ndense_2 (Dense) (None, 6272) 3217536 \n_________________________________________________________________\nbatch_normalization_1 (Batch (None, 6272) 25088 \n_________________________________________________________________\nleaky_re_lu_1 (LeakyReLU) (None, 6272) 0 \n_________________________________________________________________\nreshape_1 (Reshape) (None, 7, 7, 128) 0 \n_________________________________________________________________\nconv2d_transpose_1 (Conv2DTr (None, 14, 14, 128) 409728 \n_________________________________________________________________\nbatch_normalization_2 (Batch (None, 14, 14, 128) 512 \n_________________________________________________________________\nleaky_re_lu_2 (LeakyReLU) (None, 14, 14, 128) 0 \n_________________________________________________________________\nconv2d_1 (Conv2D) (None, 14, 14, 128) 409728 \n_________________________________________________________________\nbatch_normalization_3 (Batch (None, 14, 14, 128) 512 \n_________________________________________________________________\nleaky_re_lu_3 (LeakyReLU) (None, 14, 14, 128) 0 \n_________________________________________________________________\nconv2d_transpose_2 (Conv2DTr (None, 28, 28, 128) 409728 \n_________________________________________________________________\nbatch_normalization_4 (Batch (None, 28, 28, 128) 512 \n_________________________________________________________________\nleaky_re_lu_4 (LeakyReLU) (None, 28, 28, 128) 0 \n_________________________________________________________________\nconv2d_2 (Conv2D) (None, 28, 28, 1) 3201 \n=================================================================\nTotal params: 4,528,257\nTrainable params: 4,514,945\nNon-trainable params: 13,312\n_________________________________________________________________\n",
"output_type": "stream"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:18.572444Z",
"end_time": "2018-06-10T00:30:18.578429Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def make_discriminator():\n model = Sequential()\n model.add(Conv2D(64, (5, 5),padding='same', input_shape=IMG_SHAPE))\n model.add(LeakyReLU())\n model.add(Conv2D(64, (5, 5), kernel_initializer='he_normal', strides=[2, 2]))\n model.add(LeakyReLU())\n model.add(Conv2D(64, (5, 5), kernel_initializer='he_normal', padding='same', strides=[2, 2]))\n model.add(LeakyReLU())\n model.add(Flatten())\n model.add(Dense(1024, kernel_initializer='he_normal'))\n model.add(LeakyReLU())\n model.add(Dense(1, kernel_initializer='he_normal'))\n return model",
"execution_count": 5,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:18.581419Z",
"end_time": "2018-06-10T00:30:18.738004Z"
},
"trusted": true
},
"cell_type": "code",
"source": "discriminator = make_discriminator()\ndiscriminator.summary()",
"execution_count": 6,
"outputs": [
{
"name": "stdout",
"text": "_________________________________________________________________\nLayer (type) Output Shape Param # \n=================================================================\nconv2d_3 (Conv2D) (None, 28, 28, 64) 1664 \n_________________________________________________________________\nleaky_re_lu_5 (LeakyReLU) (None, 28, 28, 64) 0 \n_________________________________________________________________\nconv2d_4 (Conv2D) (None, 12, 12, 64) 102464 \n_________________________________________________________________\nleaky_re_lu_6 (LeakyReLU) (None, 12, 12, 64) 0 \n_________________________________________________________________\nconv2d_5 (Conv2D) (None, 6, 6, 64) 102464 \n_________________________________________________________________\nleaky_re_lu_7 (LeakyReLU) (None, 6, 6, 64) 0 \n_________________________________________________________________\nflatten_1 (Flatten) (None, 2304) 0 \n_________________________________________________________________\ndense_3 (Dense) (None, 1024) 2360320 \n_________________________________________________________________\nleaky_re_lu_8 (LeakyReLU) (None, 1024) 0 \n_________________________________________________________________\ndense_4 (Dense) (None, 1) 1025 \n=================================================================\nTotal params: 2,567,937\nTrainable params: 2,567,937\nNon-trainable params: 0\n_________________________________________________________________\n",
"output_type": "stream"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:18.739997Z",
"end_time": "2018-06-10T00:30:19.118019Z"
},
"trusted": true
},
"cell_type": "code",
"source": "(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()\nX_train = np.concatenate((X_train, X_test), axis=0).reshape((-1,*IMG_SHAPE))",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.119978Z",
"end_time": "2018-06-10T00:30:19.492044Z"
},
"trusted": true
},
"cell_type": "code",
"source": "X_train = (X_train.astype(np.float32) - 127.5) / 127.5",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.500961Z",
"end_time": "2018-06-10T00:30:19.551824Z"
},
"trusted": true
},
"cell_type": "code",
"source": "print(X_train.min(),X_train.max())",
"execution_count": 10,
"outputs": [
{
"name": "stdout",
"text": "-1.0 1.0\n",
"output_type": "stream"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.553844Z",
"end_time": "2018-06-10T00:30:19.557829Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def wasserstein_loss(y_true, y_pred):\n return K.mean(y_true* y_pred)",
"execution_count": 11,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.493978Z",
"end_time": "2018-06-10T00:30:19.498965Z"
},
"trusted": true
},
"cell_type": "code",
"source": "for layer in discriminator.layers:\n layer.trainable = False\ndiscriminator.trainable = False",
"execution_count": 9,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.560800Z",
"end_time": "2018-06-10T00:30:19.984667Z"
},
"trusted": true
},
"cell_type": "code",
"source": "generator_input = Input(shape=(LATENT_DIM,))\ngenerator_layers = generator(generator_input)\ndiscriminator_layers_for_generator = discriminator(generator_layers)\ngenerator_model = Model([generator_input], [discriminator_layers_for_generator])\ngenerator_model.summary()\ngenerator_model.compile(optimizer=Adam(LR,beta_1=0.5,beta_2=0.9),\n loss=wasserstein_loss)",
"execution_count": 12,
"outputs": [
{
"name": "stdout",
"text": "_________________________________________________________________\nLayer (type) Output Shape Param # \n=================================================================\ninput_1 (InputLayer) (None, 100) 0 \n_________________________________________________________________\nsequential_1 (Sequential) (None, 28, 28, 1) 4528257 \n_________________________________________________________________\nsequential_2 (Sequential) (None, 1) 2567937 \n=================================================================\nTotal params: 7,096,194\nTrainable params: 4,514,945\nNon-trainable params: 2,581,249\n_________________________________________________________________\n",
"output_type": "stream"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.986662Z",
"end_time": "2018-06-10T00:30:19.991647Z"
},
"trusted": true
},
"cell_type": "code",
"source": "for layer in discriminator.layers:\n layer.trainable = True\nfor layer in generator.layers:\n layer.trainable = False\ndiscriminator.trainable = True\ngenerator.trainable = False",
"execution_count": 13,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:19.993643Z",
"end_time": "2018-06-10T00:30:20.007604Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def gradient_penalty_loss(y_true, y_pred, averaged_samples, gradient_penalty_weight):\n gradients = K.gradients(y_pred, averaged_samples)[0]\n gradients_sqr = K.square(gradients)\n gradients_sqr_sum = K.sum(gradients_sqr,axis=np.arange(1, len(gradients_sqr.shape)))\n gradients_l2_norm = K.sqrt(gradients_sqr_sum)\n gradient_penalty = gradient_penalty_weight*K.square(1- gradients_l2_norm)\n return K.mean(gradient_penalty)",
"execution_count": 14,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.009599Z",
"end_time": "2018-06-10T00:30:20.020596Z"
},
"trusted": true
},
"cell_type": "code",
"source": "class RandomWeightAverage(_Merge):\n def _merge_function(self, inputs):\n weights = K.random_uniform((BATCH_SIZE, 1, 1, 1))\n return (weights * inputs[0]) + ((1-weights) * inputs[1])",
"execution_count": 15,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:31:40.693365Z",
"end_time": "2018-06-10T00:31:40.699348Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def generate_images(generator_model,n,m):\n fig,ax = plt.subplots(ncols=5,nrows=4,figsize=(10,8))\n fig.suptitle('Epoch %4d, Batch %4d'%(n,m), fontsize=20)\n test_image_stack = generator_model.predict(np.random.rand(20, LATENT_DIM))\n test_image_stack = (test_image_stack * 0.5) + 0.5\n test_image_stack = np.clip(test_image_stack,0.0,1.0)\n if test_image_stack.shape[3] == 1:\n test_image_stack = test_image_stack.reshape((-1, IMG_SHAPE[0],IMG_SHAPE[1]))\n for i in range(4):\n for j in range(5):\n ax[i, j].imshow(test_image_stack[i*5+j], 'gray')\n plt.savefig('wgan_images2/%04d-%04d.png'%(n,m))\n plt.show()",
"execution_count": 24,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.040519Z",
"end_time": "2018-06-10T00:30:20.447499Z"
},
"trusted": true
},
"cell_type": "code",
"source": "real_samples = Input(shape=X_train.shape[1:])\ngenerator_input_for_discriminator = Input(shape=(LATENT_DIM, ))\ngenerated_samples_for_discriminator = generator(generator_input_for_discriminator)\ndiscriminator_output_from_generator = discriminator(generated_samples_for_discriminator)\ndiscriminator_output_from_real_samples = discriminator(real_samples)",
"execution_count": 17,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.449436Z",
"end_time": "2018-06-10T00:30:20.491376Z"
},
"trusted": true
},
"cell_type": "code",
"source": "averaged_samples = RandomWeightAverage()([real_samples, generated_samples_for_discriminator])\naveraged_samples_out = discriminator(averaged_samples)",
"execution_count": 18,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.494308Z",
"end_time": "2018-06-10T00:30:20.497311Z"
},
"trusted": true
},
"cell_type": "code",
"source": "partial_gp_loss = partial(gradient_penalty_loss,\n averaged_samples=averaged_samples,\n gradient_penalty_weight=GRADIENT_PENALTY_WEIGHT)\npartial_gp_loss.__name__ = 'gradient_penalty'",
"execution_count": 19,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.499292Z",
"end_time": "2018-06-10T00:30:20.544170Z"
},
"trusted": true
},
"cell_type": "code",
"source": "discriminator_model = Model([real_samples, generator_input_for_discriminator],\n [discriminator_output_from_real_samples,\n discriminator_output_from_generator,\n averaged_samples_out])\ndiscriminator_model.summary()",
"execution_count": 20,
"outputs": [
{
"name": "stdout",
"text": "__________________________________________________________________________________________________\nLayer (type) Output Shape Param # Connected to \n==================================================================================================\ninput_3 (InputLayer) (None, 100) 0 \n__________________________________________________________________________________________________\ninput_2 (InputLayer) (None, 28, 28, 1) 0 \n__________________________________________________________________________________________________\nsequential_1 (Sequential) (None, 28, 28, 1) 4528257 input_3[0][0] \n__________________________________________________________________________________________________\nrandom_weight_average_1 (Random (None, 28, 28, 1) 0 input_2[0][0] \n sequential_1[2][0] \n__________________________________________________________________________________________________\nsequential_2 (Sequential) (None, 1) 2567937 sequential_1[2][0] \n input_2[0][0] \n random_weight_average_1[0][0] \n==================================================================================================\nTotal params: 7,096,194\nTrainable params: 2,567,937\nNon-trainable params: 4,528,257\n__________________________________________________________________________________________________\n",
"output_type": "stream"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.546179Z",
"end_time": "2018-06-10T00:30:20.757611Z"
},
"trusted": true
},
"cell_type": "code",
"source": "discriminator_model.compile(optimizer=Adam(LR,beta_1=0.5,beta_2=0.9),\n loss=[wasserstein_loss,\n wasserstein_loss,\n partial_gp_loss])",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:30:20.759611Z",
"end_time": "2018-06-10T00:30:20.764581Z"
},
"trusted": true
},
"cell_type": "code",
"source": "positive_y = np.ones((BATCH_SIZE, 1), dtype=np.float32)\nnegative_y = -positive_y\ndummy_y = np.zeros((BATCH_SIZE, 1), dtype=np.float32)",
"execution_count": 22,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-06-10T00:31:46.194515Z",
"end_time": "2018-06-10T03:03:06.650184Z"
},
"trusted": true
},
"cell_type": "code",
"source": "num = 50\noffset = 0\ni_len = int(X_train.shape[0] // (BATCH_SIZE * TRAIN_RATIO))\n\ngenerate_images(generator,0,0)\nfor epoch in range(offset,offset+num):\n np.random.shuffle(X_train)\n discriminator_loss = []\n generator_loss = []\n minibatch_size = BATCH_SIZE * TRAIN_RATIO\n\n for i in range(i_len):\n if i % 36 == 0:\n display.clear_output(wait=True)\n if i>0:\n generate_images(generator,epoch,i)\n print(\"{0}/{1} {2:.2f} % \".format(epoch, num+offset, 100*i/i_len), end='')\n print('{0}'.format(i%36+1), end='')\n discriminator_minibatches = X_train[i *\n minibatch_size:(i+1)*minibatch_size]\n for j in range(TRAIN_RATIO):\n print('.', end='')\n image_batch = discriminator_minibatches[j *\n BATCH_SIZE:(j+1)*BATCH_SIZE]\n noise = np.random.rand(BATCH_SIZE, LATENT_DIM).astype(np.float32)\n discriminator_loss.append(discriminator_model.train_on_batch([image_batch, noise],\n [positive_y, negative_y, dummy_y]))\n generator_loss.append(generator_model.train_on_batch(\n np.random.rand(BATCH_SIZE, LATENT_DIM), positive_y))\ndisplay.clear_output(wait=True)\ngenerate_images(generator,num+offset,i_len)\nprint(\"Finished {0}/{1} {2:.2f} % \".format(num+offset, num+offset, 100))",
"execution_count": 25,
"outputs": [
{
"metadata": {},
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 720x576 with 20 Axes>"
},
"output_type": "display_data"
},
{
"name": "stdout",
"text": "Finished 50/50 100.00 % \n",
"output_type": "stream"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"varInspector": {
"window_display": false,
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"library": "var_list.py",
"delete_cmd_prefix": "del ",
"delete_cmd_postfix": "",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"library": "var_list.r",
"delete_cmd_prefix": "rm(",
"delete_cmd_postfix": ") ",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
]
},
"kernelspec": {
"name": "conda-env-tensorflow-py",
"display_name": "Python [conda env:tensorflow]",
"language": "python"
},
"language_info": {
"pygments_lexer": "ipython3",
"name": "python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"nbconvert_exporter": "python",
"version": "3.5.5",
"file_extension": ".py",
"mimetype": "text/x-python"
},
"gist": {
"id": "",
"data": {
"description": "WGAN-GP-Mnist.ipynb",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment