{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CNN Basic\n", "> In this post, We will dig into the basic operation of Convolutional Neural Network, and explain about what each layer look like. And we will simply implement the basic CNN archiecture with tensorflow.\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- author: Chanseok Kang\n", "- categories: [Python, Deep_Learning, Tensorflow-Keras]\n", "- image: images/cnn_stacked.png" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "plt.rcParams['figure.figsize'] = (16, 10)\n", "plt.rc('font', size=15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convolutional Neural Network\n", " [Convolutional Neural Network](https://en.wikipedia.org/wiki/Convolutional_neural_network) (CNN for short) is the most widely used for image classification. Previously, we handled image classification problem (Fashion-MNIST) with Multi Layer Perceptron, and we found that works. At that time, the information containing each image is very simple, and definitely classified with several parameters. But if the dataset contains high resolution image and several channels, it may require huge amount of parameters with mlp in image classification. How can we effectively classify the image without huge amount of parameters? And that's why the CNN exists.\n", " \n", "![CNN example](image/cnn_example.png)\n", "*Fig 1. Example of Convolutional Neural Network*\n", " \n", " Generally, it consists of **Convolution layer**, **Pooling layer**, and **Fully-connected layer**. Usually, Convolution layer and Pooling layer is used for feature extraction. Feature extraction means that it extract important features from image for classification, so that all pixels in images is not required. Through these layer, information of data is resampled, and refined, and go to the output node. Fully-connected (also known as FC) is used for classification." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2D Convolution Layer\n", "To understand convolution layer, we need to see the shape of image and some elements to extract features called filters(also called kernel).\n", "\n", "![convolution layer](image/conv_layer.png)\n", "\n", "In Fashion-MNIST example, the image containing dataset is grayscale. So the range of pixel value is from 0 to 255. But most of real-world image and all the things we see now is colorized. Technically, it can expressed with 3 base color, Red, Green, Blue. The color system which can express these 3 colors are called **RGB**, and each range of pixel value is also from 0 to 255, same as grayscaled pixel.\n", "\n", "> Note: There are other color systems like RGBA (Red-Green-Blue-Alpha) or HSV (Hue-Saturation-Value), HSL (Hue-Saturation-Lightness), etc. In this post, we just assume that image has 3 channels (RGB)\n", "\n", "So In the figure, this image has shape of 32x32 and 3 channels (RGB).\n", "\n", "And Next one is the filter, which shape has 5x5x3. The number we need to focus on **3**. Filter always extend the full channel of the input volume. So it requires to set same number of channels in input nodes and filters. \n", "\n", "As you can see, filter has same channel with input image. And let's assume the notation of filter, $w$. Next thing we need to do is just slide th filter over the image spatially, and compute dot products, same as MLP operation (This operation is called **convolution**, and it's the reason why this layer is called Convolution layer). Simply speaking, we just focus on the range covered in filter and dot product like this,\n", "\n", "$$ w^T x + b $$\n", "\n", "Of course, we move the filter until it can operate convolution.\n", "\n", "![animation](image/convolutions.gif)\n", "*Fig 3. Animation of convolution operation\n", "\n", "After that, (Assume we don't apply padding, and stride is 1), we can get output volume which shape has 28x28x1. There is formula to calculate the shape of output volume when the stride and filter is defined,\n", "\n", "$$ \\frac{(\\text{Height of input} - \\text{Height of filter})}{\\text{Stride}} + 1 $$\n", "\n", "We can substitute the number in this formula, then we can conclude the height of output volume is 28. The output the process convolution is called **Feature Map** (or Activation Map). One feature map gather from one filter, we can apply several filters in one input image. If we use 6 5x5 filters, we can get 6 separate feature maps. We can stack them into one object, then we get \"new image\" of size 28x28x6.\n", "\n", "![cnn stacked](image/cnn_stacked.png)\n", "

\n", " Fig 4. stacked output of convolution\n", "

\n", "\n", "Here, one number is need to focus, **6**. 6 means the number of filters we apply in this convolution layer.\n", "\n", "You may be curious about what filter looks like. Actually, filter was widely used from classic computer vision. For example, to extract the edge of object in image, we can apply the *canny edge filer*, and there is edge detection filter named *sobel filter*, and so on. We can bring the concept of filter in CNN here. In short, filter extract the feature like where the edge is, and convolution layer refine its feature.\n", "\n", "![operation](image/convolution_op2.png)\n", "*Fig 5. Applying filter for each pixel*\n", "\n", "Here, we just consider the one channel of image and apply it with 6 filters. And we can extend it in multi-channel, and lots of filters.\n", "\n", "![manychannel](image/convolution_manychannel.png)\n", "*Fig 6. Convolution operation in many channels and many filters*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Options of Convolution\n", "\n", "So what parameteter may affect operation in convolution layer? We can introduce three main parameters for convolution layer: stride, zero-padding, and activation function.\n", "\n", "**Stride** is the size of step that how far to go to the right or the bottom to perform the next convolution. It is important that it defines the output model's size. Review the formula of calculating the feature map size,\n", "\n", "$$ \\frac{(\\text{Height of input} - \\text{Height of filter})}{\\text{Stride}} + 1 $$\n", "\n", "We can define any size of strides unless its value is smaller than original model size. As we increase the stride, then the size of feature map will be small, and it means that feature will also be small. Think about that the picture is summarized by just a small dot.\n", "\n", "**Zero-padding** is another factor that affect the convolution layer. The meaning is contained in its name. A few numbers of zeros surrounds the original image, then process the convolution operation. As we can see from previous process, if the layer is deeper and deeper, then the information will be smaller the original one due to the convolution operation. To preserve the size of original image during process, zero-padding is required. If the filter size is FxF and stride is 1, then we can also calculate the zero-padding size,\n", "\n", "$$ \\frac{F - 1}{2} $$\n", "\n", "You may see the **Activation Function** in MLP. It can also apply in the Convolution layer.\n", "For example, when we apply Rectified Linear Unit (ReLU) in feature map, we can remove the value that lower than 0," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Convolution Layer in Tensorflow\n", "Let's look at how we can use Convolution layer in tensorflow. Actually, in Tensorflow v2.x, Convolution layer is implemented in keras as an high-level class, so all we need to do is just defineing the parameters correctly. Here is the `__init__` of `tf.keras.layers.Conv2D`.\n", "\n", "```python\n", "tf.keras.layers.Conv2D(\n", " filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,\n", " dilation_rate=(1, 1), groups=1, activation=None, use_bias=True,\n", " kernel_initializer='glorot_uniform', bias_initializer='zeros',\n", " kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,\n", " kernel_constraint=None, bias_constraint=None, **kwargs\n", ")\n", "```\n", "\n", "We already covered filters, kernel_size (same as filter_size), strides, and so on. Here is brief description of arguments:\n", "\n", "| arguments | |\n", "| --- | --- |\n", "| filters | Integer, the dimensionality of the output space (i.e. the number of output filters in the convolution). |\n", "| kernel_size | An integer or tuple/list of 2 integers, specifying the height and width of the 2D convolution window. Can be a single integer to specify the same value for all spatial dimensions. |\n", "| strides | An integer or tuple/list of 2 integers, specifying the strides of the convolution along the height and width. Can be a single integer to specify the same value for all spatial dimensions. Specifying any stride value != 1 is incompatible with specifying any dilation_rate value != 1. |\n", "| padding | one of \"valid\" or \"same\" (case-insensitive). |\n", "| data_format | A string, one of channels_last (default) or channels_first. The ordering of the dimensions in the inputs. channels_last corresponds to inputs with shape (batch_size, height, width, channels) while channels_first corresponds to inputs with shape (batch_size, channels,height, width). It defaults to the image_data_format value found in your Keras config file at ~/.keras/keras.json. If you never set it, then it will be channels_last. |\n", "| activation | Activation function to use. If you don't specify anything, no activation is applied (see [keras.activations](https://www.tensorflow.org/api_docs/python/tf/keras/activations)). |\n", "| use_bias | Boolean, whether the layer uses a bias vector. |\n", "| kernel_initializer | Initializer for the kernel weights matrix |\n", "| bias_initializer | Initializer for the bias vector |\n", "\n", "We need to focus on the `data_format`. The description said that the default value of data_format is 'channels_last'. It means that all data in this layer must follow in this format order: `(batch, height, width, channels)`\n", "\n", "And `padding` argument can accept `valid` and `same`. `same` means no zero-padding. In this case, it drops the last convolution if the dimensions do not match (or fraction). If you want to use zero-padding, then we need to define `padding` argument as `same`. In this case, it pads such that feature map size has same as original one.(That's why we call the `same`) Usually it is also called 'half' padding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example with Toy Image\n", "Let's use the convolution layer. For the simplicity, we will use a simple toy image, then see the output." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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zpzJsccey1NPPVXwurdlpaWlzV3CVq24uJjy8vIt2m644QYOPfTQvD8adtttN6ZPn86ll17KQw89BECnTp2YNm0aV155JePGjSt43dsy9+nGN2zYME455ZS8R4F79OjBTTfdxAUXXMDs2bMB6N69O3/4wx/4xS9+wSuvvNKU5W5zZs2axZo1a0JjrKsgpy9DCMXAk0AETgZGAb8AflWH7uOAAcC5wDlAH+CRQtSpLTUkoA8aNIgPP/ywIpABvPTSSyxatIhBgwY1ZnlSvVUNZABz585l5513ztvnqKOOAuCJJ56oaPvoo4+YNWsW/fv3b/wipS9p9erVNZ6+7Nu3LytWrKgIZABlZWW8//779O3btylKVB0V6vTlj4HWwHdijKuBKSGEDsDIEMJvs23VhBAOB44D+scYp2XblgIzQgjHxhifLFC9aqDu3btTVlZWrX3evHl07969GSqSanbooYeyYMGCvO937dqVDz/8kHXr1m3RvnDhQv8BUzJatGjBdtttR7du3fjOd77DxIkT8y675557smTJkmrtS5YsYc899yxkmaqnQoWyQcDkKuHrPmA00B94tIZ+H20OZAAxxpkhhHey7xnKElNcXMzKlSurtZeXl7PPPvs0Q0VSfkcccQT/+q//yiWXXJJ3maKiIlavrv67cdWqVRQVFRWyPKnOJk2aVDH2d/Lkydxyyy15l23Xrh1r166t1r5mzRo6d+5csBpVf4W6+rI7sMXhkxjjEmBd9r0698uaV0s/NaNcpz0rj0+TUtClSxduvPFGpkyZwoMPPljjsu7TSt1PfvITfvrTn3LzzTfzzW9+s9YB+/n2aaWlUEfKiskM7q+qPPteQ/rlPOwSQhgODK9vgWoc5eXl7LLLLtXaO3bsmPMImtQcioqK+NOf/sTSpUu58MILa1x21apVOacK6NChQ84jaFJz2HwK/s0332TVqlVcdtll3H///bz//vvVll27dm3Oo7z5jqCp+RRynrJcPylDnvYG94sx3hpj7B1j7F3P+tQIysrKco4dyzfWTGpqO+64I3fccQfbbbcdw4YNY/369TUuv3DhQjp37kzr1q23aN9nn31YuHBhIUuVGuStt94CMlcO55Jv7Ngee+yRc6yZmk+hQlk50DFHexG5j4TV1q9jLf3UTCZNmkTnzp355je/WdH29a9/na5duzJp0qRmrEyC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KQGGMkmSpAQYyiRJkhJgKJMkSUqAoUySJCkBhjJJkqQEGMokSZISYCiTJElKgKFMkiQpAYYySZKkBBjKJEmSEmAokyRJSoChTJIkKQGGMkmSpAQYyiRJkhJgKJMkSUqAoUySJCkBhjJJkqQEGMokSZISYCiTJElKgKFMkiQpAYYySZKkBBjKJEmSEmAokyRJSoChTJIkKQGGMkmSpAQYyiRJkhJgKJMkSUqAoUySJCkBhjJJkqQEGMokSZISYCiTJElKgKFMkiQpAYYySZKkBBjKJEmSEmAokyRJSoChTJIkKQGGMkmSpAQYyiRJkhJgKJMkSUqAoUySJCkBhjJJkqQEGMokSZISYCiTJElKgKFMkiQpAYYySZKkBBjKJEmSEmAokyRJSoChTJIkKQGGMkmSpAS0au4ClKaOHTty9dVXs+OOO/LjH/+Yzz77LO+yrVu35gc/+AGHHnooIQRef/117rnnHj799NMmrFiq7tVXX2XChAnV2k888UT69OmTt9+GDRt44oknKCsrI8bIfvvtx6BBg2jTpk0hy5XqZOPGjUyaNInp06fzySef0L59e/r06cOZZ55ZY79169bxt7/9jVdeeYUYI4cccgiDBw+mXbt2TVS5amMoU05nnHEGn332GTvuuGOty44YMYLddtuNu+66ixgjp59+Oueffz5XX311E1Qq1e6HP/whrVr98+uuuLi4xuXHjx/PJ598wr/9278RQmDKlCncd999DB06tNClSrW6/fbbmTdvHieffDKdO3dmxYoVvP/++7X2u/nmm/nwww8ZMmQILVq04P7772fMmDH853/+ZxNUrbooWCgLIewLXAwcBhwETI8xDqhDvyLgBuAUMqdXHwPOjzF+UqhataVu3bpx0EEH8T//8z+cccYZNS7btWtXevbsydVXX81bb70FQHl5OVdeeSU9evRg7ty5TVGyVKOvfe1r7LDDDnVa9r333mPhwoWcc845lJaWAtC+fXtuv/12Fi5cSNeuXQtYqVSz2bNnM3PmTEaNGkWXLl3q3O/tt9/mzTff5LLLLmP//fcHMj9ORo0axZw5czjwwAMLVbLqoZBjyg4ETgDeyj7qahwwADgXOAfoAzzSyLUpjxACgwcPZuLEiaxZs6bW5Xv27MmqVasqAhnAO++8w8cff0zPnj0LWapUEAsWLKBt27YVgQxg9913p2PH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YO+992bSpEkFq1f1U5BQFmNcnqP5VWDXGrp9K/v8UKX1LAWeBQY1XnWqq6effpqSkhIOPvjgvMssWbKEPffcs1r7XnvtxZIlSwpZnlSr733ve7z00ks8+OCDrFmzhkWLFnHddddx+OGH061bt7z9Fi5cSNeuXau177vvvixcuLCQJUs12rBhQ7WjYTvssAMA8+bNy9uvrKyM7t27V2s/4IADKCsra9wi1WBNOdD/CGBuDe93B/4vxri2Svu87HtqQhs2bOD5559n4MCBhJD/VPmaNWto165dtfZ27dqxZs2aQpYo1WrgwIFce+21XHbZZfTs2ZOBAweyceNGbrnllhr7rVq1quKIWmVFRUVexKJmte+++/LSSy9t0bb5rMSKFSvy9isvL6djx47V2ouLi72AJSFNEspCCMcAJwM31bBYMbAyR3t59r186x4eQpgVQpjll2Xjef7551m/fj0DBw6sddl8oa2mMCc1heeff57LL7+cIUOGcO+99zJ27FhWrlzJj370IzZu3Fhj31z7b4zR/VrN6sc//jETJkzgtttuo7y8nMmTJ3PdddcB0LJlyxr7uk+nr1AD/SuEEEqBvwETYox/qmXxXIM8Qp72TIcYbwVuhczVlw0qUtU8/fTTdOnSJefh7srat2/PypXVs/TatWtzHkGTmtJvfvMbjj32WC677LKKth49enDMMccwZcoUjj/++Jz9ioqKck4VsHr16pxH0KSmMnToUF5//XVGjBjB8OHDadOmDaNHj+anP/0pnTp1ytuvuLiYZcuWVWtfuXJlziNoah4FPVIWQtgJmAQsofbB+uVArj2jI7mPoKlA1q5dy4wZM2oc4L/ZnnvumXPsWL6xZlJTWrhwIT169NiirWvXruy44468++67eft17do159ixfGPNpKbSsmVL/vu//5tly5Yxe/ZsPvroIw477DCAiudcunfvnnPsWL6xZmoeBQtlIYQ2wGPA9sCJMcZPa+lSBuwRQmhbpb179j01kenTp/P555/XKZT17duXFStWMHv27Iq2srIy3n//fb7xjW8UskypVl26dOHNN9/cou3tt99mw4YN7L777nn79e/fn2XLlm0xdmf27NksWbKEAQMGFKpcqc6Ki4vp2bMn7dq14+abb+aII46oMVwNGjSIDz/8kGeffbaibdasWSxatIhBg7yWLhUFOX0ZQmgF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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "image = tf.constant([[[[1], [2], [3]], \n", " [[4], [5], [6]],\n", " [[7], [8], [9]]]], dtype=np.float32)\n", "fig, ax = plt.subplots()\n", "ax.imshow(image.numpy().reshape(3, 3), cmap='gray')\n", "\n", "for (j, i), label in np.ndenumerate(image.numpy().reshape(3, 3)):\n", " if label < image.numpy().mean():\n", " ax.text(i, j, label, ha='center', va='center', color='white')\n", " else:\n", " ax.text(i, j, label, ha='center', va='center', color='k')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 3, 3, 1)\n" ] } ], "source": [ "print(image.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We made a simple image that has size of 3x3. Rememeber that the order of data should be `(batch, height, width, channel)`. In this case, batch size is 1, and currently generates the grayscaled image, so the channel should be 1.\n", "\n", "Then, we need to define filter and kernel_size, and padding method. We will use one filter with all-one weight that has 2x2 shape.\n", "\n", "Note that we need to set the same format in image shape and filter. If not, following error will be occurred,\n", "\n", "```python\n", "ValueError: setting an array element with a sequence.\n", "```" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "weight.shape: (2, 2, 1, 1)\n" ] } ], "source": [ "# Weight Initialization\n", "weight = np.array([[[[1.]], [[1.]]],\n", " [[[1.]], [[1.]]]])\n", "weight_init = tf.constant_initializer(weight)\n", "print(\"weight.shape: {}\".format(weight.shape))\n", "\n", "# Convolution layer\n", "layer = tf.keras.layers.Conv2D(filters=1, kernel_size=(2, 2), padding='VALID', kernel_initializer=weight_init)\n", "output = layer(image)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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s2TJEiZNmkRDQwP3338/H/jAB1rte7vttuOMM85gzpw5nHzyycyePZtTTz2VESNGlLEqWotESqnrO40YCDwGzAXOAYYB5wEXpJRObaPtrcA2wInAe5X2r6SUPldVZ1dgJnAp8CtgH+AEYO+U0u1t9N/1K6xuJSJo/Fxff/31DBo0qNlfv/3792fJkiWsWLGiqWyrrbbiySef5PDDD2fKlCkt9n3ZZZex++67s+222za1v+SSS9hvv/3YfPPNS1ojdRejR49e00NQyar3Hw0NDfTv35/jjjuuWZ1LLrmEl19+mbPOOmuV+j733HPp1asXJ5xwQlPZj370I/r27cuxxx7b+cGrW5s5c+ZDKaVSkntZR+b+HegDjE0p3ZFSugw4Azg+IjZsqVFE7ALsBRyeUroxpfQr4GvArhHxhaqqpwG/Tykdm1KakVI6CbgV+GFJ66OMtPUHyqJFi5oFOYCnnnqKt956i8GDB7fadsyYMdx0003N2k+dOpXNNtuM7bbbruODltQttLX/2GKLLdh222256aabVqnf9dZbjx122IGZM2c2K58xYwbbbrttm2cFpNaUFebGALellBZXlU2lCHij2mj3Skrp940FKaU/AM9WXiMiegO7A9fVtJ0K7BIR/Ts/fK1tPvnJT9K3b1/mzp3bYp3111+fzTffnHnz5jUrf/zxxwEYPnx4qWOUtOZ9/OMfB2CDDTZomld31VVXsc8++7Ta7iMf+Qjrrbce8+fPb1b+/PPP06tXLzbddNPSxqyer6wwNxxo9j9eSmk+sLTyWrvbVTxe1W4YsF6deo9TrE/bM1ClKhHBRRddxJNPPsntt7d8ln7AgAEALFy4sFn5ggULABg4cGB5g5TULWy00UYAnHLKKdx5552ceOKJ/PGPf2yae9uSDTbYAIAlS5Y0K3/zzTebvS51xLol9TsQWFinfEHltY6027KqDnXqLah5vUlETAQmtvK+Wov96Ec/YpdddmHUqFEsX768zfotnYYpY/6ppO4lIgC4+eabmTp1KgBz5sxh880357DDDuOBBx7oUH/uP9QZZd6apN4nM1oo70i72uVoqX1KaXJKaURZEw+Vr29+85ucdNJJHH744fzhD39otW7jEbnGI3SNGo/I1R6xk9TzNB5JmzNnTrPyhx9+mC222KLNdv369WtW3rhce8ROWhVlhbkFwIA65f2pf+StrXYDqtotqCqrrUMb/UtNxo4dy09+8hO+973vcd11tVMwV7Z06VLmz5+/0ty4xuXauXSSep7nn3++bnn1VbD1vPTSSyxbtmylq94333xzVqxY0eJtUKT2KCvMzaNmblxEbAb0pf6cuBbbVVTPpXsGWFan3nCKW5msfGMxqcaoUaO4+uqrufjiiznvvPPa3W769OkcdNBBrLPO+78648aNY/78+Tz66KNlDFVSN/LYY4+xePFidtppp2blO+20E88880yL7ZYtW8acOXMYNar5NYC77747c+fO5a233iplvFo7lBXmpgN7RUT1jM5xwNvArDbabVy5jxwAETGCYr7cdICU0rvADODQmrbjgPtTSos6P3zlrE+fPhx88MEcfPDBfPSjH+VDH/pQ03KfPn0YPnw4v/71r5k3bx7XXnstI0eObHpsueWWTf3stttuLFu2jN12262p7L/+67/YdNNN+eUvf8no0aM56aSTOProo5k0adKaWFVJXax3797stttu7LbbbgwaNIgBAwY0Lffu3Zvly5czZcoUDj74YL761a+y8847c9xxx7H99tvz3//930397Lnnntx55518+MMfbiqbMmUKO+ywA9/+9rf5l3/5F44++mhGjhzZ6r0tpfYo6wKIy4BjgZsi4hyKMNYAnF99u5KIeBqYlVKaAJBSuj8ibgOmRET1TYPvSSndWdX/mcDMiLgQ+DXFTYP3AfYuaX2UkcGDB3PDDTc0K2tcHjJkCCNHjmTAgAHssMMO3Hfffc3qXXnllRx55JFAcdpk3XXXbZqgDPDMM8+w9957c/755zN9+nT+/ve/c8IJJ/CLX/yi5LWStDoMGDCAM844o1lZ4/L48eN55ZVXuPHGG1lnnXU46KCDOPzww3nhhRdoaGjgkUceaWoTEfTq1fxLjx599FFOP/10JkyYwP7778/f//53zjrrLB588MHyV0w9WinfAAHF13kBFwO7UMxj+znQkFJaUVXnOWBmSumIqrIBwAXAQRRHDn8LHJtSer2m/wOBs4CtKO5D15BSmtqOcXnJkKQO8RsgJHVUmd8AUVqY664Mc5I6yjAnqaNy/DovSZIkrQaGOUmSpIwZ5iRJkjJmmJMkScqYYU6SJCljhjlJkqSMGeYkSZIyZpiTJEnKmGFOkiQpY4Y5SZKkjBnmJEmSMmaYkyRJyphhTpIkKWOG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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Check the result\n", "fig, ax = plt.subplots()\n", "ax.imshow(output.numpy().reshape(2, 2), cmap='gray')\n", "for (j, i), label in np.ndenumerate(output.numpy().reshape(2, 2)):\n", " if label < output.numpy().mean():\n", " ax.text(i, j, label, ha='center', va='center', color='white')\n", " else:\n", " ax.text(i, j, label, ha='center', va='center', color='k')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "See? This is the output of convolution layer with toy image. In this time, change the padding argument from `VALID` to `SAME` and see the result. In this case, zero padding is added ('half' padding), so the output shape will be also changed." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Convolution layer with half padding\n", "layer = tf.keras.layers.Conv2D(filters=1, kernel_size=(2, 2), padding='SAME', kernel_initializer=weight_init)\n", "output2 = layer(image)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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xne/+13atWvHfvvtR8+ePXnooYfKHLN582auueYaOnbsSOPGjenRowcTJkwgxlhl+/PmzeP4448nLy+PTp068bvf/S5XL0Uq0bp1a/75n/+ZcePG8fjjj3PTTTftdMw999zDn//85zKPiRMnVqv94447jgkTJvDII4/wu9/9jj59+tT2S9AuaFTfHVD9ePDBB2nbti3XXHMNzZo144UXXuCGG25g06ZNDBkypMyxGzdu5P7776d58+bVavu9997j6quvpm/fvlxxxRUsWrSICRMmsM8++3DOOefk4uVIjBs3jk6dOjF+/HhatmzJtGnTuPDCC1m/fj1XXXUVAJdeeinPP/88v/nNb+jSpQv/+7//y4gRI4gx8tOf/rTCtlesWMGZZ57J2WefzW9/+1sWLFjAiBEjaNy4McOGDaurl6g9UIcOHejZsyfLli1jr732qvC42bNnM23atJLt7du3V9l2jx49uO6665g+fTr33XcfPXv2ZMSIEXzyySe88cYbtdJ/7ZqchbIQQhfgWuAE4AhgToyxfzXqNQUmAOeQGcl7Crg6xrghV33dE40bN45mzZqVbPfu3Zt169bx4IMP7hTK7rjjDvr06cPatWur1fbkyZNp2bIlv/71r2nUqBG9e/dmzZo13HfffQwaNIgQQq2+FgngySefpGXLliXbp556KqtXr2bcuHFcddVVbN26lSeeeIIJEyYwfPjwkmP+9re/8fDDD1caym699Vbatm3L5MmTadSoEaeeeiqrVq3i17/+NZdddpnXtHLmpZdeYsGCBQBce+215OfnZz2uoKCAZcuW7VLbgwcPZtGiRdx///0ALFy4kPbt2zNkyBBDWT3J5e3LbwDfApYVParrEaA/MAy4FOgNTK3lvu3xSgeyYt26daOgoKBM2aJFi5g1axY//vGPq932Cy+8wD/8wz/QqNGXmf/000/no48+4q233qp5p6VKlA5kxY455hg++ugjIDNyUFhYSNOmTcsc06xZsypvX06fPp3vfe97Za7p888/n/fff5+FCxfWQu+l7Kpza70mGjVqxBFHHMG8efPKlM+dO5fDDjuMxo0b5+TnqnK5DGVPxhjbxxgHA3+rToUQwonAmcAlMcb/ijH+GbgY6BtCOC2HfRXw5ptv0qlTp5LtGCO33norP/jBDzjooIOq1cZnn33G2rVr6dixY5ny4nZXrlxZW92VqvTCCy9w+OGHA5Cfn8/3v/99brnlFl5//XW2bNnCU089xaOPPlrpm45PP/2U9957j+7du5cp79GjBwBLlizJ3QuQqmnAgAE8+uijTJ48mWuvvZYDDzyw0uNbt27NXnvtxfvvv1+m/P3336dhw4a0bds2l91VBXJ2+zLGWFiDagOBtTHG50u1syCE8E7Rvmdqq38qa8GCBTz//PPccMMNJWVPPvkkGzZs4KKLLqp2O1u2bAFgv/32K1O+//77l9kv5dqsWbN44oknykx4njRpEhdddBHHHHMMACEEfvvb33LJJZdU2M6mTZuAnUeXi+dYlh9dluraggULWLp0KRs2bODggw9myJAh3HzzzVxzzTVs3bo1a53i39GffvppmfJPPvkEgCZNmuS208oqtYn+3YFsbzsXF+1TDqxevZobb7yRfv36cfbZZwOZ/zHvvPNORo4cyb777rvLbVY0x8a5N6oLK1eu5MILL2TQoEFceumlJeU//elPmT9/Pg888ACdO3dm7ty5jB49mpYtW3LZZZdV2qbXtFJVPCcMYPHixSxdupRx48Zx6qmn8tRTT+1SW17P9Su1UNYc2JSlvADonK1CCGE4MBwyw7HaNR9//DHXXHMNrVq1YsyYMSXlDzzwAK1ateKEE04oGd3asWMH27dvZ8uWLTRu3JiGDRvu1F5FI2IVjaBJtW3jxo0MHDiQDh06MHny5JLyN998k7vuuouZM2dy+umnA9CvXz+2bNnCqFGj+OEPf0iDBjvP6CgeISseMStWPEKWbX6mVJ9WrVrFBx98QOfOWf9sAhWPiBVvlx9BU91ILZQBZJvVGCooJ8Z4L3AvQI8ePXIzI/Jr6u9//zsjRoxg27Zt3H333eTl5ZXse/fdd1m8eDEDBgzYqd6AAQO49957Ofroo3fal5eXR6tWrXj33XfLlBfPJSs/10yqTVu3buXss8/miy++4H/+53/K/MEpnvtV/ro95phj2LRpExs2bMg6D6dJkya0b99+p7ljxdvl55pJu4M1a9awbds22rVrx9/+9uW073bt2rFjxw5Wr15dj73bc6W2eGwBkO1tZzOyj6CphrZv387Pf/5z3nvvPSZMmECLFi3K7L/88su56667yjy6du3KMcccw1133UWXLl0qbPukk07iueeeY8eOHSVlzzzzDK1ateLQQw/N2WvSnm37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LlxI+/btGTJkiKFMOdOpUyc6d+4MwIwZM/jss8/K7N97771p3bp1mbLVq1cTQqBLly6Vtv3yyy/Ttm3bkj9eBx98MBs3buTll182lKlO3XjjjcydO5cf/ehHADz99NM0b96cG2+8kTvvvJNt27ZlrXfCCSdw1lln0a9fP+bMmQNkRo8XLFjAgAEDmDVrVp29BlUsV3PKvhNjvDDG+GiM8dkY4yjgITJhLasQwsHAZcBPY4yTYozTge8BhwAX56ife6wYY07abdSoEUccccROtyrnzp3LYYcdRuPGjXPyc6UQwi7XWb58OW3btqVJkyYVHrNjxw4++OCDnYJb165dWbNmDZ9//vku/1yppo4++mieeeaZMmUzZ86kRYsWnHjiiRXWGzhwIGvWrCkJZJB5c/72228zcODAnPVXuyYnoSzGuD5L8WvAQVnKi51R9DylVDsfAHMBr5h6MmDAAB599FEmT57Mtddey4EHHljp8a1bt2avvfbi/fffL1P+/vvv07BhQ9q2bZvL7krVtmnTJtavX1/lvLCPP/6YwsJCmjdvXqa8efPmxBjZtGlTLrsplbHvvvvyxRdflCkrfmPQo0ePCut1796dJUuW7FS+ePFiunfvXrudVI3V5UT/k4BFlezvDrwfY/ykXPlioH+uOqWKLViwgKVLl7JhwwYOPvhghgwZws0338w111zD1q1bs9bZb7/9APj000/LlH/ySeaftbIRCakuLV++nAYNGnDooYdWelzxH7y99967TPk+++xTZr9UF1asWEHv3r3LlB133HEAtGjRosJ6zZs3z/oGoqCgoOS2v+pfnSyJEUIYAAwC7qjksOZAtrecBUX7Kmp7eAjh5RDCy/5yrF33338/c+fOZfHixTz99NOMGTOGFi1acOqpp+5yWzW5tSTl0vLly2nfvj377rtvtY6v6Br22lZduvvuuxk0aBDDhg2jWbNmnHHGGYwcORLI3GqvTLZpKyGEnE1n0a7LeSgLIXQEHgSeiDH+RxWHZ7syQgXlmQox3htj7BVj7FX8zlW5sWrVKj744INK31VVNCJWvF1+BE2qD+vXr6egoKBaS1pUNCJW0QialEsTJ07k7rvv5q677qKgoIApU6YwZswYANauXVthvYKCApo1a7ZTebNmzbwFn5CchrIQQgtgOrCKqifrFwA7XzGZMq+Y3cSaNWvYtm0b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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Check the result\n", "fig, ax = plt.subplots()\n", "ax.imshow(output2.numpy().reshape(3, 3), cmap='gray')\n", "for (j, i), label in np.ndenumerate(output2.numpy().reshape(3, 3)):\n", " if label < output2.numpy().mean():\n", " ax.text(i, j, label, ha='center', va='center', color='white')\n", " else:\n", " ax.text(i, j, label, ha='center', va='center', color='k')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And what if we apply 3 filters in here?" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Weight shape: (2, 2, 1, 3)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAEwCAYAAACDjO10AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3gUVd/G8e+EEEgiISA9dAIECUgV6U1EHpEiIohgCYiCyEMVUFCKioBAKGJDVB6kCNIEghSlqlQBgYQihN5JKAk98/4Rsi9LNgXYJZnN/bmuvXBn58yeWZM7+zszc8YwTRMRERERERERq/JI6w6IiIiIiIiIPAgVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIiluaywtYwjDcMw9hnGMZVwzC2GIbRMBVtBhuGYTp4POOqfoqIPAhlnYhkBMo6EUnvPF2xUcMw2gJfAoOBdcDrwCLDMKqaprkzheYXgLsDL9zpnRQReUDKOhHJCJR1ImIFhmmazt+oYewB1pumGXL7uQewHdhummb7ZNoNBrqZppnL6Z0SEXEyZZ2IZATKOhGxAqefimwYRnGgFPBTwjLTNOOA2UATZ7+fiEhaUNaJSEagrBMRq3DFNbZBt/+NuGt5OJDTMIzcKbT3NwzjrGEYNwzD+NswjOed30URkQemrBORjEBZJyKW4IprbHPc/jf6ruVRd7x+Jom2+4F3gW3AI8CbwM+GYbQyTXOuowaGYXQGOt/+78pZsmR5gK5Lcnx9fdO6C27r3Llzad0Ft2aapuGCzSrr3JSyznWUda7lblnn4+NTuVixYg/QdUlOTExMWnfBbT366KNp3QW3FRkZydmzZx1mXaqusTUMIzuQP6X1TNOMMAzjZWAa4G+a5oU7ttEIWAaUMk1zX2o6bhiGAfwBeJumWSGl9b29vc2iRYumZtNyH5544om07oLbmjp1alp3wa2l9suesk5AWedKyjrXcresCw4ONufMmZOaTct92LhxY1p3wW298sorad0Ft1WlShU2b97sMOtSe8S2NfBNKtYz+P8RPH/iZ8LjjueQeMQvSaZpmoZhzAVGGIaRyTTNW6ltKyJyH5R1IpIRKOtExO2k6hpb0zQnm6ZppPS4vXrCNRhBd20mCDhvmmZSp6sk24X7aCMick+UdSKSESjrRMQdOX3yKNM0DwB7iR8NBGzTwrcGwu5lW7dPWWlJ/HTyGtUTkXRDWSciGYGyTkSswhWTR0H8DbynGYYRCawHXgVKAu0SVjAMoy6wEmhomubq28tWAz8TPzroC7wBPAm0cFE/RUQexGCUdSLi/gajrBORdM4lha1pmjMMw3gE6AcMAnYBTU3T3HnHagaQ6fa/CfYDPYif0CAO2Ao8a5rmPY0Iiog8DMo6EckIlHUiYgWuOmKLaZrfkMzEBKZprsI+/DBNs6Or+iMi4grKOhHJCJR1IpLeOf0aWxEREREREZGHSYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNI807oDVla4cGFCQkJ4/PHHKVmyJFu2bOHVV1+1vZ47d25effVVatasSaFChbh48SIbNmxgzJgxnDlzJsXtV6xYkX79+lG6dGnOnj3LDz/8wLRp01y5S+lKnjx5+M9//kOJEiUoWLAge/bs4dNPP020XsGCBWndujWlSpXCMAxOnDjBDz/8QGRkZLLbr1ixIq1atSJv3rycOXOG+fPns3HjRhftjTU0b96coUOHUrp0aY4fP86ECRMYO3Zsiu38/PwIDQ2lRYsWeHh4sGjRIrp378758+cfQq/F2ZyZbXny5GHQoEFUr16d69evs2TJEj777DOuXr2abB8yZ85Mz549adasGd7e3mzatImhQ4dy/Phxl+zzw+LMXCtQoADt27cnMDCQ2NhYVq9ezfz58zFNM9k+eHt78/LLL1OpUiUMw2Dbtm1MmzaNmJgYZ+9uupDaXBswYABdunQhV65cbNq0ie7du7N9+/YUt9+sWTM++ugjSpYsyYEDBxgyZAg//fSTK3ZFHqLp06ezevVqtm/fzoULF/jhhx944okn7NZZunQpCxcuZNeuXVy+fJmiRYsSEhLCs88+m+L2r1+/ztixY1m4cCFXrlyhatWqfPDBBwQEBLhql9KNlStXsn37dvbv309MTAz9+/enTJkyida7desWYWFhrFmzhnPnzpEtWzaqVq3Kyy+/nOz2Y2Nj+fHHH9m6dSumaVKhQgXat2/PI4884qpdSveio6Pp1asX8+fP5/r169SuXZsJEyYQGBiYYtsFCxYwcOBA9u3bR/Hixfnwww9p06bNQ+j1vdMR2wcQGBhInTp1iIyMdFhElS1blqeeeorFixfTtWtXPvvsM8qXL8+MGTPw8fFJdtuFCxfmm2++4dixY7z11lvMmjWLfv368cILL7hob9KfgIAAypcvz8mTJzl58qTDdQoXLszAgQOJjY1l0qRJfP755/z9999kzpw52W2XLFmSd955h/DwcEaPHs327dvp0qULwcHBrtgVS6hRowZz585l48aNPPfcc0yZMoURI0bw3//+N8W2s2bNol69enTq1InXXnuNqlWrMn/+/IfQa3EFZ2VbpkyZmDx5MgUKFKB379588sknNG7cmCFDhqTYh/fff5+WLVsyatQoevTogb+/P1OmTMHLy8uZu/rQOSvXfHx8ePfddwEYN24cCxYsoEmTJjz//PMp9qFr164EBQUxZcoUJk+eTPHixVP1e25Fqc21/v37M2jQIEaMGMFzzz3H5cuXWbFiBXnz5k12+zVr1uTnn3/m999/p0mTJixevJgZM2bQqFEjV+6WPAQLFizgwoUL1KpVK8l1vv/+e3x8fOjfvz+ff/451apVo0+fPqk6CPHxxx8zb948+vbtS2hoKNHR0YSEhHDt2jVn7ka6tH79ei5fvky5cuWSXW/y5MksX76cJk2a0LdvX1q3bp2qvwGTJk0iIiKCkJAQOnXqxIEDBxg3bpyzum9Jbdq04ddff2XcuHFMnz6dc+fO0bBhQy5evJhsu3Xr1tGqVSvq169PWFgYzz77LC+99BLLli17SD2/Ny47YmsYxmPABKA6EA1MBoaYpnkrhXbZgVCgBfGF9yKgu2ma51zV1/v1+++/89tvvwEQGhpKjhw57F7fsmULzz77LLdu/f8u7969m7CwMBo1asSCBQuS3HZISAhnzpzh3Xff5datW2zYsIEC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gQIFHN6NwTTNZI8UFihQgFWrViVafvz4cSpXrpzq97eqypUrs2nTJtvzhIGSJ554gv3797N37148PT0pUaIETZs25cknn0xyWyVKlCBz5sxERETYTTwVERGBh4cHpUqVct2O3CdXHbGNAhyV8dlxPHKXUjv/FNqlW1WrVmXUqFH8+OOPfPfdd6lut3btWp566im7EeQmTZpw/PhxTRx12759+7h8+TKPPfaY3fLHHnuMI0eOJNnu5s2bhIeHJ5qEplq1auzfv9/ui3RGFB0dzc6dO4mJiaFr166sX7/ebgDgbmFhYeTPn982ky3EB2uJEiVSNZBjcRk261KTbWvWrCE4OJgCBQrYltWvXx8vLy/WrVuX5LYTrtN96qmnbMty585N5cqV3X7G0NTm2o4dOwgODrb7olitWjWuXbuWbDG2Y8cO/P397WbXL1q0KHny5HHrGUOTy7U//viDCxcu2N1ixdvbm+eeey7ZDLt+/Tq///57oluztGnThj///NPdzq5y26zz9fUlODjY9ihWrFiq2968eZMePXpw6NAhvvrqqxTveJEg4e/lnTN2nz59mi1btlh+5vc7eXt7U6xYMdvjXiaoe/zxxzly5IjdWTp79uzh1q1bFC5cOMl25cuX58KFC3YDSwcPHuTMmTNuOfP73bJly0aVKlVsj9KlS9teMwyD0qVLU6JECfbt28eKFSvo2LFjktvKkiUL9evXtxv4AZg1axbVq1e3zQmRnrjqiG0Ed107YRhGIcAXx9da3NnO0W90EOlwavisWbNSp04dIH7a7EceecR2T6c1a9ZQoEABJk6cyIEDBwgLC+Pxxx+3tT1//rztS0rVqlWZMmUKISEhtlGWKVOm0LRpU0aMGMHs2bMpV64cL774ou0UqozAy8vLFkI5cuTA29ubKlWqAPFfzq5fv86CBQto06YNsbGxHDx40PZLPHz4cNt2atasSceOHenbty/nzsXfNm/BggUMGDCAdu3asXXrVsqXL0/58uUZPXr0w9/RdKJatWrUqlWLbdu24efnx0svvUTjxo0T3ZZl3759rF69mk6dOgHxRz2WLl3K1KlT6dOnD3FxcYwYMYK1a9e6/T1scdOsc1a2LVu2jLfeeovx48czfvx4HnnkEfr378+iRYvs7mE7ZcoUIP7+3RB/iujPP//MgAEDMAyD8+fP061bN06cOMHChQsfymfgKs7Ktd9++41GjRrxzjvvsHjxYvLkyUOLFi349ddf7W4BNHLkSCIiImyf8b///suOHTvo3LkzM2fOxDRNXnzxRfbs2eOW162lJteuXbvGp59+yqBBg4iKiiIiIoJevXrh4eHBhAkTbOt16NCBKVOmUKJECQ4fPgzE3+Nx1apVjB07lvnz5/Of//yH//znPzzzzDMPfV9dzC2zLjkJtypLOANi06ZNREVFERAQQHBwMABDhw5lzZo1vPfee1y4cMFuNvLHHnsMLy8vANvpzQmDgPny5aNVq1YMHz4c0zTJmTMnEydOJH/+/DRr1uxh7maaOHjwIGfPnrV9J4uIiODy5cvkypXLNrBQv359li9fztixY3nuuee4evUqP/30E2XLlrU7Uti3b1+CgoJsBVpgYCDlypXj66+/pm3bthiGwU8//USpUqUy5D1sEwwbNoygoCBy5crFP//8w7Bhw2jbtq3dLaemTp1KSEgI//77L0WKFAHi79Vdr149evToQYsWLViyZAlLlixh6dKlabUryXJVYRsG9DUMI5tpmglDLW2AK8DqFNoNMgyjlmma6wAMw6gCFL/9WrqSM2dOxo0bZ7cs4XnDhg0pX748fn5++Pn5MWPGDLv15s2bx3vvvWd77ulp/7/i8OHDdO7cmX79+vH1119z9uxZRo4cyZw5c1y0N+mPn58f77zzjt2yhOe9e/fm7NmzLFu2DMMwaNSoES1btuTEiRNMnDjRbqTOMAwyZcpkd+rKvn37mDhxIq1ataJBgwacOXOGL7/8kp07dz6cnUuHbty4QZs2bRg8eDBxcXGsXbuWmjVrJvpMHE0Z37ZtW8aOHcuUKVPw8PBg0aJFdO/e/WF2P624ZdY5K9tu3rzJG2+8wcCBAxkzZgw3btxgyZIljBo1yq6No8krPv74Y65cuUK/fv3ImjUrmzdvpnfv3olu3WI1zsq12NhYRowYQYcOHejZsyexsbH8+uuvzJs3z27bHh4eia4d/eKLL2jXrh0dO3bEw8ODbdu2MW3aNBftcdpKba59+umneHh4MGDAAB599FE2b95Mo0aNOH36tG0dDw8PPD097f6WrF+/nhdeeIGPPvqILl26cPDgQdq1a3fP91e3ALfMuuT8+OOPdpfTTJw4EYAWLVrYBpkSzi755JNPErVfsWKF7bp4RxNSvf/++3h7ezNixAiuXr1KlSpVGD16NFmyZHH6vqQ3K1assDtrJ+FzrlWrFm+88QYQf7S3f//+TJs2jUmTJuHp6UmlSpUSzTgdFxeX6PKzLl26MH36dL799lvi4uKoUKEC7du3d/FepW/nzp2jR48enD17lkKFCtGnTx/bRHoJ4uLiuHXrlt3Ed7Vq1WLOnDkMHDiQL774gmLFijF9+nTbYHd6Y7hi1r7bN/LeDewERhAfYGOAUNM0B96x3n5gtWmaHe9YthQoBfQB4m63P22aZornZnh7e5tFixZ14p7Indz9/pFpaerUqWndBbdmmqZLpu5T1rknZZ3rKOtcy92yLjg42MxIA/oPm+6Z6zqvvPJKWnfBbVWpUoXNmzc7zDqXXGNrmmYU0BDIBPwCDAHGAh/etarn7XXu1Jb40b8pwFRgC5DyvOkiIg+Zsk5EMgJlnYhYgctmRTZNczfQIIV1ijpYFg28fvshIpKuKetEJCNQ1olIeueqWZFFREREREREHgoVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCxNha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCxNha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCxNha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCzNZYWtYRiPGYax0jCMWMMwjhuGMdQwjEwptClqGIbp4DHTVf0UEXkQyjoRyQiUdSKS3nm6YqOGYeQAVgC7geZACWA08YX0wFRsog+w/o7nZ53dRxGRB6WsE5GMQFknIlbgksIWeAvwBp43TfMisNwwDD9gsGEYI28vS84e0zT/clHfREScRVknIhmBsk5E0j1XnYrcBPj1rqCbSXwo1nXRe4qIPGzKOhHJCJR1IpLuueqIbRDw250LTNM8bBhG7O3Xfkmh/XeGYeQETgMzgPdN07yS0psWLVqUqVOn3meXJSVVq1ZN6y64rYsXUxrslvu1atUqV25eWeeGlHWuo6xzHXfMuoMHD9KhQ4f77LKkZPPmzWndBbfl5+eX1l1wW9HR0Um+5qrCNgfg6F2jbr+WlGvA58Ay4CJQD+hH/LUczR01MAyjM9AZIF++fPfdYRGR+6CsE5GMIE2yzsvL6747LCIZj6sKWwDTwTIjieXxDUzzBNDtjkWrDMM4BUwyDKOCaZrbHLT5GvgaoEyZMkluW0TERZR1IpIRPPSs8/X1VdaJSKq56hrbKMDfwfLsOB7xS86c2/9WeqAeiYg4n7JORDICZZ2IpHuuKra+Od4AACAASURBVGwjiL/mwsYwjEKA7+3X7oV5178iIumFsk5EMgJlnYike64qbMOAxoZhZLtjWRvgCrD6Hrf1wu1/tzijYyIiTqSsE5GMQFknIumeq66x/RLoDsw1DGMEUBwYDIy5c6p4wzD2A6tN0+x4+/lgIBvxN/G+CNQB+gJzTdPc4aK+iojcL2WdiGQEyjoRSfdcUtiaphllGEZDYCLxU8BHA2OJD8G73z/THc8jgD5AJ+LvjXYYGAV87Ip+iog8CGWdiGQEyjoRsQKXzYpsmuZuoEEK6xS96/lM4m/4LSJiCco6EckIlHUikt656hpbERERERERkYdCha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCxNha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCxNha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYioiIiIiIiKWpsBURERERERFLU2ErIiIiIiIilqbCVkRERERERCxNha2IiIiIiIhYmgpbERERERERsTQVtiIiIiIiImJpKmxFRERERETE0lTYPoAVK1bQu3dvnn32WerWrcsrr7zCr7/+muT6M2bM4IknnqB///6p2v727dt5/fXXqV27Ns2bN2fWrFnO6nq6N3v2bJo1a0ZAQACPPPIIlStXZsaMGXbrXLx4kR49elC0aFF8fHwoU6YMoaGhmKaZ4vbXr19PtWrV8Pb2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tm/fzuOPP/5AfX9QrjwV+RfTNAuZptka2JWaBoZhVAcaA6+apvmzaZrzgPZALcMwnnJhX+/LnV/+EpQuXZqoqCi7Zbt372blypW8/fbbqd72H3/8Qf369e1G/xo1asTp06f5999/77/TFuHodJ+KFSty+vRpIH50PS4ujuzZs9ut4+/vn+KpyGFhYTz//PN2n23btm05evSow9M13FFqTte+H56engQHB7N+/Xq75evWraNUqVL4+Pi45H3TmFtlnbNy7Y8//uCxxx6zFbUA9erVI3PmzPz5559Jvv+GDRsAqF+/vm1Znjx5ePzxx5NtZxXOyrawsDCqVq1qK2oBWrRogZeXV7Knki1btgyA559/3rYsICCAWrVqERYWdn87lY44K9sqVarE33//bVfArlu3jixZsti+zCXVLioqylbUQvyX8ZMnT1KpUiWn9C0NuVXWJefy5ct2hRfA4cOHuXLlisMzVHr16sWCBQtSfUp/tWrVAPj9999ty86cOcO2bduoUaPG/XfcAi5cuJDos923bx8xMTHkyZPHtixz5szExsbarRsdHQ2Q7AGIp59+GoC5c+falh0/fpx169bRpEkTp+xDepeaSybu19atW/H397fLwVKlSpE3b162bt3qsvdNLZftuWmacffRrAlwyjTNNXdsZyNw8PZr6d6OHTvsvmiYpsmoUaPo0KGD3S9scq5cucKpU6coWrSo3fKE7brLtVD3KuGLMoCfnx8vvvii3XUaixYt4qeffkp2ACEmJoYjR44QFBRkt7xMmTJA/EiU/L+GDRvy008/MW3aNPr27Uvu3LmTXT9fvnxkzpyZo0eP2i0/evQomTJlokCBAq7sbprICFl3P7l26NChRNc0Zc6cmYCAAA4dOpTke0VGRpInT55EgyDFihVz2+y7n2yLiIhIlGNeXl6UKFEi2RyLiIigYMGCPPLII3bLy5Qpk6HyL6VsK1iwIMeOHbNbdvbsWa5evUrBggWT3G5AQECidhCfgXcO8lhRRsi65CQc2Tp48KDd8ho1alCuXDm++eabVG+raNGinD59OtGR/8jIyETf/TKCcuXK4evrazcgNG3aNAoUKMC7776Lv78/BQsWZMyYMYSHh7Ny5coktxUUFMTRo0dtpzQnCA8PT5SZAl26dKFVq1a8/fbbyc6nkeDYsWMOs8xRZqYFV56KfD+CAEd/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eps8SkREREREROSeqLAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaS4rbA3DCDQM4yvDMLYbhnHLMIxVqWhT1DAM08Fjpqv6KSLyIJR1IpIRKOtEJL3zdOG2ywL/Af4CvO6xbR9g/R3PzzqrUyIiTqasE5GMQFknIumaKwvbX0zTXABgGMYcINc9tN1jmuZfrumWiIhTKetEJCNQ1olIuuayU5FN04xz1bZFRNILZZ2IZATKOhFJ79Lr5FHf3b5+44RhGGMMw/BO6w6JiLiAsk5EMgJlnYi4nCtPRb4f14DPgWXARaAe0A8oATR31MAwjM5AZwBvb28++eSTh9LRjCggICCtu+C25s+fn9ZdkIdLWZeOKetcR1mX4TxQ1uXOnZv333//oXQ0Izp69Ghad8FttWjRIq274LY++uijJF9LV4WtaZongG53LFplGMYpYJJhGBVM09zmoM3XwNcAOXLkMB9OT0VE7p+yTkQyggfNusDAQGWdiKRaej0V+U5zbv9bKU17ISLiWso6EckIlHUi4hJWKGzNu/4VEXFHyjoRyQiUdSLiElYobF+4/e+WNO2FiIhrKetEJCNQ1omIS7jsGlvDMHyIv5E3QADgZxhGQpgtMU0z1jCM/cBq0zQ73m4zGMhG/E28LwJ1gL7AXNM0d7iqryIi90tZJyIZgbJORNI7V04elQeYfdeyhOfFgMjb75/pjtcjgD5AJ8AbOAyMAj52YT9FRB6Esk5EMgJlnYikay4rbE3TjASMFNYpetfzmcBMV/VJRMTZlHUikhEo60QkvbPCNbYiIiIiIiIiSVJhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaSpsRURERERExNJU2IqIiIiIiIilqbAVERERERERS1NhKyIiIiIiIpamwlZEREREREQsTYWtiIiIiIiIWJoKWxEREREREbE0FbYiIiIiIiJiaZ5p3QEry5cvHy1atKBUqVIULlyY8PBwBg0aZLfOV199RZ48eeyWRUVFERISkuL2n3jiCdq1a0f+/Pk5deoUlX7/9AAAHaFJREFUs2bNYv369U7dh/QsOjqav//+m1OnTnH+/Hny589Py5Ytba8fO3aM+fPnO2xbqFAhmjVrluz2Dxw4wIYNG7hw4QJ+fn5UrVqVkiVLOnUfrKZ58+YMHTqU0qVLc/z4cSZMmMDYsWNTbOfn50doaCgtWrTAw8ODRYsW0b17d86fP/8Qei3O5sxsK1iwIG+88QalS5cmJiaGFStWMGvWLOLi4pLtg4+PDyEhIVSrVg3DMNi8eTPffvstly5dcs5OphFn5tr58+dZs2YNp06dwsvLi8cee4yqVavi4ZH8mPW1a9dYt24dBw8exDRNihQpQp06dciaNatzdjKdSW2uDRgwgC5dupArVy42bdpE9+7d2b59e4rbb9asGR999BElS5bkwIEDDBkyhJ9++skVuyIPUVhYGFu2bGHPnj1cvnyZYcOGERwcbLfOb7/9xoQJExK1ffPNN3nmmWeS3X5MTAxTpkxhw4YNmKZJlSpV6NixI35+fk7dj/QoODiYokWLki9fPrJmzcq8efM4duyY3TotW7YkICDAYfs5c+Zw8uTJJLfv5eVF7dq1KVasGIZhEBkZydq1a7l69apT98NKoqOj6dWrF/Pnz+f69evUrl2bCRMmEBgYmGLbBQsWMHDgQPbt20fx4sX58MMPadOmzUPo9b1zSWFrGEZroANQGcgO7AE+M01zRgrtsgCf3G7rC6wC3jZNM9IV/XxQhQsXpnLlyuzdu5fMmTMnud7q1atZsmSJ7fnNmzdT3HaZMmV49913CQsLY/LkyVSuXJlevXpx+fLlVP2hdQfnz5/n8OHD5M2b1+GX4Ny5c9OqVSu7ZZcuXWLZsmUUKVIk2W0fP36cpUuXEhwcTO3atTl06BDLli0jS5YsFC5c2Kn7YRU1atRg7ty5TJkyhT59+lCtWjVGjBhBXFwc48aNS7btrFmzKF26NJ06dSIuLo4RI0Ywf/586tSp85B6nzbcNeuclW2+vr4MGTKEI0eOMHz4cPLly8drr/1fe3ceHVV9/3/8+QkhYSmEoAJmYQuB+EVUAlVZVDCVJepRqwhatd9DLT0IRYuotIp6xFaxtf5KK/rztLSlHoqF4s6+KUFkEUQDBBOWpIQTIDosCRBC8vn+McmUSWYmCeQms7we5+Tg3Ln3zmeuk1fmfe/n87n/izGG+fPnB2zD448/TmJiIq+//jrWWh566CGmT5/O008/fXFvrpk1Vq6dOXOG999/n44dO5KZmcnx48fZsGED1lquv/76gG1YsWIFLpeL4cOHY4zhs88+Y8mSJfzwhz9snDcZROqba9OnT2fGjBk88cQT5OTkMHXqVFatWsWVV17J4cOH/e5/yJAh/Pvf/2bOnDlMmTKFzMxM/vnPf+JyuVi5cmVTvMUmEa5ZF8i6desA6N+/P+vXrw+47gsvvEBMTIzncefOnevc/6uvvkphYSGTJk3CGMO8efN4+eWX+c1vfnNR7Q4FaWlpABQUFNC7d2+f66xbt87rmAJcd911XHbZZQF/JwFGjhxJfHw8a9euxVrL4MGDyczMZPHixY3zBkLQ2LFjyc7O5g9/+ANxcXG8+OKLZGRk8PXXXwc8mZKVlcXdd9/NI488wuzZs1myZAn33Xcf8fHxjBgxognfQf04dcV2KrAf+AVQDGQC840xl1pra5/a+q/ZwD1V2x0FngdWGmP6WWuD7jTLli1b2Lx5MwBPPPGE3w+Gy+Xim2++adC+x4wZw65du/jLX/4CQHZ2NsnJyYwdOzZiCtsePXrQs2dPAJYtW8bp06e9no+JiaFLly5eyw4dOoQxps4zUFu3biUhIcFTeCUlJfHdd9+xdevWiC1sn332WbKysvjpT38KwMqVK4mPj+fZZ59lzpw5lJeX+9zu+uuvZ9SoUdx4442eP/6FhYVs3ryZjIwMVq9e3WTvoRmEZdY1VraNHDmSmJgYZs2axenTp9mxYwetW7dm3LhxvPvuu7V+p6v16dOH9PR0nn76aXbt2gW4C8JXXnmFq666iq+++uoi32Hzaaxc27lzJxUVFYwePZqYmBiSk5M5e/YsW7ZsIT09vdYXwmpFRUUUFBRw1113kZCQALhPQCxatIj//Oc/JCcnN+bbbXb1ybXY2FimT5/OSy+9xOuvvw7Axo0bOXDgAJMnT67VW+F8M2bM4NNPP+XRRx8F3F/G+/bty7PPPhtWhS1hmnWBvPTSS0RFRZGfn19nYdurVy9at25d733n5OSwfft2XnzxRfr27QtAx44deeqpp9ixYwdXX331RbU92C1atAhwv2d/ha3L5fJ6HBUVRadOncjNzcVa63ffXbp0oVu3bixevJhDhw4BUFJSwr333ktSUhIHDx5spHcROjZu3MiKFStYvXo1N998M+A+SdCjRw/eeustpk2b5nfbmTNncuONNzJ79mwAhg8fzs6dO3nhhReCsrB1aozt7dba+621/7LWrrHWTgP+iTsYfTLGJAE/AX5hrZ1nrV0K/BDoBjzgUDsvSqBfrIsRHR3NlVdeWavbcVZWFr1796ZNmzaOvG6wMcY0eJvc3FwSEhJo27at33UqKiooLCysVfympqZSVFREWVlZg183HFxzzTWsWrXKa9mKFSvo2LEjgwYN8rvd6NGjKSoq8vrDv2XLFvbt28fo0aMda2+QCMusa6xsS09PZ/v27V7FW1ZWFrGxsZ4vc/62c7lcnqIW3L/bRUVFpKenN0rbmktj5Vp+fj7JycleBWxqairnzp2r1aXvfPn5+bRu3dpT1IL76lL79u3Jz89vcNuCXX1ybfDgwcTFxXl1Hz516hQffvhhwAyLiYlh+PDhtbodL1iwgEGDBoVbl9KwzLpA6urSfzG2bdtGhw4dvHKwd+/edO7cmW3btjn2uqGsa9eutGrVitzc3DrXKy0t9RS1AEeOHOH48eN19uYLV19++SXR0dHcdNNNnmWdO3fmqquu4uOPP/a7XVlZGWvXruXee+/1Wj5u3Dg2btzI8ePHHWvzhXLkt9ZaW+xj8Xagk4/l1arLfk8/AWttIZAFhPS344yMDP71r3/x9ttv88QTT3DZZZcFXL9Lly60bNmy1lmlgwcP0qJFC68vJPJfx44do7i4uM5xssePH6eyspL4+Hiv5fHx8VhrOXbsmJPNDFqtWrXi7NmzXsuqi/wrrrjC73ZpaWnk5OTUWr57925Pd6NwFelZV1e2JSUl1SqyiouLOXPmDElJSX73m5iY6LM4O3jwoN8xV+HKX64dO3asVoa1a9eO6OjoWlc6zudyuWptB+78C8fsq0+upaWlce7cuVpfmOvKsJSUFGJiYmrl3+7du2nRooXfK1GhKNKzri4TJ07k7rvvZtKkSSxfvrzO9QsLC31mma/MFLfevXtTUlLiVbD64i/L/GVfJDhz5gzR0dG0aNHCa3lsbCy7d+/2u93evXspLy+vlYNXXHEFlZWVDe6N2hSacvKowcCuAM+nAQettSU1lu8GhjnVKKdt3ryZPXv28O2335KUlMTYsWP59a9/zWOPPcapU6d8bvO9730PcE8scL6SEvehCXQ1MpLl5uYSFRVFSkpKwPWqv9TU7KoXGxvr9XykycvL4/vf/77XsmuvvRZwdxfyJ9AfkeoulxEmIrKuPtnWtm3bWjkG7iwLlGP+tistLa3X2LVw4i/XysrKPJl1vtjY2IAZFmi7EydOXHyDg0x9ci0+Pp6SkpJaY55dLhdt27alZcuWPodiVH9Jrpl/1ScWIuBLdERkXSDx8fHcf//9pKamUlFRQVZWFm+++SZlZWUBJ7AsLS31mYFt27atc/xoJIqOjqZ79+7s3LmzznX9ZWBZWVm49aKot169enHmzBm+/vpr+vXrB8Dp06fJzs4OOCFjdZZ16NDBa3l1tgU6idpcmqSwNcZkAHcAgaYCjgd8nS52VT3nb98TgAlAg8Y3NJXqMbLgPou7Z88efv/733PzzTfz0UcfNWhfF9KFLZLk5uaSnJxc75k9/R3PSD3Ob775Jm+88QYPP/wwixYt4tprr+Xxxx8H3N23A/HVddUY41h3/WAVSVl3MdlWn98xf5+dSPtMNTTX4MIyLFyPa31zzV+G+XvufDWfr+92oaypsq6uHm6NwVpb66RGzStb/vTv35/+/ft7Hg8YMIDy8nIWLlzIbbfdFrA7c6R8B6n5fi7k96J79+7ExMTU2Q35Yl4jXFhrvbLNGMPIkSPp0aMHP/vZz/jrX/9K+/btmT59OsePHw84QeT5+6j5Gr6WBwPH72NrjOkOzAfet9b+rY7VfX0SjZ/l7g2sfctaO9BaO9DXWehgU1BQQGFhYcArWf6uzFY/9nUlI9IVFxfjcrnqdbsef1dm/V3JjRRz5871fAl0uVwsXryYF154ASDgGWSXy1XrbB64z/CFY9dGfyI963xlW2lpqc85Adq0aRMwxwJdzYik/AuUa4GuSgTKsNjY2FpdcwHOnj3r80puqKtPrrlcLtq1a1erCOnQoQOlpaV+72Tg72pG9eNwzb+mzLqmuMK2c+dO7rnnHs/Pc889d1H7GzRoECUlJRw5csTvOoF6pYRTr7zExEQmTZrk+bnzzjsvaD+pqakcO3Ys4DGtdqG9WcLFJ598QsuWLT0/GRkZxMTEsGDBAg4fPkxaWhoJCQns27ePhx56KGAvKH+9Uqof+/ru19wcvWJrjOkILAUKqHuiABfg6wh1wPcZv7BVVFREeXk5iYmJXt0uEhMTqaioqHN8QSTKzc0lOjqaHj161LluXFwcUVFRuFwurzEux44dwxgTlL+oTaGyspKf//znzJgxg6SkJPbv3+8ZV/H555/73S4nJ4cbbrih1vK0tDS/9+MMN8o63w4ePFhrLO0ll1xC69atA85MWVhY6HNcd1JSEps2bWr0dgarQLnm68TRyZMnOXfuXMAusPHx8V6TclVzuVz1ys9QU59cy8nJITo6ml69enmNGfM3f0C1vXv3cvbsWdLS0vj000+9tquoqAjK8WcXKxyzLiUlhd/+9reex43VIybQ1azExESfYxsPHjzIdddd1yivHwyOHDniNbmar5NqdYmJiaFbt271nlTL5XL5nIsmPj6effv2Nfj1Q82AAQPYsmWL53G7du0A9xCMvLw8vvnmG6Kjo0lJSeG2224LeHu4lJQUWrZsSU5OjtfEUzk5OURFRQXlPAKOXbE1xrQBPgJigFuttXWdZs8Bko0xNU9VpVU9Fxa6du1KYmIie/fu9bvOuXPnyM7OZvDgwV7Lhw4dyjfffON3bG4ky8vL83RVqUuLFi18/j/Izc2lS5cuYXnVoiGOHTtGdnY2paWlPPLII2zYsIE9e/b4XX/p0qVcfvnlDBkyxLNswIABpKSksHTp0qZocrNS1rn5yrZt27ZxzTXXeHWjHTp0KGVlZQHHSm3bto2OHTt6FbcpKSl06dIlomYMDZRr3bp1o6CgwOuLYl5eHtHR0QEn2OrWrRunTp2qNWPoiRMnwnrG0EC59tlnn3H8+HHGjBnjWb9169bcfvvtATPs7NmzrF271ms7cN8vcuPGjWE3Zjlcs65169b06tXL83OxE9R9/vnntG/fPmA3al8zv+fl5XH48OGQn/n9fOXl5Rw5csTzcyG9GHr27El0dHS9uyEXFBTQtm1bLr/8cs+yTp06ERcXF5Yzv9fUrl07Bg4c6Pnp06eP5zljDH369CElJYXc3FxWrVrFT37yE7/7io2NZfjw4SxcuNBr+TvvvMOgQYOIi4tz7H1cKEeu2BpjooGFQCowxFpbd98BWFH1713A21X7SQBuAB5xop0XKyYmhgEDBgD/vQpRffuAL774gn79+nHTTTexdetWvvvuOxITExkzZgxHjx5lzZo1nv0MGzaMyZMnM3HiRI4ePQrAwoULmTlzJuPHj2fTpk0MGDCA9PR0TxeqSFBeXu4JoZKSEs6ePUteXh7g/nJWPS6gqKiIEydOeBVW58vJyWHNmjU88MADnokDBg4cyHvvvcf69evp2bMn+fn55Ofnc/vttzfBOwtO1113HUOHDuXLL7+kffv23HfffYwcOZKhQ4d6rZebm8snn3zCww8/DLj/iC9btox58+Yxbdo0KisrmTVrFuvXrw/3e9iGbdY1VrYtX76cW2+9laeeeop3332Xzp07M3bsWD744AOvWwDNmTOHnTt3eu4humfPHrZt28aUKVP4+9//TmVlJQ899BC7du0K6XvYQuPlWt++ffnqq69YunQp6enpnDhxgs2bN3P11Vd7FcL/+Mc/SExM9Ny7sEuXLnTt2pXVq1czePBgjDFs3LiRyy+/POzuYQv1y7WysjJefvllZsyYgcvlIicnh6lTpxIVFcUf//jfW7Q++OCDzJ07l5SUFAoKCgD3PR7XrVvHa6+9xnvvvUdmZiaZmZmMGjWqyd+rk8I16wLJy8vjyJEjFBe7J4TeuXMnJ06coFOnTp7bBc6aNYvU1FS6detGZWUlGzZsICsri4cfftira/vEiRPp27cvkydPBtxX9fv378/s2bP58Y9/TFRUFPPmzeOKK64I+3vYgrvQbNeunWey1ISEBFq1asXJkydrdTdOTU3l6NGjficqeuCBBzh06JDnb09RURH5+fn84Ac/YMOGDVhrGTx4MIcOHYrIe9hWmzlzJmlpaVx66aV8/fXXzJw5k3HjxnHLLbd41pk3bx7jx49n7969nhOdM2bMYNiwYTz22GPceeedLFmyhCVLlrBs2bLmeisBOdUVeQ7um3c/CnQ0xpx/nXu7tbbMGLMawFqbUfXvQWPMX4D/Z9z9N6pv5J1PVSAGm7i4OJ588kmvZdWPJ0yYQHFxMXFxcYwfP562bdty8uRJtm/fzttvv+31pc4YU2uigt27d/PKK6/wox/9iFGjRnH48GFee+01duzY4fwbCxKnT5+uNW1+9eMHH3zQ8wUwNzfX01XFF2ttrYkEEhISGDVqFJs2bSI7O5v27dszYsQIunbt6sA7CQ3l5eWMHTuW559/nsrKStavX8+QIUPIzs72Ws/XlPHjxo3jtddeY+7cuURFRfHRRx8xZcqUpmx+cwnLrGusbCstLeW5555jwoQJ/OpXv6K0tJQPP/yQd955x2vfLVq0qDW+8dVXX2X8+PFMnjwZYwxbt27lz3/+s0PvuOk0Vq61atWKO+64g08//ZSPP/6Y2NhYrrnmmlozAPvKvxEjRpCVlcWaNWuw1tK9e3efwwnCQX1z7eWXXyYqKopf/vKXXHLJJWzdupVbbrnF60t2VFQU0dHRXl1MN2zYwD333MOLL77IxIkT2b9/P/fffz8rV65ssvfYRMIy6wJZsmQJa9eu9TxesGABAMOHD/f8fUtMTGT16tWe4jcpKYlHH32UYcOGee2roqKi1gRVjz/+OHPnzuVPf/oT1loGDhzoOWEc7vr16+fVI6e6+/Xu3bu9Toi3atWqziEoUVFRtbp9L1++nBtuuIGMjAyMMRw4cMBruEAk+vbbb3nssccoLi4mOTmZadOmeSbSq1ZZWUlFRYXX34yhQ4eyaNEinnnmGd544w169OjB/PnzGTFiRM2XCArGiZnDjDEHcN+A25ce1toDxph1ANbaYedtFwu8BDwItAE+ASZZa/fX53Xj4+NtzTCRxhNp949sStVXqsQZ1lpHpu5T1oUnZZ1zlHXOCres69Wrl/3d73534Q2XgCL5CqbTqq/OS+MbOHAgW7du9Zl1jlyxtdZ2r8c6w3wsKwOmVv2IiAQ1ZZ2IRAJlnYiEAsdv9yMiIiIiIiLiJBW2IiIiIiIiEtJU2IqIiIiIiEhIU2ErIiIiIiIiIU2FrYiIiIiIiIQ0FbYiIiIiIiIS0lTYioiIiIiISEhTYSsiIiIiIiIhTYWtiIiIiIiIhDQVtiIiIiIiIhLSVNiKiIiIiIhISFNhKyIiIiIiIiFNha2IiIiIiIiENBW2IiIiIiIiEtJU2IqIiIiIiEhIU2ErIiIiIiIiIU2FrYiIiIiIiIQ0FbYiIiIiIiIS0lTYioiIiIiISEhTYSsiIiIiIiIhTYWtiIiIiIiIhDQVtiIiIiIiIhLSVNiKiIiIiIhISFNhKyIiIiIiIiFNha2IiIiIiIiENBW2IiIiIiIiEtJU2IqIiIiIiEhIU2ErIiIiIiIiIU2FrYiIiIiIiIQ0FbYiIiIiIiIS0lTYioiIiIiISEhzpLA1xowxxnxgjCk0xpQYY74wxtxXj+2sj5/PnWijiMjFUtaJSCRQ1olIKIh2aL9Tgf3AL4BiIBOYb4y51Fr7xzq2fRVYdN7jk840UUTkoinrRCQSKOtEJOg5Vdjebq0tPu/xGmNMAu5grCsAD1hrdTZPREKBsk5EIoGyTkSCniNdkWuEX7XtQCcnXk9EpDko60QkEijrRCQUNOXkUYOBXfVY73ljzDljTLExZq4xpqPTDRMRaUTKOhGJBMo6EQkqxlrr/IsYkwGsBMZba/8WYL2/AR8CR4GBwAxgH3CttbbCzzYTgAlVD/sAexqt4c66FPc4FXGGjq9zQu3YdrPWXtYUL6Ss8ynUPi+hRsfXWaF0fJV1zS+UPi+hRsfWWaF0fP1mneOFrTGmO7AJ+Mxae1cDtx0NLAHusta+1/itaz7GmK3W2oHN3Y5wpePrHB1b35R1vunz4iwdX2fp+NamrPNPnxfn6Ng6K1yOr6Ndkau6mywFCoAHLmAXy4ASIL0x2yUi0piUdSISCZR1IhLMHCtsjTFtgI+AGOBWa21pQ/dh/3s52fn+0iIiF0BZJyKRQFknIsHOkdv9GGOigYVAKjDEWnvkAvczCvge8EUjNi9YvNXcDQhzOr7O0bGtoqyrF31enKXj6ywdX5R1DaDPi3N0bJ0VFsfXkTG2xpi3gJ8CjwKbazy93VpbZoxZDWCtzajaZgLuiQVW4R68nA48g3vSgMH+JhkQEWkuyjoRiQTKOhEJBY5csQVGVP37Bx/P9QAOAC1qLN8L/Bi4G2gPFAHzgBkKPxEJUso6EYkEyjoRCXpNcrsfEREREREREac4Oiuy1GaM+R9jzGpjzCljzCFjzAvGmJpnOeUCGGN6GWP+vzFmhzGmwhizrrnbFC6MMWOMMR8YYwqNMSXGmC+MMfc1d7skeCnrnKOsc46yThpKWeccZZ1zwjXrnOqKLD4YY+JxjzXZBdwBpACv4j7B8EwzNi1c9AUygc9xz9oojWcqsB/4Be6xUpnAfGPMpdbaPzZryyToKOscp6xzjrJO6k1Z5zhlnXPCMuvUFbkJGWN+CTwJdLPWnqha9iTwPNCleplcGGNMlLW2suq/FwGXWmuHNW+rwkNV0BXXWDYfGGSt7dFMzZIgpaxzlrLOOco6aQhlnbOUdc4J16xTV+SmNRpYXiPoFgCtgZuap0nhozr8pPHVDL8q24FOTd0WCQnKOgcp65yjrJMGUtY5SFnnnHDNOhW2TSsNyDl/gbW2ADhV9ZxIKBmMu/uVSE3KOgknyjrxR1kn4STks05jbJtWPHDMx3JX1XMiIcEYk4F7PNH45m6LBCVlnYQFZZ3UQVknYSFcsk5XbJuer0HNxs9ykaBjjOkOzAfet9b+rVkbI8FMWSchTVkn9aSsk5AWTlmnwrZpuYAOPpbH4fuMn0hQMcZ0BJYCBcADzdwcCV7KOglpyjqpJ2WdhLRwyzoVtk0rhxpjLowxyUBbaozREAk2xpg2wEe4p9y/1Vpb2sxNkuClrJOQpayTBlDWScgKx6xTYdu0lgIjjTHtzls2FjgNfNI8TRKpmzEmGlgIpAKjrbVHmrlJEtyUdRKSlHXSQMo6CUnhmnWaPKppvQlMARYbY2YBPXHf6+z3utfZxas685RZ9TARaG+Muafq8RJr7anmaVlYmIP72D4KdDTGXH/ec9uttWXN0ywJUso6BynrHKWsk4ZQ1jlIWeeosMw6Y63GtjclY8z/AH8CBuEef/Fn4HlrbUWzNiwMVA1+3+/n6R7W2gNN1pgwY4w5AHTz87SOrdSirHOOss45yjppKGWdc5R1zgnXrFNhKyIiIiIiIiFNY2xFREREREQkpKmwFRERERERkZCmwlZERERERERCmgpbERERERERCWkqbEVERERERCSkqbAVERERERGRkKbCVkREREREREKaClsREREREREJaf8Hf8ICEQW6z5oAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Weight initialization\n", "weight = np.array([[[[1., 10., -1.]], [[1., 10., -1.]]],\n", " [[[1., 10., -1.]], [[1., 10., -1.]]]])\n", "weight_init = tf.constant_initializer(weight)\n", "print(\"Weight shape: {}\".format(weight.shape))\n", "\n", "# Convolution layer\n", "layer = tf.keras.layers.Conv2D(filters=3, kernel_size=(2, 2), padding='SAME', kernel_initializer=weight_init)\n", "output = layer(image)\n", "\n", "## Check output\n", "feature_maps = np.swapaxes(output, 0, 3)\n", "\n", "fig, ax = plt.subplots(1, 3)\n", "for x, feature_map in enumerate(feature_maps):\n", " ax[x].imshow(feature_map.reshape(3, 3), cmap='gray')\n", " for (j, i), label in np.ndenumerate(feature_map.reshape(3, 3)):\n", " if label < feature_map.mean():\n", " ax[x].text(i, j, label, ha='center', va='center', color='white')\n", " else:\n", " ax[x].text(i, j, label, ha='center', va='center', color='k')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pooling Layer\n", "After passing Activation function, the output may be changed. We can summarize the output with some rules, for example, find the maximum pixel value in specific filter that assume to represent that field.\n", "\n", "![max_pool](image/maxpool.png)\n", "*Fig 7, Max-Pooling*\n", "\n", "In the figure, we use 2x2 filter for pixel handling. When the filter is slided by stride 2, filter find the maximum pixel value, and re-define it as an output.\n", "\n", "Or we can find the average pixel value in specific filter that assume to represent that field. Prior one is called **Max-Pooling**, and latter is called **Average-Pooling**. Usually, this kind of process is called **Sub-sampling**, since this process extract the important pixel(Max or Average) from the image, and the output size is reduced by half." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Max Pooling Layer in Tensorflow\n", "Same as Convolution Layer, Max Pooling Layer is also defined in Tensorflow-keras as a high level class. Here is the `__init__` of `tf.keras.layers.MaxPool2D`. (you can also check [AveragePooling2D](https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D) in documentation)\n", "\n", "```python\n", "tf.keras.layers.MaxPool2D(\n", " pool_size=(2, 2), strides=None, padding='valid', data_format=None, **kwargs\n", ")\n", "```\n", "\n", "Actually, it is almost same as that of convolution layer. `pool_size` argument is similar with `filter_size` in convolution layer, and it will define the range to extract the maximum value. Here is brief description of arguments:\n", "\n", "| arguments | |\n", "| --- | --- |\n", "| pool_size | integer or tuple of 2 integers, factors by which to downscale (vertical, horizontal). (2, 2) will halve the input in both spatial dimension. If only one integer is specified, the same window length will be used for both dimensions.\n", " |\n", "| strides | Integer, tuple of 2 integers, or None. Strides values. If None, it will default to pool_size.\n", " |\n", "| padding | One of \"valid\" or \"same\" (case-insensitive). |\n", "| data_format | A string, one of channels_last (default) or channels_first. The ordering of the dimensions in the inputs. channels_last corresponds to inputs with shape (batch_size, height, width, channels) while channels_first corresponds to inputs with shape (batch_size, channels,height, width). It defaults to the image_data_format value found in your Keras config file at ~/.keras/keras.json. If you never set it, then it will be channels_last. |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example with Toy Image\n", "Here, we will check the Maxpooling operation with toy image." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Sample image\n", "image = tf.constant([[[[4.], [3.]],\n", " [[2.], [1.]]]], dtype=np.float32)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[[4.]]]]\n" ] } ], "source": [ "# Max Pooling layer\n", "layer = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=1, padding='VALID')\n", "output = layer(image)\n", "\n", "# Check the output\n", "print(output.numpy())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After that, we found out that the output of this image is just 4, the maximum value. How about the case with `SAME` padding?" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[[4.]\n", " [3.]]\n", "\n", " [[2.]\n", " [1.]]]]\n" ] } ], "source": [ "layer = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=1, padding='SAME')\n", "output = layer(image)\n", "\n", "print(output.numpy())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may see that the output is different compared with previous one. That's because, while max pooling operation is held, zero-padding is also considered as an one pixel. So the 4 max-pooling operation is occurred.\n", "\n", "![SAME padding](image/maxpooling_same_padding.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convolution/MaxPooling in MNIST\n", "In this case, we apply the convolution/MaxPooling operation in more specific dataset, the MNIST dataset. First, load the data. and normalize it. And see the sampled data." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()\n", "\n", "# Normalization\n", "X_train = X_train.astype(np.float32) / 255.\n", "X_test = X_test.astype(np.float32) / 255.\n", "\n", "image = X_train[0]\n", "plt.imshow(image, cmap='gray')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To handle this image in tensorflow, we need to convert it from 2d numpy array to 4D Tensor. There are several approaches to convert 4D tensor. One of approaches in Tensorflow is add `tf.newaxis` like this," ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dimension: (28, 28)\n", "Dimension: (1, 28, 28, 1)\n" ] } ], "source": [ "print(\"Dimension: {}\".format(image.shape))\n", "image = image[tf.newaxis, ..., tf.newaxis]\n", "print(\"Dimension: {}\".format(image.shape))\n", "\n", "# Convert it to tensor\n", "image = tf.convert_to_tensor(image)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Same as before, we initialize the filter weight and apply it to convolution layer. In this case, we use 5 filters and (3, 3) filter size and stride to (2, 2), and padding is `SAME`." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 14, 14, 5)\n" ] } ], "source": [ "weight_init = tf.keras.initializers.RandomNormal(stddev=0.01)\n", "layer_conv = tf.keras.layers.Conv2D(filters=5, kernel_size=(3, 3), strides=(2, 2), padding='SAME',\n", " kernel_initializer=weight_init)\n", "output = layer_conv(image)\n", "print(output.shape)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "feature_maps = np.swapaxes(output, 0, 3)\n", "\n", "fig, ax = plt.subplots(1, 5)\n", "for i, feature_map in enumerate(feature_maps):\n", " ax[i].imshow(feature_map.reshape(14, 14), cmap='gray')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After that, we use this output to push max-pooling layer as an input." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 7, 7, 5)\n" ] } ], "source": [ "layer_pool = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='SAME')\n", "output2 = layer_pool(output)\n", "print(output2.shape)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "feature_maps = np.swapaxes(output2, 0, 3)\n", "\n", "fig, ax = plt.subplots(1, 5)\n", "for i, feature_map in enumerate(feature_maps):\n", " ax[i].imshow(feature_map.reshape(7, 7), cmap='gray')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using this, we extract the feature of input. Then we can use Fully-Connected Layer with softmax activation function for classification. (Actually, We already covered Fully-Connected layer with softmax activation function in previous post)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "In this post, We covered the definition of Convolutional Neural Network, and its basic opeartions, convolution and max-pooling. Unlike Artificial Neural Network, The purpose of these operation is actually to extract the feature and handle it efficiently without whole informations. We can use it in various ways, and of course, we can re-do the image classification with CNN, same as MLP." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }