{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 교재 페이지 (294-298) #####"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "8) CNN Basics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4) Toy image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 3, 3, 1)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x15a41c42208>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "sess = tf.InteractiveSession()\n",
    "image = np.array([[[[1],[2],[3]],\n",
    "                 [[4],[5],[6]],\n",
    "                 [[7],[8],[9]]]], dtype=np.float32)\n",
    "print(image.shape)\n",
    "#3 x 3 흑백 이미지 제작\n",
    "plt.imshow(image.reshape(3,3), cmap='Greys')\n",
    "#(1(n),3,3,1(컬러수))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "image.shape (1, 3, 3, 1)\n",
      "weight.shape (2, 2, 1, 1)\n",
      "conv2d_img.shape (1, 2, 2, 1)\n",
      "[[12. 16.]\n",
      " [24. 28.]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#print(\"img:|n\",image)\n",
    "print(\"image.shape\", image.shape)\n",
    "weight = tf.constant([[[[1.]],[[1.]]],\n",
    "                      [[[1.]],[[1.]]]])\n",
    "print(\"weight.shape\", weight.shape)\n",
    "#일일히 stride를 움직을 필요 없이 conv2d 함수를 통해 계산 가능\n",
    "conv2d = tf.nn.conv2d(image, weight, strides = [1,1,1,1], padding='VALID')\n",
    "#tensor실행\n",
    "conv2d_img = conv2d.eval()\n",
    "print(\"conv2d_img.shape\", conv2d_img.shape)\n",
    "conv2d_img = np.swapaxes(conv2d_img, 0, 3)\n",
    "for i, one_img in enumerate(conv2d_img):\n",
    "    print(one_img.reshape(2,2))\n",
    "    plt.subplot(1,2,i+1), plt.imshow(one_img.reshape(2,2), cmap='gray')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5) Simple convolution layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "image.shape (1, 3, 3, 1)\n",
      "weight.shape (2, 2, 1, 1)\n",
      "conv2d_img.shape (1, 3, 3, 1)\n",
      "[[12. 16.  9.]\n",
      " [24. 28. 15.]\n",
      " [15. 17.  9.]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#print(\"img:|n\",image)\n",
    "print(\"image.shape\", image.shape)\n",
    "weight = tf.constant([[[[1.]],[[1.]]],\n",
    "                      [[[1.]],[[1.]]]])\n",
    "print(\"weight.shape\", weight.shape)\n",
    "#일일히 stride를 움직을 필요 없이 conv2d 함수를 통해 계산 가능\n",
    "conv2d = tf.nn.conv2d(image, weight, strides = [1,1,1,1], padding='SAME')\n",
    "#tensor실행\n",
    "conv2d_img = conv2d.eval()\n",
    "print(\"conv2d_img.shape\", conv2d_img.shape)\n",
    "conv2d_img = np.swapaxes(conv2d_img, 0, 3)\n",
    "for i, one_img in enumerate(conv2d_img):\n",
    "    print(one_img.reshape(3,3))\n",
    "    plt.subplot(1,2,i+1), plt.imshow(one_img.reshape(3,3), cmap='gray')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3filters (2,2,1,3) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "image.shape (1, 3, 3, 1)\n",
      "weight.shape (2, 2, 1, 3)\n",
      "conv2d_img.shape (1, 3, 3, 3)\n",
      "[[12. 16.  9.]\n",
      " [24. 28. 15.]\n",
      " [15. 17.  9.]]\n",
      "[[120. 160.  90.]\n",
      " [240. 280. 150.]\n",
      " [150. 170.  90.]]\n",
      "[[-12. -16.  -9.]\n",
      " [-24. -28. -15.]\n",
      " [-15. -17.  -9.]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"image.shape\", image.shape)\n",
    "#filter 3장으로 입력\n",
    "weight = tf.constant([[[[1.,10.,-1.]],[[1.,10.,-1.]]],\n",
    "                      [[[1.,10.,-1.]],[[1.,10.,-1.]]]])\n",
    "print(\"weight.shape\", weight.shape)\n",
    "#일일히 stride를 움직을 필요 없이 conv2d 함수를 통해 계산 가능\n",
    "conv2d = tf.nn.conv2d(image, weight, strides = [1,1,1,1], padding='SAME')\n",
    "#tensor실행\n",
    "conv2d_img = conv2d.eval()\n",
    "print(\"conv2d_img.shape\", conv2d_img.shape)\n",
    "conv2d_img = np.swapaxes(conv2d_img, 0, 3)\n",
    "for i, one_img in enumerate(conv2d_img):\n",
    "    print(one_img.reshape(3,3))\n",
    "    plt.subplot(1,3,i+1), plt.imshow(one_img.reshape(3,3), cmap='gray')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6) Max Pooling (same : zero padding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 2, 2, 1)\n",
      "[[[[4.]\n",
      "   [3.]]\n",
      "\n",
      "  [[2.]\n",
      "   [1.]]]]\n"
     ]
    }
   ],
   "source": [
    "image = np.array([[[[4],[3]],\n",
    "                  [[2],[1]]]], dtype = np.float32)\n",
    "pool = tf.nn.max_pool(image, ksize=[1,2,2,1],\n",
    "                     strides = [1,1,1,1], padding = 'SAME')\n",
    "print(pool.shape)\n",
    "print(pool.eval())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7) MNIST image loading "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### imagae loading"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-9-0f4c2bb0d16a>:7: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\base.py:252: _internal_retry.<locals>.wrap.<locals>.wrapped_fn (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use urllib or similar directly.\n",
      "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./mnist/data/train-images-idx3-ubyte.gz\n",
      "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./mnist/data/train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
      "Extracting ./mnist/data/t10k-images-idx3-ubyte.gz\n",
      "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
      "Extracting ./mnist/data/t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x15a491be128>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "#MNIST 샘플 다운로드\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "mnist= input_data.read_data_sets(\"./mnist/data/\",one_hot=True)\n",
    "\n",
    "#불러온 이미지 확인\n",
    "img = mnist.train.images[0].reshape(28,28)\n",
    "plt.imshow(img, cmap = 'gray')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### MNIST convolution layter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\jsdata00010\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\client\\session.py:1702: UserWarning: An interactive session is already active. This can cause out-of-memory errors in some cases. You must explicitly call `InteractiveSession.close()` to release resources held by the other session(s).\n",
      "  warnings.warn('An interactive session is already active. This can '\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tensor(\"Conv2D_3:0\", shape=(1, 14, 14, 5), dtype=float32)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 5 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sess = tf.InteractiveSession()\n",
    "img = img.reshape(-1,28,28,1)\n",
    "W1 = tf.Variable(tf.random.normal([3,3,1,5], stddev = 0.01))\n",
    "#일일히 stride를 움직을 필요 없이 conv2d 함수를 통해 계산 가능\n",
    "conv2d = tf.nn.conv2d(img, W1, strides = [1,2,2,1], padding='SAME')\n",
    "print(conv2d)\n",
    "#tensor실행\n",
    "sess.run(tf.global_variables_initializer())\n",
    "conv2d_img = conv2d.eval()\n",
    "conv2d_img = np.swapaxes(conv2d_img, 0, 3)\n",
    "for i, one_img in enumerate(conv2d_img):\n",
    "    plt.subplot(1,5,i+1), plt.imshow(one_img.reshape(14,14), cmap='gray')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8) MNIST Max pooling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tensor(\"MaxPool_1:0\", shape=(1, 7, 7, 5), dtype=float32)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAABZCAYAAAAXQW5UAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAJaklEQVR4nO3dX2hU6RkG8OdtQlg1MUZjErNu6kazikEUFS8U0SItKygGVPQiV17ozeqlFvHCOysIoYg3Ugoq1tCIokLstv6jIggqGHVt2sRgNEbSqjFE1EbHtxdmzdRz5vvOzJwz5xvn+cGimfdwvncfZl4mx/NHVBVEROSuX8TdABERmXFQExE5joOaiMhxHNRERI7joCYichwHNRGR44qDbCQi3wP4PYAiAH9Q1d9Zti+Uc/7+hYCZVFRUaG1tbW66ismrV6/w6NGjBICHCJBJeXm5VlVV5aS3OHV3dw8BGECA90oBfXYCZwIUTi6qKn6vWwe1iBQBOATg1wD6ANwQkbOqej/cFvPSagTMpLa2Fq2trbnrLMcSiQTWrl0LAPcBLEaATKqqqtDS0pKrFmORSCTQ1NT0FdJ4rxQIZpKGIIc+lgDoVtUeVR0B0ApgXbRt5QdmMubevXuoq6sDgBFmMqarqwsA/sv3igczSUOQQf01gMdJP/eNvkZjCj6TgYEBVFdXJ79U8JkAwPPnzwFgJOkl5vIRM0lDkEHtd8zEc7xIRLaKyE0RuZl9W3nJmMng4GAcPcXNmMnQ0FAcPeVUils0/N+L/OwA4EwxCjKo+wB8k/TzdAD9n2+kqodVdbGqLg6ruTxizaSioiKGtnKnuroaAwMDyS9ZMykvL89Zf3GprKwEgJKklzy5FOhnx5gJULC5+AoyqG8AaBCRb0WkBMBmAGejbSs/MJMxjY2N6O3tBYASZjKmoaEBAL7ie8WDmaTBOqhV9T2AHwD8COAfAP6sqj9F3VieYCajiouLsXv3bgD4Dszkk6KiIgB4BL5XPsdM0hDoPGpVbQfQHnSnpaWlWLRoUcr6kSNHrPuYOHGisW77tbmtrc1Y37x5s7UHG1X9LuudfEGWL18OAPdy+atqSUmJsT4yMmKsjw7SlBKJRNo9+RjKp1/fRXxP5f0kpFsjp5VJcXExJk2alLL+7NmzMHpyFq9MJCJyHAc1EZHjOKiJiBzHQU1E5DgOaiIix3FQExE5joOaiMhxHNRERI4LdMFLumbOnImTJ0+mrF+/ft26jytXrhjrfX19xvqhQ4eM9XXr7HdVPHPmjHWboMaNG4d58+alrDc3N1v3sX79emN9/PjxxvroLTdTWrFihbWHMJWVlWHVqlUp67b/HwDYs2dPVj08ffrUWLdlDoR2UQwAoL6+Hvv3709Zr6mpse5j/vz5WfVw4cIFYz1I5vfvh3tr6VmzZuHo0aNZ7eP48ePGuukiPQCYM2eOsb5kyZK0ewqK36iJiBzHQU1E5DgOaiIix3FQExE5joOaiMhxHNRERI7joCYiclwk51F3dHRg6tSpWe3Dds7kgQMHjPXh4WFjfdu2bdYewjyP+s2bN7h7927K+q5du0JbK5XVq1cb6x0dHZH3kGx4eBgXL15MWT937px1H8XF5rdwaWmpsT5hwgRj/cmTJ9YewtTT04ONGzdGusbChQuN9X379hnrtoc1RKGzszPr85SnTJlirJ86dcpY37BhQ1brZ4PfqImIHMdBTUTkOA5qIiLHcVATETmOg5qIyHEc1EREjuOgJiJyXCTnUdscPHjQuo3tPsCVlZXG+uXLl431Y8eOWXvIpWvXrlm3aW1tNdZtudbW1qbVU9xs9wcGgLa2NmO9vr7eWF+6dKmxnuvzqG2uXr1q3Wbu3LnG+uTJk431Bw8eGOvTpk2z9nD79m3rNmFqamqybrN3715jvbOz01jftGmTsd7S0mLtIVP8Rk1E5DgOaiIix3FQExE5joOaiMhxHNRERI7joCYichwHNRGR42I5j3r79u1ZbzN79mxjXUSM9RMnTlh7yKWVK1dat1m2bFlWa7h2TrDNrVu3rNvYzpNes2aNsX7p0qW0eopbc3OzdZve3l5jfceOHcb6li1bjHXTPcTj8vjxY+s2CxYsMNZ37txprNuuU6ioqLD2MDg4aN3GT6BBLSIPAQwDSAB4r6qLM1rtCyMid8FMPjePuXgwEy9mkoZ0vlH/SlWfRdZJfmIm/piLFzPxYiYB8Rg1EZHjgg5qBfBXEbklIlv9NhCRrSJyU0Ruhtee8wJnkumxqTyVMpfkTIaGhuLoLS6BMomjsRhxpgQU9NDHMlXtF5EqAH8TkU5V/XvyBqp6GMBhABARDblPJ6nqwqCZNDY2FkQmADpNuSRn0tDQwExQmJ8dWDIBCjYXX4G+Uatq/+if/wZwGkB2jwP+gjATj3cAc/kMM/FiJmmwDmoRmSAiZT//HcBvANyLurF8wUzGvH79Ghh9TzGXj96+fQswEz/MJA1BDn1UAzg9el5yMYA/qepfIu0qT4hIB5jJJy9evACAOcxlzMuXLwFm4oeZpME6qFW1B8D8HPSSlrq6OmM9yAUk2VLV0HJ59+5d1vuwXeRz586drNcwmT59OgDcd+mc2Pb2dmP9w4cPka5fU1MDhJiJ7WKWIGbMmGGsnz9/3lgfGRnJugeE/D4JcnGUTVdXl7Fuyy3Iwz8yxdPziIgcx0FNROQ4DmoiIsdxUBMROY6DmojIcRzURESO46AmInKcqIZ/Cb2I/AdA8gmflQBcv51huj3+UlWnBt24QDIB0siFmXj5ZJLpmrnGz49XaJlEMqg9i4jcdOkiCD+57pGZxL9eJuLokbnEv14mwuyRhz6IiBzHQU1E5LhcDerDOVonG7nukZnEv14m4uiRucS/XiZC6zEnx6iJiChzPPRBROS4SAe1iHwvIv8UkW4R+W2Ua2VDRB6KyF0RuR3189mYScr1nM+FmXgxE3+h56KqkfwHoAjAAwD1AEoAdACYG9V6Wfb6EEBlDtZhJnmcCzNhJnHlEuU36iUAulW1R1VHALQCWBfhevmAmfhjLl7MxKtgM4lyUH8N4HHSz32jr7lIYXl0fUiYib98yYWZeDETf6HmEuSZiZnyey6Uq6eYLFPVftOj60PCTPzlSy7MxIuZ+As1lyi/UfcB+Cbp5+kA+iNcL2Oq2j/6Z9SPrmcm/vIiF2bixUz8hZ1LlIP6BoAGEflWREoAbAZwNsL1MiIiE0Sk7Oe/I9pH1zMTf87nwky8mIm/KHKJ7NCHqr4XkR8A/IiP/1r7R1X9Kar1slAN4PToE7wjfXQ9M/GXJ7kwEy9m4i/0XHhlIhGR43hlIhGR4zioiYgcx0FNROQ4DmoiIsdxUBMROY6DmojIcRzURESO46AmInLc/wAzw1Fog8jqEQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 5 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#max pooling을 통해 간단하게 subsampling\n",
    "#subsampling 자료는 해상도가 좋지 않음\n",
    "pool = tf.nn.max_pool(conv2d, ksize = [1,2,2,1], strides =[1,2,2,1], padding='SAME')\n",
    "print(pool)\n",
    "sess.run(tf.global_variables_initializer())\n",
    "pool_img = pool.eval()\n",
    "pool_img = np.swapaxes(pool_img, 0, 3)\n",
    "for i, one_img in enumerate(pool_img):\n",
    "    plt.subplot(1,5,i+1), plt.imshow(one_img.reshape(7,7), cmap='gray')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
