You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by GitBox <gi...@apache.org> on 2018/11/26 05:10:43 UTC

[GitHub] KellenSunderland commented on a change in pull request #12933: Update autoencoder example

KellenSunderland commented on a change in pull request #12933: Update autoencoder example
URL: https://github.com/apache/incubator-mxnet/pull/12933#discussion_r236123126
 
 

 ##########
 File path: example/autoencoder/convolutional_autoencoder.ipynb
 ##########
 @@ -0,0 +1,587 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Convolutional Autoencoder"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "![](https://cdn-images-1.medium.com/max/800/1*LSYNW5m3TN7xRX61BZhoZA.png)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In this example we will demonstrate how you can create a convolutional autoencoder in Gluon"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import random\n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import mxnet as mx\n",
+    "from mxnet import autograd, nd, gluon"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Data\n",
+    "\n",
+    "We will use the FashionMNIST dataset which is of a similar format than MNIST but is richer and has more variance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "batch_size = 512\n",
+    "ctx = mx.gpu() if len(mx.test_utils.list_gpus()) > 0 else mx.cpu()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "transform = lambda x,y: (x.transpose((2,0,1)).astype('float32')/255., y)\n",
+    "\n",
+    "train_dataset = gluon.data.vision.FashionMNIST(train=True)\n",
+    "test_dataset = gluon.data.vision.FashionMNIST(train=False)\n",
+    "\n",
+    "train_dataset_t = train_dataset.transform(transform)\n",
+    "test_dataset_t = test_dataset.transform(transform)\n",
+    "\n",
+    "train_data = gluon.data.DataLoader(train_dataset_t, batch_size=batch_size, last_batch='rollover', shuffle=True, num_workers=5)\n",
+    "test_data = gluon.data.DataLoader(test_dataset_t, batch_size=batch_size, last_batch='rollover', shuffle=True, num_workers=5)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAABIEAAACBCAYAAABXearSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJztnXm4VmW5/2+q0+QQ5iwITkwOCKKghWLOSuZsNqk5HI+WiXoqT9ox09LqKr2wKK/UIjNLvRrMIU3AMENESHECkUkEHBFTGk51PH/8fjx9n297Pb1uNnu/77s+n7/utZ9nr7Xe9YxrXff3vnu9/vrrAQAAAAAAAAAA7c2bevoGAAAAAAAAAABg7cNHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGvCW7rxYr169Xu/O68E/eP3113t1xXlow56jq9owYu2347/9278l+69//WtD/3P66adnx6+++mqy3/GOdyT7rW99a1bvL3/5S7L79++flX3+85/v8FpvetObKo//9re/ZWW9ev3jsb/++po/tu4ei3r/fvy///u/a3wfZ599drIPOOCArOzOO+9M9rRp05K9aNGirN7w4cOT3a9fv6xszJgxyda+dMEFF2T1nnnmmYbutyvas5XGYlcwdOjQZM+ePTvZG2+8cVZv5513Tvbdd9+99m9sDenusajz4v+/vp6j8v90nPrcpf+nc1dXjO0Seh9+7295yz+2ln//+98rz1H6zY2uG3Ubi9/73veSrW2wYsWKrN52222X7Hnz5mVll156abJfeOGFrr7FTsEetfVp5rH45je/OTvWubc0V44ePTrZP/3pT7Oyl156Kdnrr79+sv/nf/4nq/f2t7892ZdccklW9q1vfat02x2i82vEP+9Z15R2Hou+5lTtAb/+9a9nxzrvPvroo5Xn7Ip3hK6g0TbEEwgAAAAAAAAAoAbwEQgAAAAAAAAAoAb06k7XpWZ0DasL7ezeVxea2dW2s0yYMCHZhx56aFa2cuXKZM+ZMyfZG220UVZvp512Svaf/vSnrGz69OnJPvroozt1j60uB+vg//ReKuttttlmyf7hD3+YlS1f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\n",
+      "text/plain": [
+       "<Figure size 1440x720 with 10 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "plt.figure(figsize=(20,10))\n",
+    "for i in range(10):\n",
+    "    ax = plt.subplot(1, 10, i+1)\n",
+    "    ax.imshow(train_dataset[i][0].squeeze().asnumpy(), cmap='gray')\n",
+    "    ax.axis('off')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Network"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "net = gluon.nn.HybridSequential(prefix='autoencoder_')\n",
+    "with net.name_scope():\n",
+    "    # Encoder 1x28x28 -> 32x1x1\n",
+    "    encoder = gluon.nn.HybridSequential(prefix='encoder_')\n",
+    "    with encoder.name_scope():\n",
+    "        encoder.add(\n",
+    "            gluon.nn.Conv2D(channels=4, kernel_size=3, padding=1, strides=(2,2), activation='relu'),\n",
+    "            gluon.nn.BatchNorm(),\n",
+    "            gluon.nn.Conv2D(channels=8, kernel_size=3, padding=1, strides=(2,2), activation='relu'),\n",
+    "            gluon.nn.BatchNorm(),\n",
+    "            gluon.nn.Conv2D(channels=16, kernel_size=3, padding=1, strides=(2,2), activation='relu'),\n",
+    "            gluon.nn.BatchNorm(),\n",
+    "            gluon.nn.Conv2D(channels=32, kernel_size=3, padding=0, strides=(2,2),activation='relu'),\n",
+    "            gluon.nn.BatchNorm()\n",
+    "        )\n",
+    "    decoder = gluon.nn.HybridSequential(prefix='decoder_')\n",
+    "    # Decoder 32x1x1 -> 1x28x28\n",
+    "    with decoder.name_scope():\n",
+    "        decoder.add(\n",
+    "            gluon.nn.Conv2D(channels=32, kernel_size=3, padding=2, activation='relu'),\n",
+    "            gluon.nn.HybridLambda(lambda F, x: F.UpSampling(x, scale=2, sample_type='nearest')),\n",
+    "            gluon.nn.BatchNorm(),\n",
+    "            gluon.nn.Conv2D(channels=16, kernel_size=3, padding=1, activation='relu'),\n",
+    "            gluon.nn.HybridLambda(lambda F, x: F.UpSampling(x, scale=2, sample_type='nearest')),\n",
+    "            gluon.nn.BatchNorm(),\n",
+    "            gluon.nn.Conv2D(channels=8, kernel_size=3, padding=2, activation='relu'),\n",
+    "            gluon.nn.HybridLambda(lambda F, x: F.UpSampling(x, scale=2, sample_type='nearest')),\n",
+    "            gluon.nn.BatchNorm(),\n",
+    "            gluon.nn.Conv2D(channels=4, kernel_size=3, padding=1, activation='relu'),\n",
+    "            gluon.nn.Conv2D(channels=1, kernel_size=3, padding=1, activation='sigmoid')\n",
+    "        )\n",
+    "    net.add(\n",
+    "        encoder,\n",
+    "        decoder\n",
+    "    )"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "net.initialize(ctx=ctx)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "--------------------------------------------------------------------------------\n",
+      "        Layer (type)                                Output Shape         Param #\n",
+      "================================================================================\n",
+      "               Input                              (1, 1, 28, 28)               0\n",
+      "        Activation-1  <Symbol autoencoder_encoder_conv0_relu_fwd>               0\n",
+      "        Activation-2                              (1, 4, 14, 14)               0\n",
+      "            Conv2D-3                              (1, 4, 14, 14)              40\n",
+      "         BatchNorm-4                              (1, 4, 14, 14)              16\n",
+      "        Activation-5  <Symbol autoencoder_encoder_conv1_relu_fwd>               0\n",
+      "        Activation-6                                (1, 8, 7, 7)               0\n",
+      "            Conv2D-7                                (1, 8, 7, 7)             296\n",
+      "         BatchNorm-8                                (1, 8, 7, 7)              32\n",
+      "        Activation-9  <Symbol autoencoder_encoder_conv2_relu_fwd>               0\n",
+      "       Activation-10                               (1, 16, 4, 4)               0\n",
+      "           Conv2D-11                               (1, 16, 4, 4)            1168\n",
+      "        BatchNorm-12                               (1, 16, 4, 4)              64\n",
+      "       Activation-13  <Symbol autoencoder_encoder_conv3_relu_fwd>               0\n",
+      "       Activation-14                               (1, 32, 1, 1)               0\n",
+      "           Conv2D-15                               (1, 32, 1, 1)            4640\n",
+      "        BatchNorm-16                               (1, 32, 1, 1)             128\n",
+      "       Activation-17  <Symbol autoencoder_decoder_conv0_relu_fwd>               0\n",
+      "       Activation-18                               (1, 32, 3, 3)               0\n",
+      "           Conv2D-19                               (1, 32, 3, 3)            9248\n",
+      "     HybridLambda-20                               (1, 32, 6, 6)               0\n",
+      "        BatchNorm-21                               (1, 32, 6, 6)             128\n",
+      "       Activation-22  <Symbol autoencoder_decoder_conv1_relu_fwd>               0\n",
+      "       Activation-23                               (1, 16, 6, 6)               0\n",
+      "           Conv2D-24                               (1, 16, 6, 6)            4624\n",
+      "     HybridLambda-25                             (1, 16, 12, 12)               0\n",
+      "        BatchNorm-26                             (1, 16, 12, 12)              64\n",
+      "       Activation-27  <Symbol autoencoder_decoder_conv2_relu_fwd>               0\n",
+      "       Activation-28                              (1, 8, 14, 14)               0\n",
+      "           Conv2D-29                              (1, 8, 14, 14)            1160\n",
+      "     HybridLambda-30                              (1, 8, 28, 28)               0\n",
+      "        BatchNorm-31                              (1, 8, 28, 28)              32\n",
+      "       Activation-32  <Symbol autoencoder_decoder_conv3_relu_fwd>               0\n",
+      "       Activation-33                              (1, 4, 28, 28)               0\n",
+      "           Conv2D-34                              (1, 4, 28, 28)             292\n",
+      "       Activation-35  <Symbol autoencoder_decoder_conv4_sigmoid_fwd>               0\n",
+      "       Activation-36                              (1, 1, 28, 28)               0\n",
+      "           Conv2D-37                              (1, 1, 28, 28)              37\n",
+      "================================================================================\n",
+      "Parameters in forward computation graph, duplicate included\n",
+      "   Total params: 21969\n",
+      "   Trainable params: 21737\n",
+      "   Non-trainable params: 232\n",
+      "Shared params in forward computation graph: 0\n",
+      "Unique parameters in model: 21969\n",
+      "--------------------------------------------------------------------------------\n"
+     ]
+    }
+   ],
+   "source": [
+    "net.summary(test_dataset_t[0][0].expand_dims(axis=0).as_in_context(ctx))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can see that the original image goes from 28x28 = 784 pixels to a vector of length 32. That is a ~25x information compression rate.\n",
+    "Then the decoder brings back this compressed information to the original shape"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "l2_loss = gluon.loss.L2Loss()\n",
+    "l1_loss = gluon.loss.L1Loss()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate': 0.001, 'wd':0.001})\n",
+    "net.hybridize(static_shape=True, static_alloc=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Training loop"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Epoch [0], Loss 0.2246280246310764\n",
+      "Epoch [1], Loss 0.14493223337026742\n",
+      "Epoch [2], Loss 0.13147933666522688\n",
+      "Epoch [3], Loss 0.12138325943906084\n",
+      "Epoch [4], Loss 0.11291297684367906\n",
+      "Epoch [5], Loss 0.10611823453741559\n",
+      "Epoch [6], Loss 0.09942417470817892\n",
+      "Epoch [7], Loss 0.09408332955124032\n",
+      "Epoch [8], Loss 0.08883619716024807\n",
+      "Epoch [9], Loss 0.08491455795418502\n",
+      "Epoch [10], Loss 0.0809355994402352\n",
+      "Epoch [11], Loss 0.07784551636785524\n",
+      "Epoch [12], Loss 0.07570812029716296\n",
+      "Epoch [13], Loss 0.07417513366438384\n",
+      "Epoch [14], Loss 0.07218785571236895\n",
+      "Epoch [15], Loss 0.07093704352944584\n",
+      "Epoch [16], Loss 0.0700181406787318\n",
+      "Epoch [17], Loss 0.0689836893326197\n",
+      "Epoch [18], Loss 0.06782063459738708\n",
+      "Epoch [19], Loss 0.06713279088338216\n"
+     ]
+    }
+   ],
+   "source": [
+    "epochs = 20\n",
+    "for e in range(epochs):\n",
+    "    curr_loss = 0.\n",
+    "    for i, (data, _) in enumerate(train_data):\n",
+    "        data = data.as_in_context(ctx)\n",
+    "        with autograd.record():\n",
+    "            output = net(data)\n",
+    "            # Compute the L2 and L1 losses between the original and the generated image\n",
+    "            l2 = l2_loss(output.flatten(), data.flatten())\n",
+    "            l1 = l1_loss(output.flatten(), data.flatten())\n",
+    "            l =  l2 + l1 \n",
+    "        l.backward()\n",
+    "        trainer.step(data.shape[0])\n",
+    "        \n",
+    "        curr_loss += l.mean()\n",
+    "\n",
+    "    print(\"Epoch [{}], Loss {}\".format(e, curr_loss.asscalar()/(i+1)))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Testing reconstruction"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We plot 10 images and their reconstruction by the autoencoder. The results are pretty good for a ~25x compression rate!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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/vrrk63PJxH586ifffSZTvvYnxdnz56d7NJzUp3Qc8ScOXOyMn1O0P596KGHsnpjxoxJ9pe+9KU27YiIW2+9NdnHHntsVqYxvnSNP/3007N6Bx544Ko/oovBEwgAAAAAAAAAoAbwEggAAAAAAAAAoAY0pR+fSmwictdVdbVyF3B189K0e/53jboql9wH1SXbZQnqfqnyBU1Z53ja17/85S/J1hSP7qbZTKxJ+s015eyzz062u+tqKk1tO+8nHVc+JrTf1CXa01LvuOOOyb755puzsq997WvJHjp0aLLdlVPHkstpupqNNtqosqwkBys4YHNIAAAgAElEQVSldNf+atSdXWU7Jdd2v4aOSZVNrE469Kpx7e7xXUl7pHNXV/mI3MVcpY0ReVuqG7mn+9bxM2nSpDavHZG78n7+85/Pym666aZkq+zC71ddqX2drEq36muC/p2uARGrrjOtgM6l0t6q/O53v0v24sWLszJde7fffvusbPLkycmePn16sl1uqWugnwU0/ar2v6aAjcjHncvNujuXX3559llT1+r49bFdkshXsXz58uzzxhtvnGxdQ3Wfjcj3gzqkOva02a9ROmsuW7Ys+6x7YWkuapnac+fOzeq5RE/R/aIk49drlORrOherJMBdgUu2Tz311GS7xFnbRPc0fw7Q8fz0009nZdpXej7wNOorVqxI9ssvv9ymHZGfe3yd1OcMLfP5pmuyjyX9bfp3fg0dF6U0881M6XlOZXwR+bzVs46eRSJyOZjie47uWx7SQ89WjzzySLI95TlysFV53/vel2yXg6lcUsfzuHHjsnq//vWvk61nPj+/6LnHn9d1bF188cXJ9jAvKqceNWpUVvbHP/4xugI8gQAAAAAAAAAAagAvgQAAAAAAAAAAagAvgQAAAAAAAAAAakBTxgTydN2qY9W4DK5b1ZgQrvdVDaXartnWzxqPwL+rKk5RRK6H1/v1elX37tfQ+23mdIwaL8BjyUyZMqWha+jfud5W0zZqPY9HoG3pcUMU1YC7Pr8qFbGnftS4OEcccURWpmkDVb/t8St0zLnuvqv19aX20znmKbm1T0oxfEoxE7RtS2lOS/G5tG4pda9ew+eYj6/XUK14V+PxiVR37mnQta7a3nal9Ur/Tsesz6PHH3882RoHxtN2a7wY/y0610vxE7Q/fL2uGge+7moMjAULFmRl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iofoZ5jORmPleNwN/d16vojIY6LpOuPrU58+fZLdt2/frMzXq9copVzXmCR+ptZ29bO/pjjXPVJjAPnfef+WzqWK7ov+W6riSzUDpT1b2+Xwww/PyjT+0uWXX55sXTcj8vVws802S7amJI+ImDhxYrK33nrrrGz69OnJ1vN+1bmzLeoaE0ifLfxcq/GVnn766WRfc801WT09p+he6jGHNYabPy8OHz482Z/73OeSPWXKlKyexlD0awwaNCjZTz31VHQWeAIBAAAAAAAAANQAXgIBAAAAAAAAANSAppSDuQufuiKqq2lJDuYpiFWeom527uqp362usO4qqW6a7n5XlXaxhP+WAw88MNnqrlvlbtpZaF94G6t8RF31I/KUieoO6S582pYlWUhJIqdlJVdVreeprXWclSQZmvrT+0Z/m44DHy9a5ik8Nd1pV+AyIL3XUhrbu+66K9meRrpKguLtp+61+r3e3/p3jz76aFam/aXX8HGnY1elLxGrSsdeo6vlYDo/3M1b5TADBw7MyrQddE65bEw/l6QA+l0+XtYEl/aoW29JetsoVWl8I/I1zde3rkiFq2tUe0huXOqo+4y2y4QJE7J62q86L3/2s59l9W6//fZkb7nlllnZ97///WRr6vdNNtmkoXuPyPtE572PT+2rVnePV1f3KrlcRN4OmgK7hKbZjYjYfvvtk61joiukks2EniO1D3wN0ZTGKt2LiDjggAOSrdJJl3mpDEjH+Z///Oesnu5P3j9z5sxJtsoe/Pyh+6LPdR1fuo90tRxMJTV6DonIzyIuU9eU8SqD97ONziNvryrZVGnf0vOQn5VUFqhS24iISZMmtXmPO++8c1av9Dyic7iUIl5/s/+WZpaCltYllUtqW0bk81klf34W/OY3v5nsffbZJ9kq7YmIeN/73pfs8ePHZ2Ua+kPn23HHHZfVGzVqVLJVrhaR91cz90d7o/u+/25dk1Su5VK9H/3oR8nWsf3BD34wq6eyMZeYL1y4MNkqF917772zero3eB/uv//+yb7pppuis8ATCAAAAAAAAACgBvASCAAAAAAAAACgBvASCAAAAAAAAACgBjRlTCDXo6pOT+NDTJ06tfIarktW7WApno9qeqvSxUfkGlwv08+qm3YtrcY28ZhAVekaPV5GZ3PiiScm+2Mf+1hWphpK1a1H5HELtM09boHGNvEY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
 
 Review comment:
   Nit: Would being more specific and saying 'encoder network' be helpful to readers?

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services