{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Convolutional Neural Networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many weights are in a fully-connected classification neural network for MNIST digits that has 20 units in one hidden layer and 10 units in the output layer?\n", "\n", "Each unit in hidden layer has 28 x 28 = 784 plus 1 weights, so the hidden layer has (784 + 1) x 20. The output layer has (20 + 1) x 10 weights." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15910" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "785 * 20 + 21 * 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's quite a few weights. Can this number be reduced? Remember, larger numbers of weights probably require more samples to train them.\n", "\n", "Well, we could provide each hidden unit with just part of the image, such as a 10 x 10 patch. We could assign each unit a random patch. Then we would have (100 + 1) x 20 + 21 * 10 weights." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2230" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "101 * 20 + 21 * 10" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.14016341923318668" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2230 / 15910" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wow, a little over one tenth the number of weights.\n", "\n", "But this assignment of patches to each unit may end of missing parts of an image that are critical for correct classification. We could add more units to cover more parts, but now our number of weights is growing. Can we cover more parts of the image without increasing the number of weights in each unit and the number of units?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The answer, no surprise, is yes! We can apply a hidden unit that receives 10 x 10 image patches to all 10 x 10 patches from an image. Imagine that a unit has a lens that only sees a 10 x 10 patch. That lens can be shifted around an image, each time passing the viewed patch through the unit and producing a scalar output. Each of these outputs can be assembled into another image.\n", "\n", "For our 10 x 10 unit, this would result in the following process. Our 28 x 28 image of digits will result in a 2 x 2 set of 10 x 10 non-overlapping patches, with 8 pixels left over on right and bottom parts of the image. Applying one hidden unit to these four patches produces four outputs that are arranged in a 2 x 2 image. Each of these outputs represents how well the pattern in the unit's weights match the intensities in each patch.\n", "\n", "This process of shifting the focus of a unit across an image is a [convolution](https://setosa.io/ev/image-kernels/). The weights in a hidden unit are often called a kernel or a filter.\n", "\n", "With 20 units in the hidden layer, we will have 20 much smaller images produced. The weights in one unit might be values that result in the largest output when the patch has a vertical edge. The weights in a second unit might be values that result in the largest output when the patch has a curve like a smile or like the bottom of a hand-drawn digit 3." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have a network with 2230 weights that can process an entire image, at the cost of some processing time to do the convolution and some storage for storing the smaller images as the output of a convolutional layer. For our simple example the additional computation and storage cost is small.\n", "\n", "What if we allow overlapping patches? Let's shift, or \"stride\", the lens of each unit by one pixel left-to-right, and top-to-bottom. How many patches does this make? Left-to-right gives us 28 - 10 + 1 = 19 patches, and similarly going top-to-bottom. So each unit will be applied 19 x 19 times to produce a new image that is 19 x 19 = 361. So, each hidden unit now produces 361 values. When we were not convolving, each unit produced 1 value, so the output layer received 20 values, one for each unit. Now our output layer receives 361 values for each unit, or 361 x 20 = 7220 values. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Anyway, let's move on to some actual examples of images, patches, and convolutions." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "import pickle\n", "import gzip" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(50000, 784) (50000, 1) (10000, 784) (10000, 1) (10000, 784) (10000, 1)\n" ] } ], "source": [ "with gzip.open('mnist.pkl.gz', 'rb') as f:\n", " train_set, valid_set, test_set = pickle.load(f, encoding='latin1')\n", "\n", "Xtrain = train_set[0]\n", "Ttrain = train_set[1].reshape(-1, 1)\n", "\n", "Xval = valid_set[0]\n", "Tval = valid_set[1].reshape(-1, 1)\n", "\n", "Xtest = test_set[0]\n", "Ttest = test_set[1].reshape(-1, 1)\n", "\n", "print(Xtrain.shape, Ttrain.shape, Xval.shape, Tval.shape, Xtest.shape, Ttest.shape)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[5],\n", " [0],\n", " [4],\n", " [1],\n", " [9],\n", " [2],\n", " [1],\n", " [3],\n", " [1],\n", " [4]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ttrain[:10]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([3])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ttrain[7]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "three = Xtrain[7, :].reshape(28, 28)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def draw_image(image, label):\n", " plt.imshow(image, cmap='gray')\n", " plt.xticks([])\n", " plt.yticks([])\n", " plt.title(label)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGZCAYAAABmNy2oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAALNUlEQVR4nO3cT4iV5QLH8ecMTmE0MyhFNKVURJuEoIVUSLWoJKtlYKhk9A8DqUVFULRq0yYopGgohKhFuPEPJCJkIO1dDLQqwolBhiLnDOWUct67ufzgdvU6z7lzzqszn8925sf7LHS+vnPw6TRN0xQAKKWMtH0AAK4cogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiwKp16tSp8sQTT5SNGzeWtWvXlvXr15f777+/fPnll20fDVqzpu0DQFvOnj1bNmzYUJ555plyyy23lD/++KN89dVXZdeuXeXnn38u77zzTttHhKHruPsI/tN9991XZmdny+nTp9s+CgydXx/BP9xwww1lzRov0axO/uSz6vV6vdLr9crvv/9eDhw4UI4dO1b27dvX9rGgFaLAqvfKK6+UTz/9tJRSyjXXXFM++uij8vLLL7d8KmiHzxRY9U6fPl3m5ubK3NxcOXLkSJmamirvv/9+ef3119s+GgydKMA/7Nmzp3z22Wdldna23HjjjW0fB4bKB83wD5s3by4XLlwoP/30U9tHgaETBfiHEydOlJGRkXLHHXe0fRQYOh80s2q99NJLZXx8vGzevLncdNNN5ddffy0HDhwoX3/9dXnjjTf86ohVyWcKrFr79+8v+/fvLz/88EM5e/Zsuf7668s999xTXnjhhbJz5862jwetEAUAwmcKAIQoABCiAECIAgAhCgDEkv6fQq/XK7Ozs2VsbKx0Op1BnwmAZdY0TVlYWCiTk5NlZOTS7wNLisLs7GzZsGHDsh0OgHbMzMyUW2+99ZJfX9Kvj8bGxpbtQAC053I/z5cUBb8yAlgZLvfz3AfNAIQoABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECsafsArB533XVXX7vR0dHqzYMPPli9+fjjj6s3vV6verMSHTp0qHqzffv2vp71999/97VjabwpABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAESnaZrmct/U7XbLxMTEMM5DC+6+++7qze7du6s3Tz/9dPWmlFJGRur/7TI5OVm96XQ61Zsl/PXhEr744ou+dq+99lr1ptvt9vWslWh+fr6Mj49f8uveFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQDChXiUw4cPV2+2bds2gJO0y4V4V4eHHnqoevP9998P4CRXJxfiAbBkogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgCEKAAQa9o+AO07fvx49WaYt6TOzc1Vbz7//PPqzchI/b+Rer1e9aZfDzzwQPWmnxtFWd28KQAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgBEp2ma5nLf1O12y8TExDDOQwvWrKm/F/Hmm28ewEku7vz589WbM2fODOAk7RofH6/eTE9PV28mJyerN/04ePBgX7sdO3ZUb/7666++nrUSzc/P/88/S94UAAhRACBEAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAKL+JjRWnAsXLlRvZmZmBnAS/petW7dWb9atWzeAkyyPX375pa+dy+0Gy5sCACEKAIQoABCiAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQLgQD4Zs+/btfe1efPHF6s3atWv7etYwvPvuu20fgYvwpgBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgAhCgCEKAAQogBAuCUV/m3Hjh3Vm7feeqt6c+edd1ZvSilldHS0r90wnDp1qnpz/vz55T8I/zdvCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAECIAgDhQjzKbbfdVr3ZtWtX9eaRRx6p3gzTli1bqjdN0wzgJMun2+1Wb/q55O+bb76p3pw7d656w+B5UwAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIF+KtMJs2bareHD58uHqzcePG6g3Dd/LkyerN1NTUAE7C1cKbAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAEC4EI/S6XSGsrnSjYzU/xup1+sN4CTL58knn6zePP7449Wbo0ePVm+4MnlTACBEAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAgX4q0w09PT1ZuHH364erNz587qzbFjx6o3pZSyuLjY1+5K9fzzz/e127t37zKfBP6bNwUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIUQAgRAGAEAUAotM0TXO5b+p2u2ViYmIY54EVr9+/S7/99tsyn+TinnrqqerN0aNHB3ASBmF+fr6Mj49f8uveFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBiTdsHgNVm69atbR8BLsmbAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAEC4EG8IRkdHqzePPfZYX8/69ttvqzfnzp3r61mU8txzz1VvPvzwwwGcBJaHNwUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIUQAgRAGAcCFepS1btlRv3n777erNo48+Wr0ppZTbb7+9ejMzM9PXs65k69evr95s27atevPBBx9Ub6677rrqTb/6uexwcXFxACfhauFNAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBciFdp37591ZtNmzYN4CQX9+abb1ZvFhYWBnCSdvVzoeC9995bvWmapnrTr++++65688knn1RvTpw4Ub1h5fCmAECIAgAhCgCEKAAQogBAiAIAIQoAhCgAEKIAQIgCACEKAIQoABCiAEC4JXWF2bNnT9tHWFXm5uaqN0eOHOnrWa+++mr1ZnFxsa9nsXp5UwAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIF+JV2r17d/Vm79691Ztnn322erNS/fjjj9WbP//8s3pz8uTJ6s3U1FT1Znp6unoDw+JNAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACA6TdM0l/umbrdbJiYmhnGeFenaa6+t3vRz8V4ppbz33nvVm3Xr1lVvDh48WL05fvx49aaUUg4dOlS9OXPmTF/PgpVufn6+jI+PX/Lr3hQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIUQAgRAGAEAUAwoV4AKuIC/EAWDJRACBEAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACBEAYAQBQBCFAAIUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhRACCWFIWmaQZ9DgCG4HI/z5cUhYWFhWU5DADtutzP806zhNeAXq9XZmdny9jYWOl0Ost2OACGo2masrCwUCYnJ8vIyKXfB5YUBQBWBx80AxCiAECIAgAhCgCEKAAQogBAiAIA8S+Er8BjL0vqmQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "draw_image(three, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's invert the values, so the bright 3 is dark, like an actual pencil drawing." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def draw_neg_image(image, label):\n", " plt.imshow(-image, cmap='gray')\n", " plt.xticks([])\n", " plt.yticks([])\n", " plt.title(label)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_neg_image(three, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of 10 x 10 patches, let's extract non-overlapping 7 x 7 patches from this image. We can use two for loops: an inner loop to step across columns left-to-right and an outer loop to step down the rows top-to-bottom, and collect each patch into a list called `patches`." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patches = []\n", "for row in range(0, 28, 7):\n", " for col in range(0, 28, 7):\n", " patches.append(three[row:row + 7, col:col + 7])\n", "len(patches)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "22" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "28 - 7 + 1" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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TKfTMplM1nI42CYnJyfl0qVLK73HPrCr7AMs2QdY6rIPnaJiNBqt5UCwbc5yby/ec3JyUsbj8bqPtBE//OEPq8x59913q8zhbJJ9gF2z7ftw7dq1KnMefvjhKnPYTrPZrEwmk073dqeo8AiPXXWWe3vxnvF4vDNRsb+/v+kjsAWSfajBZxE1tG1bStn+ffjqV79aZc6ufM6R6XJv+0VtAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAIDIcNMHADbv0UcfrTLn7bffrjKnlgsXLlSZc+XKlV6vf+PGjfLiiy9G13j22WfLwcHBmk705fD+++9XmfOHP/yhyhzgy82TCgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAIDJo27b9Xy+azWbl6Oioxnmgqo8//riMx+OV3rPYh7O8d1vdunWrypx//vOfVebUsr+/X2XOxYsXe71+ck/v4j7UMpvNqsy5fPlylTnT6bTKnL4tvhYl+/Cd73yn958Pr7/+eq/XXzg4OKgyh+20ys94TyoAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAIDIcNMHADZvOKzzo2AymVSZA3eDa9euVZnz0UcfVZnD0te+9rVy7ty5XmccHBz0en1YlScVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABAZLjpAwDANnn99derzPnlL39ZZc7p6WmVOSw999xzZTweb/oYUJUnFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQGS46QMAcPd74403yuHhYa8znn/++V6vv/C3v/2typzPPvusypxd841vfKPX69++fbv88Y9/jK6xv79f9vf313QiuDt4UgEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAESGmz4AsHl///vfq8x59dVXq8x59913q8zZFbdu3Yqv8dRTT63hJF9sMBj0PmMXjcfjKnNeeOGFKnMef/zxXq/fNE25fPlydI3Dw8NyeHi4phPB3cGTCgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIgMu7yobdu+zwEbcZZ7e/Ge2Wy27uNsTNM0Veb8+9//rjLn1q1bVebsisX/r2QfavBZdDa1/r+dnp5WmdP3z6vr16+XUnw+QCnLe7nLPnSKilpfOKC2pmnK0dHRyu8ppZTJZNLHkWBjkn1ge9X6gvvTn/60ypxafD7AUpd9GLQd0mM+n5fpdFpGo1EZDAZrOyBsStu2pWmacnx8XPb2VvtXgPaBXWMfYMk+wNIq+9ApKgAAAO7EL2oDAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABAZNjlRfP5vEyn0zIajcpgMOj7TNC7tm1L0zTl+Pi47O2t1tb2gV1jH2DJPsDSKvvQKSqm02mZTCZrORxsk5OTk3Lp0qWV3mMf2FX2AZbsAyx12YdOUTEajT6/4Hg8zk8GGzabzcpkMvn83l5FzX3485//3Ov1F5588skqc05OTqrM4WySfSil9P43s/7m92wee+yxKnN+85vfVJnTt3V8PsCu6XJvd4qKxQ/y8XgsKtgpZ/mSUnMf7r333l6vv7DqI/6z8qVwO7VtW0rJ9mEwGIiKLbW/v19lzq59P0j2AXZNl3vbL2oDAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAESGmz4AsHlt2+7UHOpr27b3P9+9PX8PdhZvvfVWlTnvvPNOlTnf/va3q8wBVuMnNAAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBlu+gDAnT344INV5rz33ntV5vz617+uMudb3/pWlTnnz5+vMqdv169fLw8//HB0jffff7/ce++9azrRZv3qV7+qMufq1atV5gDU4EkFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQGW76AMDmff3rX68y57nnnqsyh9XMZrP4GpcvXy7j8XgNp9m8X/ziF1XmXL16tcocgBo8qQAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACLDTR8AALbJ7373u00fAeCu40kFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQGW76APDf3Lx5c+uvf+3atXLPPfes4TR39s1vfrPX6y8cHh5WmQOJV155pcqcZ555psocgF3iSQUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABAZbvoA3F3efPPNKnN+9KMfVZmTePLJJ8tgMOh1xj/+8Y9er78wmUyqzOFsPvzww16vP5vN4mu88cYb5fDwcA2nubOf/exnvV5/4dNPP60yp5a+/1xqzwG2kycVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBl2eVHbtqWUUmazWa+HYft9+umnmz7CWi3u7bO+5yzvX0XTNL1ef8Fub7e+/3wW91myD6enp2s90xfN2pU5tdT67/nkk0+qzOl7HxbXTz8fYJd0ubc7RcXiA2cymWQngi3TNE05Ojpa+T21PPDAA9VmQbIPP/nJT/o4EmtQ68v+d7/73Spzatn2zweoqcs+DNoO6TGfz8t0Oi2j0agMBoO1HRA2pW3b0jRNOT4+Lnt7q/0rQPvArrEPsGQfYGmVfegUFQAAAHfiF7UBAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiAy7vGg+n5fpdFpGo1EZDAZ9nwl617ZtaZqmHB8fl7291draPrBr7AMs2QdYWmUfOkXFdDotk8lkLYeDbXJyclIuXbq00nvsA7vKPsCSfYClLvvQKSpGo9HnFxyPx/nJuGs99NBDVeZ88MEHVeYs7u2+33NWV65cqTKn5n8Tq/v973/f6/Vv375d/vKXv2z9PuyaRx55pMqcH//4x1XmPPHEE1Xm9G02m5XJZGIf4D90ubc7RcXiEd54PBYVX3Jf+cpXNn2EtTrL4+maj7TPnTtXZc7BwUGVOZxNrb3b9n3YtX9OMhx2+giO3XPPPVXm7Nr3g23fB6ipy73tF7UBAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACLDTR8AuLOXX35500eArXHhwoUqc773ve9VmfPSSy9VmXP+/Pkqc4AvN08qAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAyHDTB+Du8uqrr1aZ89JLL/V6/Zs3b5bXXnut1xnsvvvuu6/KnMPDw16vf/v27fLBBx9E13jqqafKuXPn1nSiO8+o4cEHH6wyB2CXeFIBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABEBm3btv/rRbPZrBwdHZWPP/64jMfjGufiS+7GjRu9Xn82m5ULFy6c6Z5e7MOLL75YDg8Pezrh//v5z3/e6/UXPvrooypzfvCDH1SZ8+ijj1aZ8/3vf7/KnIsXL/Z6/eRnvM8Hds069gF2TZd98KQCAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIDDd9APhvDg4Otv76V65cKePxeA2nubOnn3661+sDAKyDJxUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQGXZ5Udu2pZRSZrNZr4eBWhb38uLeXoV9YNfYB1haxz7Arulyb3eKiqZpSimlTCaT7ESwZZqmKUdHRyu/pxT7wO6xD7CU7APsmi77MGg7pMd8Pi/T6bSMRqMyGAzWdkDYlLZtS9M05fj4uOztrfavAO0Du8Y+wJJ9gKVV9qFTVAAAANyJX9QGAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAIPJ/y/DgP5HeGZIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 8))\n", "ploti = 0\n", "for patch in patches:\n", " ploti += 1\n", " plt.subplot(4, 4, ploti)\n", " draw_neg_image(patch, '')\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def draw_neg_image(image, label):\n", " plt.imshow(-image, cmap='gray', vmin=-1, vmax=0) # <-- New part\n", " plt.xticks([])\n", " plt.yticks([])\n", " plt.title(label)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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ACv2AVY22Ye1omI2m5XpdLqVy8FFcnJyUo6Pjzd6jH1gX9kHWLEPsLLOPqwVFaPR6P6B4/E4vxns2Hw+L9Pp9P5zexP7uA/PPvtslTnvvvtulTlspuu6slgson1omqb3n8z6yS81bGMfBoNB78/Xt99+u9fzlz75yU9WmcPFtMn7pbWiYrkY4/F4b95EQSnne5Oyj/twcHBQZY43hRdbsg+ign1z0ffhoYce6vX8pX15nSOzzvPZH2oDAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAESGu74AsHtPPPFElTm//e1vq8yp5ZFHHqky58tf/nKv53/wwQfl+eefj8749re/XQ4PD7d0ow/XNE2v59f2/vvvV5nz3nvvVZkDfLT5pAIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIgMd30BYPe++c1vVpnzzDPPVJlTy8HBQZU5jz76aK/nz+fz8vzzz0dn/OAHPyjj8XhLN/poaNu2ypzr169XmTObzarMuQw+97nP9f794ROf+ESv58OmfFIBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABEhru+ALB7DzzwQJU5x8fHVebAZfDOO+9UmXPr1q0qc1iZTCbl8PCw1xlXrlzp9XzYlE8qAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAyHDXFwCAi+T111+vMufVV1+tMufOnTtV5rDyve99r4zH411fA6rySQUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABAZ7voCAFx+b7zxRrl27VqvM3784x/3ev7S3/72typzTk9Pq8zZN48//niv59+7d6/86U9/is44ODgoBwcHW7oRXA4+qQAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACLDXV8A2L1//OMfVebcuHGjypzf/e53Vebsi7t378ZnfOMb3yhN02zhNmfr+/x9NR6Pq8z5yU9+UmXOU0891ev5bduWxx57LDrjwQcfLA8++OCWbgSXg08qAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAIDJc54u6riullDKfz3u9DNSyfC4vn9ub2Md9aNu2ypz//Oc/VebcvXu3ypx9sfz/lezDeR5LHbX+be7cuVNlTt/fr27fvl1K8foApWz2fmmtqFgu8HQ6Da4FF0/btuXo6Gjjx5RiH9g/yT50XScsLqhbt25VmfPcc89VmVOL1wdYWWcfmm6NV4HFYlFms1kZjUalaZqtXRB2peu60rZtmUwmZTDY7LcA7QP7xj7Ain2AlU32Ya2oAAAAOIs/1AYAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAIDIcJ0vWiwWZTabldFoVJqm6ftO0Luu60rbtmUymZTBYLO2tg/sG/sAK/YBVjbZh7WiYjablel0upXLwUVycnJSjo+PN3qMfWBf2QdYsQ+wss4+rBUVo9Ho/oHj8Ti/GezYfD4v0+n0/nN7EzX34ebNm72ev/TFL36xypyTk5Mqc9hM13VlsVhE+9A0Te8/mfWT3/N58sknq8z59a9/XWVO3y7L6wPUsMk+rBUVy2/k4/HYkrBXzvMmpeY+PPzww72ev7TpR/zn5U3hxZbsg6i4uA4ODqrM2bf3Bxf99QFqWmcf/KE2AAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBkuOsLALu3WCyqzOm6rsocNrONf5fFYlGaptnCbc42GPg52Hn85je/qTLn7bffrjLnqaeeqjIH2Izv0AAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQGS46wsAZ7t+/XqVOe+9916VOb/85S+rzHnyySerzDk8PKwyp2+3b98un/rUp6Iz3n///fLwww9v6Ua79fOf/7zKnBdffLHKHIAafFIBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQERUAAAAEVEBAABEhru+ALB7H/vYx6rM+e53v1tlDpuZz+fxGY899lgZj8dbuM3u/fCHP6wy58UXX6wyB6AGn1QAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAACR4a4vAAAXyTvvvLPrKwBcOj6pAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIsNdXwA+zN27dy/8+e+++265du3aFm5zts9+9rO9nr909erVKnMg8dprr1WZ861vfavKHIB94pMKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgIioAAICIqAAAACKiAgAAiIgKAAAgMtz1Bbhc/vjHP1aZ86Mf/ajX809PT+Mznn322dI0zRZuc7a///3vvZ6/dHx8XGUO53Pr1q1ez5/P5/EZr7/+erl69eoWbnO273znO72ev/Tvf/+7ypxa+v53qT0HuJh8UgEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAAARUQEAAEREBQAAEBEVAABARFQAAACR4Tpf1HVdKaWU+Xze62W4+P71r39VmXN6etrr+Xfv3i2lrJ7bm1g+5jyP3VTbtr3PKMVuX3R9//ssn2fJPty5c2erd/r/Zu3LnFpq/ffUen3oex+W5yf74Hsq+2KTfWi6Nb7qn//8Z5lOp/nN4II5OTkpx8fHGz3GPrCv7AOs2AdYWWcf1oqKxWJRZrNZGY1GpWmarV0QdqXrutK2bZlMJmUw2Oy3AO0D+8Y+wIp9gJVN9mGtqAAAADiLP9QGAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAICIqAACAiKgAAAAiogIAAIiICgAAIDJc54sWi0WZzWZlNBqVpmn6vhP0ruu60rZtmUwmZTDYrK3tA/vGPsCKfYCVTfZhraiYzWZlOp1u5XJwkZycnJTj4+ONHmMf2Ff2AVbsA6yssw9rRcVoNLp/4Hg8zm/GpfXpT3+6ypybN2/2en7XdWWxWNx/bm9i+ZjBYND7T6K++tWv9nr+0kMPPVRlDufz+9//vtfz7927V/785z9H+9A0Te/7sG8/+f3MZz5TZc5XvvKVKnOefvrpKnP6Np/Py3Q6jfbB+yX2xSb7sFZULL+Rj8djS/IR98ADD1SZU+vNw3nmLB9T403UlStXej1/6fDwsMoczuci713Nfdi3qBgO13oJjl27dq3KnH17f5Dsg/dL7Jt19sEfagMAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAARIa7vgBwtldeeWXXV+AjoOu6XV9hLY888kiVOZ///OerzHnhhReqzDk8PKwyB/ho80kFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQGe76Alwur732WpU5L730Uq/n//e//y03btzodQb77+Mf/3iVOVevXu31/Hv37pW//OUv0Rlf+9rXyuHh4ZZudPaMGq5fv15lDsA+8UkFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQGe76Alwujz/+eJU5L7/8cq/nz+fzcuPGjeiMn/3sZ+Xq1atbutGH+/73v9/r+Uu3bt2qMueZZ56pMueJJ56oMucLX/hClTmPPvpor+fP5/NydHQUnfHTn/60jMfjLd0IgMvGJxUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBEVAAAABFRAQAAREQFAAAQERUAAEBkuOsLwIe5cuXKhT//S1/6UhmPx1u4zdm+/vWv93o+AMA2+KQCAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIqICAACIiAoAACAiKgAAgIioAAAAIsN1vqjrulJKKfP5vNfLQC3L5/Lyub0J+8C+sQ+wYh9gZZN9WCsq2rYtpZQynU6Da8HF07ZtOTo62vgxpdgH9o99gBX7ACvr7EPTrZEei8WizGazMhqNStM0W7sg7ErXdaVt2zKZTMpgsNlvAdoH9o19gBX7ACub7MNaUQEAAHAWf6gNAABERAUAABARFQAAQERUAAAAEVEBAABERAUAABARFQAAQOR/Zoj9l3tyRRcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 8))\n", "ploti = 0\n", "for patch in patches:\n", " ploti += 1\n", " plt.subplot(4, 4, ploti)\n", " draw_neg_image(patch, '')\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Those all black patches are because all intensities there are 0. Fix this by specifying min and max values to coloring each image." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if we want some overlap? 7 x 7 patches that shift by 2 columns and 2 rows." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "196" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patches = []\n", "for row in range(0, 28, 2):\n", " for col in range(0, 28, 2):\n", " patches.append(three[row:row + 7, col:col + 7])\n", "len(patches)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(len(patches))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_plot_rows = int(np.sqrt(len(patches)))\n", "plt.figure(figsize=(8, 8))\n", "ploti = 0\n", "for patch in patches:\n", " ploti += 1\n", " plt.subplot(n_plot_rows, n_plot_rows, ploti)\n", " draw_neg_image(patch, '')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will need all patches to be the same size, so we must discard the smaller ones on the right and the bottom. Alternatively, we can pad the original image to guarantee all patches are the same size." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "121" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patches = []\n", "for row in range(0, 28, 2):\n", " for col in range(0, 28, 2):\n", " if row + 7 < 28 and col + 7 < 28:\n", " patches.append(three[row:row + 7, col:col + 7])\n", "len(patches)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11.0" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(len(patches))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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Sj5ecQAAAOgJhj8AAABFGP4AAAAUYfgDAABQhOEPAABAEa72RV+cOnXKuvfcc88Z15vNZpfSuLFltuUVEXnllVese61Wy2ktxMmTJ617zz//vHXPljcp1+TkpHXPdBVnFEVePXfv3i0jIyNt675nG7PlTbritNtXb954443G5/c921gvrjYNUS6Xjdnykvf1119vW/O9orlUKvWkjylrbNu2bda9ffv2ta01Gg2v5w7pGJLXlDVWqVS8nt/X4cOHjR19zzbW7by+eOcPAABAEYY/AAAARRj+AAAAFGH4AwAAUIThDwAAQBGGPwAAAEW41Qv64u6777buHTp0yLjue8uFrNky2/KGyKrjPffcY93LMm8vPP7447m5FUi3fP311wPfEb1z4MAB697tt9/etnbmzJluxklly2vKGrviiiu6FSeR79nG+pXXhnf+AAAAFGH4AwAAUIThDwAAQBGGPwAAAEUY/gAAABRh+AMAAFCEW72gLzZt2mTdy+utSGyZQ/OuWbOmba3Vask333wT9HhLZX2+pqyx2267zbpnunVNs9mURx55xDuDj5C8SbfZCbkNS7PZlIcfftjpcy+44AIpl9v/Lu57trGQvMePH7fuHT161PvxTO68804ZGRlpWw+9zY0tc1Z5Q9g69uJ8AVe88wcAAKAIwx8AAIAiDH8AAACKMPwBAAAowvAHAACgiNPVvvFVZfV6vathuiHOnHRl3NL9InYUceuZp44zMzPWPVuHeL1f30tb5rQ8Nq1Wy7rWaceQ801iyhprNptezxV/vmvHXuXtxtW+aY8b79ny+p5tLCTv/Py893P5viZtfUKv9rVlDn1NJj1Wpx1Dzrcbzpw5Y13r5msyhClrzPfPd99ZIKRjlnlDufaUyEGtVotEpNAftVpt4Dum9dTQcVB60nEwOqb11NBxUHrSkY5F+kjrWYqi9PG21WrJ5OSkVCqV4L+h9UsURdJoNGR8fNx4H61YkTuKuPXU0FGk2D3puKjIHUV4TS5V5J50XETH/HPt6TT8AQAAYDBwwQcAAIAiDH8AAACKMPwBAAAowvAHAACgCMMfAACAIgx/AAAAijj9ho8i3/eGe/ss0tBRpNg96bioyB1FeE0uVeSedFxEx/xz7clv+Bigjmk9NXQclJ50HIyOaT01dByUnnSkY5E+0no6vfNXqVRERKRWq0m1WnX5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kT7SepaiKG08/Ou7C5OTk1KpVKRUKqV9eq5EUSSNRkPGx8eN90OLFbmjiFtPDR1Fit2TjouK3FGE1+RSRe5Jx0V0zD/Xnk7DHwAAAAYDF3wAAAAowvAHAACgCMMfAACAIgx/AAAAijD8AQAAKMLwBwAAoIjTb/go8n1vuLfPIg0dRYrdk46LitxRhNfkUkXuScdFdMw/1578ho8B6pjWU0PHQelJx8HomNZTQ8dB6UlHOhbpI62n0zt/lUpFRERqtZpUq1WXL+ma48ePW/ceeeSRtrX5+Xn5z//8zx862HSroy2vKWvs/ffft+59/PHHxvWpqSm5/PLLE3umdfQ925gtry2riMjatWutezb1el0mJiacv5dXXXWVLFvW/iMecr4iYZl9+Xb805/+JGNjY237vcgaO336tHXv7bffblubmZmRf/mXf+nba9KW15Q19utf/9q6Z/u9vFEUSavV6ug16Xu2MVvepN95nMT2O4ajKJIzZ844fy/37dtnfKyQ802S9DuR//3f/926d+WVV7at+b4my+Wy9ztGIXlNWUP5dly1apWxo+/Z9pJvxzzMOyFcezoNf/E3uVqt9v0wVq1aZd0bHh627qW9GLvV0ZY3NGvaNzTpa9M6Zn22SVk7OWPX7+WyZcuMuUPPt5c/+64dx8bGjJl7mXVhYcG6l/QftX69Jm15Q7O69kjas3XM+mxD/zdWJx2X7o+Ojhpzd3K+vl+T9Odc0s+Za8dSqeSdOSRvN17jnXYMPdte6tefO72W1pMLPgAAABRh+AMAAFCE4Q8AAEARp3/zlye7du2y7p08ebJtLYqibsZJZctryupi7969xvXZ2dmgx1vK92zT2LKKiPEihTTNZtPr899//33vf3uTdWZfvh337dsny5cvb1vvRdbYO++8Y907ceJE25rva/K+++6TkZER71w2trymrLFu3/LB1tH3bGMhea+66irr3o4dO4zr09PTcssttzg/x/bt243ZQs/XltmWN+lrui3kfNO+rl/2798vK1eubFvPY1aY8c4fAACAIgx/AAAAijD8AQAAKMLwBwAAoAjDHwAAgCIMfwAAAIoU7lYv2u3fv9+43u9b2pjYsobqRcesM/vy7fj00093/TYk/bZv376+d1yzZo1177rrrjOuz87OyrPPPuv0+Fl3tOW1ZY0z2NhutVOv1/2CWYScr4g9c5a3BvJ16623Gm+/FHK+ebVly5ZC/+oz8M4fAACAKgx/AAAAijD8AQAAKMLwBwAAoAjDHwAAgCIMfwAAAIoU7lYvSbdO+N3vfte2Njs7KwcOHOhmpES2vKassd///vfdipPI92xj/cqb5he/+IXxlgt5yfuTn/ykbW1hYUH+/Oc/9yFNMlPW2OjoqHXvpz/9adtas9mUJ598MpNcNiF5TVljW7dute5t2LDBuF6v151v9fLjH/9YhoaG2tZ9zzZmy2vL2itbt2413tYk5Hzz6je/+Q23QUHu8c4fAACAIgx/AAAAijD8AQAAKMLwBwAAoAjDHwAAgCKFu9r30ksvte498cQTbWv1er2vV/va8pqyxi6//HLr3r333mtcb7Va8u2333plO5fv2cZseW1ZRUROnz5t3bvhhhuM63Nzc/LHP/7R+nXnevTRR41X3YWcr4g9sy2viMimTZuse9dff33bWqPRkIsvvtj6Nef60Y9+JOVy+9/hQs5XxJ7XlDV24YUX2gMa1Ot1r6t9f/7zn8vw8HDbuu/Zxnzz9sLhw4elUqm0recxayf27t3LlbBADvDOHwAAgCIMfwAAAIow/AEAACjC8AcAAKAIwx8AAIAiDH8AAACKFO5WL0mWL1/utJYHSbl++ctfeu/V63VZvXp1x7lsQvIm9Qjh23H58uXG3CHn2yujo6Nen/8///M/A3/rjOeff37gO65Zs2bgOwLID975AwAAUIThDwAAQBGGPwAAAEUY/gAAABRh+AMAAFCE4Q8AAEARhj8AAABFGP4AAAAUYfgDAABQhOEPAABAEYY/AAAARRj+AAAAFFnm8klRFImISL1e72qYbogzxx1sitxRxK2nho5L94vYk46LitxRhNfkUkXuScdFdMw/155Ow1+j0RARkYmJiQ5j9U+j0ZDVq1cn7osUu6NIck8NHeN9kWL3pONgdBThNRnvixS7Jx3pWCRpPUtR2ngoIq1WSyYnJ6VSqUipVMo0YLdFUSSNRkPGx8elXLb/X+4idxRx66mho0ixe9JxUZE7ivCaXKrIPem4iI7559rTafgDAADAYOCCDwAAAEUY/gAAABRh+AMAAFCE4Q8AAEARhj8AAABFGP4AAAAUYfgDAABQ5P8DO+cmgqOMnQ0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_plot_rows = int(np.sqrt(len(patches)))\n", "plt.figure(figsize=(8, 8))\n", "ploti = 0\n", "for patch in patches:\n", " ploti += 1\n", " plt.subplot(n_plot_rows, n_plot_rows, ploti)\n", " draw_neg_image(patch, '')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Are these patches using lots of storage, or are they just views onto the original image array? Hopefully they are just views. Test this by modifying the original image in the upper left corner and that redrawing the patches." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.]], dtype=float32)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "three[0:4, 0:4]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "three[0:4, 0:4] = 1.0" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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lUpt673Km2bz5s1ta6bXaZILLrjA2DFrpqyxgwcPWveGh4c7/t4hHUPyZpE11K233mr8/t0+217JxysOAAAAPcHwBwAAoAjDHwAAgCIMfwAAAIow/AEAACjC1b7oi1OnTln3nn/+eeN6s9nsUho3tsy2vCIir776qnWv1Wo5rYU4efKkde+FF16w7tnyJuWamJiw7pmu4oyiyKvnrl27ZGRkpG3d92xjtrxJV5x2++rNm2++2fj9fc821ourTUOUy2VjtrzkfeONN9rWfK9oLpVKPeljyhrbunWrdW/v3r1ta41Gw+t7h3QMyWvKGqtUKl7f39fhw4eNHX3PNtbtvL545w8AAEARhj8AAABFGP4AAAAUYfgDAABQhOEPAABAEYY/AAAARbjVC/ri3nvvte4dOnTIuO57y4Ws2TLb8obIquN9991n3csyby88+eSTubkVSLd88803A98RvXPgwAHr3p133tm2NjU11c04qWx5TVljV111VbfiJPI921i/8trwzh8AAIAiDH8AAACKMPwBAAAowvAHAACgCMMfAACAIgx/AAAAinCrF/TFxo0brXt5vRWJLXNo3lWrVrWttVot+fbbb4Meb7Gsz9eUNXbHHXdY90y3rmk2m/LYY495Z/ARkjfpNjsht2FpNpvy6KOPOn3uRRddJOVy+9/Ffc82FpL3+PHj1r2jR496P57J3XffLSMjI23robe5sWXOKm8IW8denC/ginf+AAAAFGH4AwAAUIThDwAAQBGGPwAAAEUY/gAAABRxuto3vqqsXq93NUw3xJmTroxbvF/EjiJuPfPUcWZmxrpn6xCv9+u5tGVOy2PTarWsa512DDnfJKassWaz6fW94s937dirvN242jftceM9W17fs42F5J2fn/f+Xr6vSVuf0Kt9bZlDX5NJj9Vpx5Dz7YapqSnrWjdfkyFMWWO+f777zgIhHbPMG8q1p0QOarVaJCKF/qjVagPfMa2nho6D0pOOg9ExraeGjoPSk450LNJHWs9SFKWPt61WSyYmJqRSqQT/Da1foiiSRqMhq1evNt5HK1bkjiJuPTV0FCl2TzouKHJHEV6TixW5Jx0X0DH/XHs6DX8AAAAYDFzwAQAAoAjDHwAAgCIMfwAAAIow/AEAACjC8AcAAKAIwx8AAIAiTr/ho8j3veHePgs0dBQpdk86LihyRxFek4sV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LV261LqX9Gdivzra8iZlDR2mOu0Yera9Gv5iaT254AMAAEARhj8AAABFGP4AAAAUcfo3f0DW7r33XuveoUOHjOtJ/8C9F2yZbXlDZNUx5Hzz6sknn+z7v6Hqtm+++WbgO6J3Dhw4YN27884729ampqa6GSeVLa8pa+yqq67qVpxEvmcb61deG975AwAAUIThDwAAQBGGPwAAAEUY/gAAABRh+AMAAFCE4Q8AAEARbvWCvti4caN1L6+3IrFlDs27atWqtrVWqyXffvtt0OMtlvX5mrLG7rjjDuue6dY1zWZTHnvsMe8MPkLyZv27cpvNpjz66KNOn3vRRRcZf72b79nGQvIeP37cunf06FHvxzO5++67jb+qL/Q2N7bMWeUNYevYi/MFXPHOHwAAgCIMfwAAAIow/AEAACjC8AcAAKAIwx8AAIAiDH8AAACKcKsX9MX27dutezfddJNxvdFoyLp167qUKJ0tsy1vmuHh4ba1RqMhl156adDjLRZyvklMWWMXX3yx12PV63WvW7188sknUqlUvL5HlnlD1et151u9fPjhh8aOvcoq8tefPZv169cb11utlnz99dfO32PXrl1SrVa9s9nYMtvyiohMTExk9v1N7r//fmPHkPMVCcub9Bq/4oor2tbq9brX419yySXGWxOFnq0trylrv/mebV7xzh8AAIAiDH8AAACKMPwBAAAowvAHAACgCMMfAACAIlzti74YGhqy7q1du9a47ntFWtZsmW15Q4yOjmbyOCHnm1dr1qzJ9ArRPFq1alXfOx45csS6d/r0aeN6FEXdiuPEltmWt59CzjdU0mt86dKlTmtJvv/+eymVSt65bGx5fXP1gu/Z5hXv/AEAACjC8AcAAKAIwx8AAIAiDH8AAACKMPwBAAAowvAHAACgCLd6AYAOHDx40Lg+PT3d4yTpbFlFRJ555hnr3szMjHG9F7d6Cclsy9sLr732mixfvrxtPeR8Qz344IOZPt75ZmZmMr3VS7fzZqlIWZPwzh8AAIAiDH8AAACKMPwBAAAowvAHAACgCMMfAACAIgx/AAAAinCrFwBd8/LLL7et5fEWKCLmrLFHHnnEuvf5558b17t9G5SQvLasIiJzc3MdZ0rzyiuvGG+DEnK+Itlnvvzyy9vWzp07JydOnHB+jB07dhhvg9KLrLHh4eFMv1cWipb3sssuk6Gh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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_plot_rows = int(np.sqrt(len(patches)))\n", "plt.figure(figsize=(8, 8))\n", "ploti = 0\n", "for patch in patches:\n", " ploti += 1\n", " plt.subplot(n_plot_rows, n_plot_rows, ploti)\n", " draw_neg_image(patch, '')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yep, just views. Good!\n", "\n", "Now let's reset those pixels." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "three[0:4, 0:4] = 0.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Weight matrix as kernel or filter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, how would we create a unit as a kernel or filter and apply it to all patches? \n", "\n", "It is just a 7 x 7 matrix. Let's make one that detects diagonal edges from lower left to upper right." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-1, -1, -1, -1, -1, -1, -1],\n", " [-1, -1, -1, -1, -1, -1, 1],\n", " [-1, -1, -1, -1, -1, 1, 1],\n", " [-1, -1, -1, -1, 1, 1, 1],\n", " [-1, -1, -1, 1, 1, 1, 1],\n", " [-1, -1, 1, 1, 1, 1, 1],\n", " [-1, 1, 1, 1, 1, 1, 1]])" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights = np.array([[-1, -1, -1, -1, -1, -1, -1],\n", " [-1, -1, -1, -1, -1, -1, 1],\n", " [-1, -1, -1, -1, -1, 1, 1],\n", " [-1, -1, -1, -1, 1, 1, 1],\n", " [-1, -1, -1, 1, 1, 1, 1],\n", " [-1, -1, 1, 1, 1, 1, 1],\n", " [-1, 1, 1, 1, 1, 1, 1]])\n", "weights" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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ISEe48rKyhQcHGzo30tDEO4AAFPyR7i/8sormjJlip588kn16dNHS5YsUXR0tFauXFnjeJvNpoiICPdy6NAhnT9/Xr/5zW88xlksFo9xERERhv6dNBThDgAIaE6n02OpqKiocVxlZaUKCwuVmprqsT41NVX79+9v0LFWr16t+++/v9o3pV66dEndu3dX165dNXr0aBUVFRk7mQYi3AEAptRUnXt0dLRsNpt7ycrKqvF4Z8+eVVVVlcLDwz3Wh4eHy26311tvWVmZtm7dqieffNJjfe/evbVmzRpt3rxZ69evV3BwsIYMGaKTJ08a/DdTPx6FAwCYUlM9CldaWqqQkBD3eqvVWud2Foul2n5+vq4ma9asUceOHTV27FiP9UlJSUpKSnJ/HjJkiOLi4vTqq69q2bJl9e7XCMIdABDQQkJCPMK9NqGhoWrVqlW1Lr28vLxaN/9zLpdLf/vb35Senq6goKA6x95000268847fdq5My0PADCl5r6hLigoSPHx8crLy/NYn5eXp5SUlDq33b17t7744gtNmTKlQedVXFysyMhIr+rzBp07AMCU/PGGuszMTKWnpyshIUHJycnKzs5WSUmJpk6dKkmaO3euzpw5o7Vr13pst3r1aiUmJio2NrbaPhcuXKikpCT17NlTTqdTy5YtU3FxsV577TVjJ9YAhDsAAP+Qlpamc+fOadGiRSorK1NsbKy2bNnivvu9rKys2jPvDodDOTk5Wrp0aY37vHDhgp566inZ7XbZbDYNGjRIe/bs0eDBg312HhZXM7981+l0ymazNechAcCvAukd59d/hzscjgZdx27MMQ4fPqwOHToY3s/FixcVFxfn01rNis4dAGBagfSHUXPihjoAAAIMnTsAwJT4ylfjCHcAgCkR7sYR7gAAUyLcjeOaOwAAAYbOHQBgSnTuxhHuAABTItyNY1oeAIAAQ+cOADAlOnfjCHcAgCkR7sYxLQ8AQIChcwcAmBKdu3GEOwDAlAh345iWBwAgwNC5AwBMic7dOMIdAGBKhLtxhDsAwJQId+O45g4AQIChcwcAmBKdu3GEOwDAlAh345iWBwAgwHgd7nv27NGYMWMUFRUli8Wi999/3wdlAQBauuude2OWlsrrcL98+bIGDhyo5cuX+6IeAAAkEe6N4fU191GjRmnUqFG+qAUAADQBn99QV1FRoYqKCvdn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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(weights, cmap='gray')\n", "plt.colorbar();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Which of the above patches do you think will result in large positive values and large negative values.\n", "\n", "Okay, let's apply this filter to all of the patches. To do this, we just need to multiply the intensities in a patch by the corresponding weight and sum them up." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0. , 0.7109375 , 2.78515625,\n", " 6.1640625 , 8.55859375, 9.3984375 , 7.56640625,\n", " 4.328125 , 0.3828125 , -1.015625 , 0. ,\n", " 0. , 3.80078125, 9.7265625 , 13.00390625,\n", " 9.80859375, 7.33203125, 6.828125 , 3.02734375,\n", " -2.53125 , -3.8671875 , 0. , 0. ,\n", " 3.9296875 , 6.953125 , 1.87890625, -5.94140625,\n", " -4.44921875, -0.90625 , -2.390625 , -10.3515625 ,\n", " -8.80859375, 0. , 0. , 1.1171875 ,\n", " -3.37109375, -10.13671875, -11.8671875 , -4.65234375,\n", " 2.14453125, -8.50390625, -17.91015625, -11.0859375 ,\n", " 0. , 0.17578125, 1.328125 , 2.67578125,\n", " 4.921875 , 5.38671875, 10.796875 , 2.0703125 ,\n", " -14.62890625, -18.84765625, -7.41015625, 0. ,\n", " 0.3515625 , 5.27734375, 10.50390625, 8.62109375,\n", " 6.91796875, 4.390625 , -7.3515625 , -17.4296875 ,\n", " -13.390625 , -3.52734375, 0. , 0.3515625 ,\n", " 4.67578125, 2.22265625, -4.19921875, -9.2109375 ,\n", " -6.3671875 , -12.109375 , -14.15625 , -9.44921875,\n", " -0.94140625, 0.97265625, 2.3984375 , 0.9140625 ,\n", " -6.15234375, -10.32421875, -8.2421875 , 1.08203125,\n", " -3.734375 , -12.515625 , -7.7578125 , 0. ,\n", " 4.56640625, 9.51953125, 7.77734375, 2.484375 ,\n", " 6.140625 , 9.8203125 , 9.52734375, -8.01171875,\n", " -15.5546875 , -6.62109375, 0. , 5.3984375 ,\n", " 9.484375 , 5.9453125 , 3.9609375 , 4.890625 ,\n", " 3.08203125, -7.7265625 , -16.703125 , -11.640625 ,\n", " -4.07421875, 0. , 1.84765625, -0.34765625,\n", " -3.08984375, -8.30078125, -9.75390625, -13.17578125,\n", " -15.8828125 , -11.7421875 , -5.84375 , -1.52734375,\n", " 0. ])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_image = []\n", "for patch in patches:\n", " new_image.append( np.sum(patch * weights) )\n", "new_image = np.array(new_image)\n", "new_image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bleech. Can't understand that. Let's make it into an image and draw it." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_image_dim = int(np.sqrt(len(new_image)))\n", "new_image_dim" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "new_image = new_image.reshape(new_image_dim, new_image_dim)\n", "draw_image(new_image, '')\n", "plt.colorbar();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can apply our weights filter to all of the patches with one matrix multiplication!" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(11, 11)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_image.shape" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(121, (7, 7))" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(patches), patches[0].shape" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(121, 7, 7)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patches_array = np.array(patches)\n", "patches_array.shape" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7, 7)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights.shape" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(121, 1)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_image = patches_array.reshape(121, -1) @ weights.reshape(-1, 1)\n", "new_image.shape" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "new_image = new_image.reshape(new_image_dim, new_image_dim)\n", "draw_image(new_image, '')\n", "plt.colorbar();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the idea is to come up with a number of such weight matrices to use as filters that extract the features of the image that are useful for classifying the digit. How can we do this?\n", "\n", "Each unit in the hidden layer is a convolutional unit with a 7 x 7 weight matrix, plus 1 weight for the constant 1 input. Then we can just backpropagate an error from the output layer through the hidden convolutional layer to update each unit's weights, as we have been doing all along!\n", "\n", "Backpropagation through a convolutional layer is tricky, because each unit is applied multiple times to all of the patches and we must sum up all of the resulting weight changes resulting from applying a unit to each patch. This sum is then used to make the update to the weights.\n", "\n", "Before we jump into code for doing this, let's revisit the method for dividing an image up into patches. We used two nested for loops, and we know for loops in python are slow. Since convolution is a common procedure for many signal and image processing applications, the `numpy` function `numpy.lib.as_strided` function is available to do this. Thank the numpy developers! See [Using stride tricks with NumPy](https://ipython-books.github.io/46-using-stride-tricks-with-numpy/) for an example use." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('float32')" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "three.dtype\n" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "import numpy.lib.stride_tricks\n", "\n", "def make_patches(X, patch_size, stride=1):\n", " '''X: n_samples x n_pixels (flattened square images)'''\n", " X = np.ascontiguousarray(X) # make sure X values are contiguous in memory\n", " \n", " n_samples = X.shape[0]\n", " image_size = int(np.sqrt(X.shape[1]))\n", " n_patches = (image_size - patch_size ) // stride + 1\n", " \n", " nb = X.itemsize # number of bytes each value\n", "\n", " new_shape = [n_samples, \n", " n_patches, # number of rows of patches\n", " n_patches, # number of columns of patches\n", " patch_size, # number of rows of pixels in each patch\n", " patch_size] # number of columns of pixels in each patch\n", " \n", " new_strides = [image_size * image_size * nb, # nuber of bytes to next image (sample)\n", " image_size * stride * nb, # number of bytes to start of next patch in next row\n", " stride * nb, # number of bytes to start of next patch in next column\n", " image_size * nb, # number of bytes to pixel in next row of patch\n", " nb] # number of bytes to pixel in next column of patch\n", " \n", " X = np.lib.stride_tricks.as_strided(X, shape=new_shape, strides=new_strides)\n", " \n", " # Reshape the set of patches to two-dimensional matrix, of shape N x P x S,\n", " # N is number of samples, P is number of patches, S is number of pixels per patch\n", " X = X.reshape(n_samples, n_patches * n_patches, patch_size * patch_size)\n", " \n", " return X" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(50000, 784)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Xtrain.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's test this on the first two images. Make patches of shape 7 x 7, with strides of 2 pixels." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "patches = make_patches(Xtrain[:2], 7, 2)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2, 121, 49)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patches.shape" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(121, 49)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "11 * 11, 7 * 7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Good. 2 images, 121 patches (11 x 11 patches), and 49 pixels per patch (7 x 7)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[5]\n", "[0]\n" ] }, { "data": { "image/png": "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8803vb9OvzqWOV+pXGZfvh2vuuoq5+0IhpF1WG6++eah3B5kNT388MOr3tF1647EHXfc4Vyfn5/Xvn37BhUpl5XZyitJGzZsMPd2796dWut2u9qzZ49/uPOUOV/JzuvKmpiamjL3Nm3alFqbm5vT1q1bzY8532233ea8/ZLv2SasvK6sife85z0ZCVfuyJEjmpiYSK37nm1i0Hl98cofAABAQBj+AAAAAsLwBwAAEBCGPwAAgIAw/AEAAASEq30r6OKLLzb33va2tznXe72eZmdnBxUpk5XXyiqt7tWoZc5XquYVtJs2bXJeRViVrNu3b0+tLSws6IUXXliFNNlcWRMbN240955++mnnehzHOn369EpjmcrktbJK0vr1680962rXKIq8rvbdtm2b1q5N/9opc76SnbkfV+cmoijyev/169c7r9wuc77D4tvx+uuvV6vVGlCaapienh7pjrzyBwAAEBCGPwAAgIAw/AEAAASE4Q8AACAgDH8AAAABYfgDAAAICLd6qaCsPw591113Ode73W7mH84eJCuvlVWSHn30UXPv8ssvd67Pz8/r4MGDfuEcypyvZGe28krS/v37iwcr4Y477nD+8fEy5yuVy3vZZZeZe9///vdTa1EU6aKLLir8+b/61a86/4h82bO18rqyJiYnJ829X/3qV871ubm5zNuxFOF7tgkrr5VVku6+++7Cuco6duyY8/YZZc5XGk5mX0899ZSzz+HDh1chDeDGK38AAAABYfgDAAAICMMfAABAQBj+AAAAAsLwBwAAEBCGPwAAgIBwq5ea+djHPuZcj6JoyEnyWVkl6ZprrjH3ms2mcz2Kor7c6iVLmcxWXkl66aWXzL1vfetbxYMZrrvuOuetM8qcr2Tnzcp64MABc891y4ter2e+v8tNN93k7Fj2bK28WbcbybJlyxbnej+ek75nm8fKKkn33nuv9+fzNTk56Z17tTP72rJli/P7tYpZES5e+QMAAAgIwx8AAEBAGP4AAAACwvAHAAAQEIY/AACAgBS62jeOY0nVvKI0T5I56WCpc0epWM8qdex0Ouae1WG1H0src1aes2fPmnuuj0vWVtqxzPlKdt6sj+l2u+aeK1+/Hkffs01Yefv9/eLznLTex/dsh221n5PDQMcldKy+oj0VF9But2NJtX5rt9sj3zGvZwgdR6UnHUejY17PEDqO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p6e5EhaVxyt/AAAAAWH4AwAACAjDHwAAQEAY/gAAAALC8AcAABAQhj8AAICAVPJWLy+88IK597Wvfc3r4wZ9CxTr6yasvFkf8/vf/947g89tUF588UVNTk6m1n3PNlEm7zBcddVVztugDDNv1m0qbrnlltTamTNndNdddxX+/CdOnOjrbVCsvK6siUOHDpl7ru+zft1+yfdsE1ZeV9Zh+eIXv6gLLrggte57tlV33XXXcRsUoAJ45Q8AACAgDH8AAAABYfgDAAAICMMfAABAQBj+AAAAAsLwBwAAEJBK3url2LFjpfZcfG6BUlY/8+a59NJLneuLi4v69a9/XehzPProo87bSgwrqyRNT0+be2vWrHGunzlzJvN2NOebmZnxvg1KmcxWXkk6ePCgubdx48bUWhRFXrd6ee973+v8+mXOV7LzurIOy4EDB5zfr75nW2W33XYbt0ABMDS88gcAABAQhj8AAICAMPwBAAAEhOEPAAAgIAx/AAAAASl0tW9yxWy//iB7njNnzuRmKSp5/7yPW0nHfubNs7i4mLme9fWSPSvvsLJmZZCyr/aVij+WZfqUyZx19WzW95PrSuTk/Yt2tPKWOd/lX/98vldNZ/HtaHXxPdthK9Jz2D9b+833saxjTzouoWP1Fe2puIB2ux1LqvVbu90e+Y55PUPoOCo96TgaHfN6htBxVHrSkY51esvr2Yjj/JdHer2eZmZm1Gw2K/Ff1D7iOFan09HU1JTGxuz/y13njlKxniF0lOrdk45L6txR4jm5XJ170nEJHauvaM9Cwx8AAABGAxd8AAAABIThDwAAICAMfwAAAAFh+AMAAAgIwx8AAEBAGP4AAAACUugvfNT5vjfc22dJCB2levek45I6d5R4Ti5X5550XELH6ivak7/wMUId83qG0HFUetJxNDrm9Qyh46j0pCMd6/SW17PQK3/NZlOS1G631Wq1inxIZURRpM2bN7/VwVLnjlKxnnXp+MYbbzjXO52Orrjiiso9llZeSfrP//xPc+/+++9PrfV6Pb322msD7Vgmrytr4rXXXvP6+nEcK47jwh1/+tOfOt/X92wTvnnLKtIz2bv44oud/5U+rKySdPnll5t7//RP/+Rc73a72rt3b+HHstFo9PXVFCuzlVeSrr32Wq+v4fs7xOpY5nwl/7xl+Hb893//d01MTKT2h5G1LGaBP1do+Eu+kVutVi0PQ8r/Q++j0FHK7lmXjvPz85n7VXsss/JeeOGF5l7mn94ZYMcyeVeS1SWO48Idm82m8wfZoM62n/J6JntjY2POzMPMunat/evA9Yt+uaKPZb+HPytzVt6yPxNW2rHs+Q7zZ3XRjhMTE87MVf69kqja749ByevJBR8AAAABYfgDAAAICMMfAABAQAr9mz9UR9bFEFWTdWHBL3/5S3PvC1/4gnN9cXFxxZnylMls5ZWk3/zmN15fP45jr/f/4x//qNOnT6fWy5yv5J93GKanp7VmzZrU+jCzbt++3dw7ePCgc73b7WrPnj2FPv9rr73W138LZ+W1skrSxz/+cXPPyhZFkVcuS5nzlezMq3mLjiNHjjj/PVyZ862qa6+9ttb/Hg688gcAABAUhj8AAICAMPwBAAAEhOEPAAAgIAx/AAAAAWH4AwAACMhI3epldnY2tdavWxH0mytr4nOf+5y597Of/cy53uv1VpwpS5m8VlZJ+t3vfuedwfc2KLOzs87bw5Q5X6lc5kHbuXOn88+CDTPrjh07zD3XbTq63a52795d+PO/8sorfb0VhpU365YiO3fuNPfGx8ed6/342eN7tgkrr5V1WL797W87b4NS5nyranp6mtugoPJ45Q8AACAgDH8AAAABYfgDAAAICMMfAABAQBj+AAAAAsLwBwAAEJBK3urlhRdeMPe+9rWveX3coG+BYn3dhJU362N+//vfe2fwuQ3Kiy++qMnJydS679kmyuQdhquuusp5G5Rh5s26TcUtt9ySWjtz5ozuuuuuwp//xIkTfb0NipXXlTVx6NAhc8/1fdav2y/5nm3CyuvKOixf/OIXdcEFF6TWfc+26q677jpugwJUAK/8AQAABIThDwAAICAMfwAAAAFh+AMAAAgIwx8AAEBAKnm177Fjx0rtufhcBVtWP/PmufTSS53ri4uL+vWvf13oczz66KPOKwuHlVX6/3/83LJmzRrn+pkzZzKvSD7fzMyM95WwZTJbeSXp4MGD5t7GjRtTa1EUeV3t+973vtf59cucr2TndWUdlgMHDji/X33Ptspuu+02roIFMDS88gcAABAQhj8AAICAMPwBAAAEhOEPAAAgIAx/AAAAAWH4AwAACEglb/Xyr//6r6X2XKIoGvhtH/qZtyyfnv/yL//ivK3EsLKWFUWR161eZmdnR/72Gc8///zId7z11ltHviMADBOv/AEAAASE4Q8AACAgDH8AAAABYfgDAAAICMMfAABAQBj+AAAAAsLwBwAAEBCGPwAAgIAw/AEAAASE4Q8AACAgDH8AAAABYfgDAAAIyNoi7xTHsSQpiqKBhhmEJHPSwVLnjlKxniF0XL5fx550XFLnjhLPyeXq3JOOS+hYfUV7Fhr+Op2OJGnz5s0rjLV6Op2ONm7cmLkv1bujlN0zhI7JvlTvnnQcjY4Sz8lkX6p3TzrSsU7yejbivPFQUq/X08zMjJrNphqNRl8DDlocx+p0OpqamtLYmP1/uevcUSrWM4SOUr170nFJnTtKPCeXq3NPOi6hY/UV7Vlo+AMAAMBo4IIPAACAgDD8AQAABIThDwAAICAMfwAAAAFh+AMAAAgIwx8AAEBAGP4AAAAC8v8A32Je26+C7A4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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ByurJO3bt8/cO3v2rHO9H7d68cls5ZWyb+FwzTXXpNYuXryo6enpjIT/1+9+9ztNTk6m1n3OV7LzurImPve5z5l7rmxlbpshvZPXdcuFsmebsPK6siZ27NhReq/dbhe+1csHP/hBXXbZZan1smeblymrRz9MTk46c/ucb1U98sgjztug9NPi4qK5t3///tTa+fPnexknl5XXlTXxwx/+sFdxMpU928Sg8lp45Q8AACAgDH8AAAABYfgDAAAICMMfAABAQBj+AAAAAsLVvhW0vLxs7n3pS19yrg/yai0rr5VVkl566SVzr9FoONfjOM68UrUon/OV7MxWXkl6+umnzb1t27al1trttt773vean3Opr33taxobG0ut+5yvZOd1ZU0sLCxkJOxco9FwXu1b9mwTvc7r4+jRo84rRKuYFfX2+9//PrV24cKFASTJ58paZXXKyyt/AAAAAWH4AwAACAjDHwAAQEAY/gAAAALC8AcAABAQhj8AAICAcKuXCjpx4oS5Z93CI47jXsXJZeXNut1IlhdeeMG5Pj8/35U3efc53yxWXkm6+eabS32tNWvKPSVfeeUV521QsnQzryRt3Lix9OeU8eyzz2piYiK17pNV6n1eHxs3bnTe6qWKWQHUH6/8AQAABIThDwAAICAMfwAAAAFh+AMAAAgIwx8AAEBAGP4AAAACwq1eKujRRx8196xbugzyVi9W3qxMWbfpsPba7Xa5YAaf85XsXL63HOkGK6/P+VbVJz7xCedtUIBui6IotTbI361ZXFkTo6PVe12njnldt9GqYlYfw9ECAAAAhTD8AQAABIThDwAAICAMfwAAAAFh+AMAAAhIoat9k6udunW1ZT8lmfOu2KpSxwsXLph7eVf7ZvXsVUcrb1aWrI5Wvm49lj7nm/V53TzPsh2tj/M5336p43PSR5GeIXRcvV/1nkUeq7z9fnX0zer63ZCs9bKjT95u/h4r+7NqfWy3/17rtqI9FRfQarViSbX+02q1hr5jXs8QOg5LTzoOR8e8niF0HJaedKRjnf7k9RyJ4/ybGEVRpJmZGTUaDed9b6osjmPNzs5q8+bNmffnqXNHqVjPEDpK9e5JxxV17ijxnFytzj3puIKO1Ve0Z6HhDwAAAMOBCz4AAAACwvAHAAAQEIY/AACAgDD8AQAABIThDwAAICCFbvJc50ufubx7RQgd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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_plot_rows = int(np.sqrt(patches.shape[1]))\n", "patch_size = int(np.sqrt(patches.shape[2]))\n", "\n", "for patchi in range(patches.shape[0]):\n", " print(Ttrain[patchi])\n", " plt.figure(figsize=(8, 8))\n", " ploti = 0\n", " for patch in patches[patchi, :, :]:\n", " ploti += 1\n", " plt.subplot(n_plot_rows, n_plot_rows, ploti)\n", " draw_neg_image(patch.reshape(patch_size, patch_size), '')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember our weights matrix?" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7, 7)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights.shape" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "image/png": "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hcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQIqqvjIZOLr4GnOOZs5gAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0CKqgKzYsWKmDt3brS0tERLS0ssWLAg1q1blzUbAHWsqsDMmjUr7rvvvti8eXNs3rw5Lr300rjqqqti+/btWfMBUKcaiqIoRvIHTJ06NX70ox/Ft771rSPavlwuR6lUGskhgf8zwv98oWofvoYPDAxES0vLYbdtHO5BDhw4EL/+9a9j//79sWDBgkNuV6lUolKpDBkOgPGv6pv827Zti+OPPz6amppi6dKlsWbNmjjrrLMOuX1PT0+USqXBpa2tbUQDA1Afqr5E9t5778WuXbvinXfeiUcffTQefPDB6O/vP2RkPuoMRmRgdLhExlir5hLZiO/BXH755XHaaafFz3/+86qGA0ZOYBhr1QRmxJ+DKYpiyBkKAERUeZP/zjvvjM7Ozmhra4t9+/bF6tWrY8OGDfHEE09kzQdAnaoqMP/617/ixhtvjDfeeCNKpVLMnTs3nnjiifjCF76QNR8AdWrE92Cq5R4MjB73YBhrY3oPBgA+isAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASNFY6wFgrPj+ehhbzmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQIoRBaanpycaGhpi2bJlozQOAOPFsAOzadOm6O3tjblz547mPACME8MKzLvvvhvXX399rFy5Mk488cTRngmAcWBYgenq6oorrrgiLr/88o/dtlKpRLlcHrIAMP41VrvD6tWr4/nnn49NmzYd0fY9PT3xve99r+rBAKhvVZ3B7N69O2699db41a9+FZMnTz6ifZYvXx4DAwODy+7du4c1KAD1paEoiuJIN37sscfii1/8YkycOHFw3YEDB6KhoSEmTJgQlUplyN/7KOVyOUql0vAnhmGq4kcdOIQPX8MHBgaipaXlsNtWdYnssssui23btg1Z941vfCPOOOOMuOOOOz42LgD896gqMM3NzTFnzpwh66ZMmRLTpk07aD0A/918kh+AFFW/i+w/bdiwYRTGAGC8cQYDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJCisdYDcPQqiqLWIwB1zBkMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEhRVWDuueeeaGhoGLKccsopWbMBUMcaq93h7LPPjj/+8Y+DjydOnDiqAwEwPlQdmMbGRmctAHysqu/B7NixI1pbW6O9vT2uu+662Llz52G3r1QqUS6XhywAjH9VBebCCy+MVatWxfr162PlypWxZ8+eWLhwYbz11luH3KenpydKpdLg0tbWNuKhATj6NRRFUQx35/3798dpp50W3/nOd6K7u/sjt6lUKlGpVAYfl8tlkakTI/jRAMapcrkcpVIpBgYGoqWl5bDbVn0P5v+bMmVKnHPOObFjx45DbtPU1BRNTU0jOQwAdWhEn4OpVCrx4osvxsyZM0drHgDGiaoCc/vtt0d/f3+8+uqr8Ze//CW+/OUvR7lcjiVLlmTNB0CdquoS2T//+c/46le/Gm+++WacfPLJ8ZnPfCY2btwYs2fPzpoPgDpVVWBWr16dNQcA44zfRQZACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkKKx1gOMF0VR1HoEgKOKMxgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkKLqwLz22mtxww03xLRp0+K4446Lc889N7Zs2ZIxGwB1rLGajd9+++1YtGhRXHLJJbFu3bqYPn16/OMf/4gTTjghaTwA6lVVgfnhD38YbW1t8dBDDw2u+8QnPjHaMwEwDlR1iWzt2rXR0dER11xzTUyfPj3OO++8WLly5WH3qVQqUS6XhywAjH9VBWbnzp2xYsWKOP3002P9+vWxdOnSuOWWW2LVqlWH3KenpydKpdLg0tbWNuKhATj6NRRFURzpxpMmTYqOjo547rnnBtfdcsstsWnTpvjzn//8kftUKpWoVCqDj8vl8riMTBX/GAHqVrlcjlKpFAMDA9HS0nLYbas6g5k5c2acddZZQ9adeeaZsWvXrkPu09TUFC0tLUMWAMa/qgKzaNGieOmll4ase/nll2P27NmjOhQA9a+qwNx2222xcePGuPfee+OVV16Jhx9+OHp7e6OrqytrPgDqVFX3YCIifve738Xy5ctjx44d0d7eHt3d3fHtb3/7iPf/8PrdeOMeDPDfoJp7MFUHZqQEBqB+pd3kB4AjJTAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkaBzrA47XrxYul8u1HgEg3YevdUfyWj7mgdm3b99YH3JMlEqlWo8AMGb27dv3sa97DcUYn1J88MEH8frrr0dzc3M0NDSkHadcLkdbW1vs3r07Wlpa0o4zljyno994ez4RnlO9GKvnVBRF7Nu3L1pbW2PChMPfZRnzM5gJEybErFmzxux4LS0t4+YH6EOe09FvvD2fCM+pXozFczrSKzZu8gOQQmAASDFuA9PU1BR33313NDU11XqUUeM5Hf3G2/OJ8JzqxdH4nMb8Jj8A/x3G7RkMALUlMACkEBgAUggMACnGZWAeeOCBaG9vj8mTJ8f8+fPjmWeeqfVII/L000/HlVdeGa2trdHQ0BCPPfZYrUcakZ6enrjggguiubk5pk+fHldffXW89NJLtR5rRFasWBFz584d/JDbggULYt26dbUea9T09PREQ0NDLFu2rNajjMg999wTDQ0NQ5ZTTjml1mONyGuvvRY33HBDTJs2LY477rg499xzY8uWLbUeKyLGYWAeeeSRWLZsWdx1113xwgsvxMUXXxydnZ2xa9euWo82bPv374958+bF/fffX+tRRkV/f390dXXFxo0bo6+vL95///1YvHhx7N+/v9ajDdusWbPivvvui82bN8fmzZvj0ksvjauuuiq2b99e69FGbNOmTdHb2xtz586t9Sij4uyzz4433nhjcNm2bVutRxq2t99+OxYtWhTHHHNMrFu3Lv7+97/Hj3/84zjhhBNqPdr/KsaZT3/608XSpUuHrDvjjDOK7373uzWaaHRFRLFmzZpajzGq9u7dW0RE0d/fX+tRRtWJJ55YPPjgg7UeY0T27dtXnH766UVfX1/xuc99rrj11ltrPdKI3H333cW8efNqPcaoueOOO4qLLrqo1mMc0rg6g3nvvfdiy5YtsXjx4iHrFy9eHM8991yNpuLjDAwMRETE1KlTazzJ6Dhw4ECsXr069u/fHwsWLKj1OCPS1dUVV1xxRVx++eW1HmXU7NixI1pbW6O9vT2uu+662LlzZ61HGra1a9dGR0dHXHPNNTF9+vQ477zzYuXKlbUea9C4Csybb74ZBw4ciBkzZgxZP2PGjNizZ0+NpuJwiqKI7u7uuOiii2LOnDm1HmdEtm3bFscff3w0NTXF0qVLY82aNXHWWWfVeqxhW716dTz//PPR09NT61FGzYUXXhirVq2K9evXx8qVK2PPnj2xcOHCeOutt2o92rDs3LkzVqxYEaeffnqsX78+li5dGrfcckusWrWq1qNFRA1+m/JY+M+vASiKIvWrARi+m266Kf72t7/Fs88+W+tRRuxTn/pUbN26Nd5555149NFHY8mSJdHf31+Xkdm9e3fceuut8eSTT8bkyZNrPc6o6ezsHPzrc845JxYsWBCnnXZa/PKXv4zu7u4aTjY8H3zwQXR0dMS9994bERHnnXdebN++PVasWBFf+9rXajzdODuDOemkk2LixIkHna3s3bv3oLMaau/mm2+OtWvXxlNPPTWmX+GQZdKkSfHJT34yOjo6oqenJ+bNmxc/+clPaj3WsGzZsiX27t0b8+fPj8bGxmhsbIz+/v746U9/Go2NjXHgwIFajzgqpkyZEuecc07s2LGj1qMMy8yZMw/6H5gzzzzzqHlT07gKzKRJk2L+/PnR19c3ZH1fX18sXLiwRlPxn4qiiJtuuil+85vfxJ/+9Kdob2+v9UgpiqKISqVS6zGG5bLLLott27bF1q1bB5eOjo64/vrrY+vWrTFx4sRajzgqKpVKvPjiizFz5sxajzIsixYtOugt/i+//HLMnj27RhMNNe4ukXV3d8eNN94YHR0dsWDBgujt7Y1du3bF0qVLaz3asL377rvxyiuvDD5+9dVXY+vWrTF16tQ49dRTazjZ8HR1dcXDDz8cjz/+eDQ3Nw+ecZZKpTj22GNrPN3w3HnnndHZ2RltbW2xb9++WL16dWzYsCGeeOKJWo82LM3NzQfdE5syZUpMmzatru+V3X777XHllVfGqaeeGnv37o0f/OAHUS6XY8mSJbUebVhuu+22WLhwYdx7773xla98Jf76179Gb29v9Pb21nq0/1XbN7Hl+NnPflbMnj27mDRpUnH++efX/dtfn3rqqSIiDlqWLFlS69GG5aOeS0QUDz30UK1HG7ZvfvObgz9zJ598cnHZZZcVTz75ZK3HGlXj4W3K1157bTFz5szimGOOKVpbW4svfelLxfbt22s91oj89re/LebMmVM0NTUVZ5xxRtHb21vrkQb5df0ApBhX92AAOHoIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0CK/wFh85UEuiU8vAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(weights, cmap='gray');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's make a second filter as the above one flipped vertically (over the rows)." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAGdCAYAAAAv9mXmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAV+0lEQVR4nO3dX4xU9dnA8WdkZVDcHQUFIayUWFNUBJW1FtD+UUtCjNE2tdqopX9uSPAPJaZWvdA2rWvT9KKNlXYxsRprMI1FMS0qTWXVWCugpIQaxWoCVSnV6AxyMUY878X7unm3CjK7++xh188n+SXO8RzOM2aZr2fOzm6lKIoiAGCIHVL2AACMTgIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKdqG+4Tvv/9+vPbaa9He3h6VSmW4Tw/AIBRFEbt3746pU6fGIYfs/xpl2APz2muvRWdn53CfFoAhtGPHjpg2bdp+9xn2wLS3tw/3KYdFvV4vewSAdI1GIzo7Ow/otXzYAzNa3xbr6OgoewSAYXMgr+Vu8gOQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBhQYG6//faYMWNGjBs3LubOnRtPPPHEUM8FwAjXcmDuu+++WLZsWdx4443x3HPPxdlnnx2LFi2K7du3Z8wHwAhVKYqiaOWAM888M04//fRYsWJF37YTTzwxLrroouju7v7Y4xuNRtRqtdYnPci1+J8RYET64DW8Xq9HR0fHfvdt6Qrm3XffjU2bNsXChQv7bV+4cGE89dRTH3lMs9mMRqPRbwEw+rUUmDfeeCP27t0bkydP7rd98uTJsXPnzo88pru7O2q1Wt/q7Owc+LQAjBgDuslfqVT6PS6K4kPbPnD99ddHvV7vWzt27BjIKQEYYdpa2fnoo4+OMWPGfOhqZdeuXR+6qvlAtVqNarU68AkBGJFauoIZO3ZszJ07N9atW9dv+7p162L+/PlDOhgAI1tLVzAREcuXL48rrrgiurq6Yt68edHT0xPbt2+PJUuWZMwHwAjVcmAuueSSePPNN+NHP/pRvP766zFr1qz405/+FNOnT8+YD4ARquXPwQyWz8EAjFxpn4MBgAMlMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABStJU9wGhRqVTKHmHIFUVR9gjACOYKBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkaDkwjz/+eFxwwQUxderUqFQq8cADDySMBcBI13Jg9uzZE3PmzInbbrstYx4ARom2Vg9YtGhRLFq0KGMWAEaRlgPTqmazGc1ms+9xo9HIPiUAB4H0m/zd3d1Rq9X6VmdnZ/YpATgIpAfm+uuvj3q93rd27NiRfUoADgLpb5FVq9WoVqvZpwHgIONzMACkaPkK5p133omXXnqp7/Err7wSmzdvjgkTJsRxxx03pMMBMHJViqIoWjlg/fr18aUvfelD2xcvXhy//e1vP/b4RqMRtVqtlVNSkha/NIBPgA9ew+v1enR0dOx335avYL74xS964QHgY7kHA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQoq3sATh4VSqVskcYUkVRlD0CfKK4ggEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKVoKTHd3d5xxxhnR3t4ekyZNiosuuiheeOGFrNkAGMFaCkxvb28sXbo0nn766Vi3bl289957sXDhwtizZ0/WfACMUJWiKIqBHvyf//wnJk2aFL29vfH5z3/+gI5pNBpRq9UGekoYsEF8qQP/54PX8Hq9Hh0dHfvdt20wJ6rX6xERMWHChH3u02w2o9ls9hsOgNFvwDf5i6KI5cuXx1lnnRWzZs3a537d3d1Rq9X6Vmdn50BPCcAIMuC3yJYuXRp//OMf48knn4xp06btc7+PuoIRGcrgLTIYvPS3yK666qpYs2ZNPP744/uNS0REtVqNarU6kNMAMIK1FJiiKOKqq66K1atXx/r162PGjBlZcwEwwrUUmKVLl8a9994bDz74YLS3t8fOnTsjIqJWq8Vhhx2WMiAAI1NL92AqlcpHbr/zzjvjW9/61gH9Gb5NmbK4BwODl3YPxl9QAA6Un0UGQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIEVLvzIZRrJKpVL2CEPOrzHnYOYKBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkaCkwK1asiNmzZ0dHR0d0dHTEvHnzYu3atVmzATCCtRSYadOmxa233hobN26MjRs3xjnnnBMXXnhhbN26NWs+AEaoSlEUxWD+gAkTJsTPfvaz+O53v3tA+zcajajVaoM5JfB/BvnXF1r2wWt4vV6Pjo6O/e7bNtCT7N27N37/+9/Hnj17Yt68efvcr9lsRrPZ7DccAKNfyzf5t2zZEkcccURUq9VYsmRJrF69Ok466aR97t/d3R21Wq1vdXZ2DmpgAEaGlt8ie/fdd2P79u3x9ttvx/333x933HFH9Pb27jMyH3UFIzIwNLxFxnBr5S2yQd+DOe+88+L444+P3/zmNy0NBwyewDDcWgnMoD8HUxRFvysUAIho8Sb/DTfcEIsWLYrOzs7YvXt3rFq1KtavXx8PP/xw1nwAjFAtBebf//53XHHFFfH6669HrVaL2bNnx8MPPxxf/vKXs+YDYIQa9D2YVrkHA0PHPRiG27DegwGAjyIwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFK0lT0AMHCVSqXsEYZcURRlj8AQcQUDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIMKjDd3d1RqVRi2bJlQzQOAKPFgAOzYcOG6OnpidmzZw/lPACMEgMKzDvvvBOXXXZZrFy5Mo466qihngmAUWBAgVm6dGmcf/75cd55533svs1mMxqNRr8FwOjX1uoBq1atimeffTY2bNhwQPt3d3fHD3/4w5YHA2Bka+kKZseOHXHNNdfEPffcE+PGjTugY66//vqo1+t9a8eOHQMaFICRpVIURXGgOz/wwAPxla98JcaMGdO3be/evVGpVOKQQw6JZrPZ7999lEajEbVabeATA6NaCy9JlOCD1/B6vR4dHR373belt8jOPffc2LJlS79t3/72t2PmzJlx3XXXfWxcAPjkaCkw7e3tMWvWrH7bxo8fHxMnTvzQdgA+2XySH4AULX8X2X9bv379EIwBwGjjCgaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIEVb2QMA/H+VSqXsEYZcURRlj1AKVzAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIEVLgbn55pujUqn0W8cee2zWbACMYG2tHnDyySfHn//8577HY8aMGdKBABgdWg5MW1ubqxYAPlbL92C2bdsWU6dOjRkzZsSll14aL7/88n73bzab0Wg0+i0ARr+WAnPmmWfG3XffHY888kisXLkydu7cGfPnz48333xzn8d0d3dHrVbrW52dnYMeGoCDX6UoimKgB+/ZsyeOP/74+P73vx/Lly//yH2azWY0m82+x41GQ2SAT5RBvMwedBqNRtRqtajX69HR0bHffVu+B/P/jR8/Pk455ZTYtm3bPvepVqtRrVYHcxoARqBBfQ6m2WzG888/H1OmTBmqeQAYJVoKzLXXXhu9vb3xyiuvxN/+9rf42te+Fo1GIxYvXpw1HwAjVEtvkf3rX/+Kb3zjG/HGG2/EMcccE5/73Ofi6aefjunTp2fNB8AI1VJgVq1alTUHAKOMn0UGQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJCirewBAEa7SqVS9gilcAUDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFK0HJhXX301Lr/88pg4cWIcfvjhceqpp8amTZsyZgNgBGtrZee33norFixYEF/60pdi7dq1MWnSpPjnP/8ZRx55ZNJ4AIxULQXmpz/9aXR2dsadd97Zt+1Tn/rUUM8EwCjQ0ltka9asia6urrj44otj0qRJcdppp8XKlSv3e0yz2YxGo9FvAfAJULSgWq0W1Wq1uP7664tnn322+PWvf12MGzeuuOuuu/Z5zE033VREhGVZljWKVr1e/9hmVIqiKOIAjR07Nrq6uuKpp57q23b11VfHhg0b4q9//etHHtNsNqPZbPY9bjQa0dnZeaCnBOAgVK/Xo6OjY7/7tPQW2ZQpU+Kkk07qt+3EE0+M7du37/OYarUaHR0d/RYAo19LgVmwYEG88MIL/ba9+OKLMX369CEdCoBRoJV7MM8880zR1tZW/OQnPym2bdtW/O53vysOP/zw4p577jngP6Ner5f+3qFlWZY1uHUg92BaCkxRFMVDDz1UzJo1q6hWq8XMmTOLnp6elo4XGMuyrJG/hvwm/1BoNBpRq9WG85QADLEhv8kPAAdKYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEgx7IEZ5t/QDECCA3ktH/bA7N69e7hPCcAQO5DX8koxzJcU77//frz22mvR3t4elUol7TyNRiM6Oztjx44d0dHRkXae4eQ5HfxG2/OJ8JxGiuF6TkVRxO7du2Pq1KlxyCH7v0ZpS5tiHw455JCYNm3asJ2vo6Nj1HwBfcBzOviNtucT4TmNFMPxnGq12gHt5yY/ACkEBoAUozYw1Wo1brrppqhWq2WPMmQ8p4PfaHs+EZ7TSHEwPqdhv8kPwCfDqL2CAaBcAgNACoEBIIXAAJBiVAbm9ttvjxkzZsS4ceNi7ty58cQTT5Q90qA8/vjjccEFF8TUqVOjUqnEAw88UPZIg9Ld3R1nnHFGtLe3x6RJk+Kiiy6KF154oeyxBmXFihUxe/bsvg+5zZs3L9auXVv2WEOmu7s7KpVKLFu2rOxRBuXmm2+OSqXSbx177LFljzUor776alx++eUxceLEOPzww+PUU0+NTZs2lT1WRIzCwNx3332xbNmyuPHGG+O5556Ls88+OxYtWhTbt28ve7QB27NnT8yZMyduu+22skcZEr29vbF06dJ4+umnY926dfHee+/FwoULY8+ePWWPNmDTpk2LW2+9NTZu3BgbN26Mc845Jy688MLYunVr2aMN2oYNG6Knpydmz55d9ihD4uSTT47XX3+9b23ZsqXskQbsrbfeigULFsShhx4aa9eujX/84x/x85//PI488siyR/tfxSjz2c9+tliyZEm/bTNnzix+8IMflDTR0IqIYvXq1WWPMaR27dpVRETR29tb9ihD6qijjiruuOOOsscYlN27dxcnnHBCsW7duuILX/hCcc0115Q90qDcdNNNxZw5c8oeY8hcd911xVlnnVX2GPs0qq5g3n333di0aVMsXLiw3/aFCxfGU089VdJUfJx6vR4RERMmTCh5kqGxd+/eWLVqVezZsyfmzZtX9jiDsnTp0jj//PPjvPPOK3uUIbNt27aYOnVqzJgxIy699NJ4+eWXyx5pwNasWRNdXV1x8cUXx6RJk+K0006LlStXlj1Wn1EVmDfeeCP27t0bkydP7rd98uTJsXPnzpKmYn+Koojly5fHWWedFbNmzSp7nEHZsmVLHHHEEVGtVmPJkiWxevXqOOmkk8oea8BWrVoVzz77bHR3d5c9ypA588wz4+67745HHnkkVq5cGTt37oz58+fHm2++WfZoA/Lyyy/HihUr4oQTTohHHnkklixZEldffXXcfffdZY8WESX8NOXh8N+/BqAoitRfDcDAXXnllfH3v/89nnzyybJHGbTPfOYzsXnz5nj77bfj/vvvj8WLF0dvb++IjMyOHTvimmuuiUcffTTGjRtX9jhDZtGiRX3/fMopp8S8efPi+OOPj7vuuiuWL19e4mQD8/7770dXV1fccsstERFx2mmnxdatW2PFihXxzW9+s+TpRtkVzNFHHx1jxoz50NXKrl27PnRVQ/muuuqqWLNmTTz22GPD+iscsowdOzY+/elPR1dXV3R3d8ecOXPiF7/4RdljDcimTZti165dMXfu3Ghra4u2trbo7e2NX/7yl9HW1hZ79+4te8QhMX78+DjllFNi27ZtZY8yIFOmTPnQ/8CceOKJB803NY2qwIwdOzbmzp0b69at67d93bp1MX/+/JKm4r8VRRFXXnll/OEPf4i//OUvMWPGjLJHSlEURTSbzbLHGJBzzz03tmzZEps3b+5bXV1dcdlll8XmzZtjzJgxZY84JJrNZjz//PMxZcqUskcZkAULFnzoW/xffPHFmD59ekkT9Tfq3iJbvnx5XHHFFdHV1RXz5s2Lnp6e2L59eyxZsqTs0QbsnXfeiZdeeqnv8SuvvBKbN2+OCRMmxHHHHVfiZAOzdOnSuPfee+PBBx+M9vb2vivOWq0Whx12WMnTDcwNN9wQixYtis7Ozti9e3esWrUq1q9fHw8//HDZow1Ie3v7h+6JjR8/PiZOnDii75Vde+21ccEFF8Rxxx0Xu3btih//+MfRaDRi8eLFZY82IN/73vdi/vz5ccstt8TXv/71eOaZZ6Knpyd6enrKHu1/lftNbDl+9atfFdOnTy/Gjh1bnH766SP+218fe+yxIiI+tBYvXlz2aAPyUc8lIoo777yz7NEG7Dvf+U7f19wxxxxTnHvuucWjjz5a9lhDajR8m/Ill1xSTJkypTj00EOLqVOnFl/96leLrVu3lj3WoDz00EPFrFmzimq1WsycObPo6ekpe6Q+flw/AClG1T0YAA4eAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQ4n8AhslD/xWls98AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "weights_flipped = np.flipud(weights)\n", "plt.imshow(weights_flipped, cmap='gray');" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(49, 1)" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights = weights.reshape(49, 1)\n", "weights.shape" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(49, 1)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights_flipped = weights_flipped.reshape(49, 1)\n", "weights_flipped.shape" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "weights_both = np.hstack((weights, weights_flipped))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(49, 2)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights_both.shape" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.subplot(1, 2, 1)\n", "plt.imshow(weights_both[:, 0].reshape(7, 7), cmap='gray')\n", "plt.subplot(1, 2, 2)\n", "plt.imshow(weights_both[:, 1].reshape(7, 7), cmap='gray');" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((2, 121, 49), (49, 2))" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patches.shape, weights_both.shape" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2, 121, 2)" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output = patches @ weights_both\n", "output.shape" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in range(2):\n", " plt.figure()\n", " for j in range(2):\n", " plt.subplot(1, 2, j+1)\n", " output_image = output[i, :, j].reshape(11, 11)\n", " draw_image(output_image, '')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.12.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }