Skip to content

Instantly share code, notes, and snippets.

@Erlemar
Created August 19, 2017 10:35
Show Gist options
  • Save Erlemar/703c094ad9484ae89a17ff5f60fc5ea3 to your computer and use it in GitHub Desktop.
Save Erlemar/703c094ad9484ae89a17ff5f60fc5ea3 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"#https://gist.github.com/anbrjohn/7116fa0b59248375cd0c0371d6107a59\n",
"\n",
"def draw_neural_net(ax, left, right, bottom, top, layer_sizes, layer_text=None):\n",
" '''\n",
" Draw a neural network cartoon using matplotilb.\n",
" \n",
" :usage:\n",
" >>> fig = plt.figure(figsize=(12, 12))\n",
" >>> draw_neural_net(fig.gca(), .1, .9, .1, .9, [4, 7, 2], ['x1', 'x2','x3','x4'])\n",
" \n",
" :parameters:\n",
" - ax : matplotlib.axes.AxesSubplot\n",
" The axes on which to plot the cartoon (get e.g. by plt.gca())\n",
" - left : float\n",
" The center of the leftmost node(s) will be placed here\n",
" - right : float\n",
" The center of the rightmost node(s) will be placed here\n",
" - bottom : float\n",
" The center of the bottommost node(s) will be placed here\n",
" - top : float\n",
" The center of the topmost node(s) will be placed here\n",
" - layer_sizes : list of int\n",
" List of layer sizes, including input and output dimensionality\n",
" - layer_text : list of str\n",
" List of node annotations in top-down left-right order\n",
" '''\n",
" n_layers = len(layer_sizes)\n",
" v_spacing = (top - bottom)/float(max(layer_sizes))\n",
" h_spacing = (right - left)/float(len(layer_sizes) - 1)\n",
" ax.axis('off')\n",
" # Nodes\n",
" for n, layer_size in enumerate(layer_sizes):\n",
" layer_top = v_spacing*(layer_size - 1)/2. + (top + bottom)/2.\n",
" for m in range(layer_size):\n",
" x = n*h_spacing + left\n",
" y = layer_top - m*v_spacing\n",
" circle = plt.Circle((x,y), v_spacing/4.,\n",
" color='w', ec='k', zorder=4)\n",
" ax.add_artist(circle)\n",
" # Node annotations\n",
" if layer_text:\n",
" text = layer_text.pop(0)\n",
" plt.annotate(text, xy=(x, y), zorder=5, ha='center', va='center')\n",
"\n",
"\n",
" # Edges\n",
" for n, (layer_size_a, layer_size_b) in enumerate(zip(layer_sizes[:-1], layer_sizes[1:])):\n",
" layer_top_a = v_spacing*(layer_size_a - 1)/2. + (top + bottom)/2.\n",
" layer_top_b = v_spacing*(layer_size_b - 1)/2. + (top + bottom)/2.\n",
" for m in range(layer_size_a):\n",
" for o in range(layer_size_b):\n",
" line = plt.Line2D([n*h_spacing + left, (n + 1)*h_spacing + left],\n",
" [layer_top_a - m*v_spacing, layer_top_b - o*v_spacing], c='k')\n",
" ax.add_artist(line)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nEpHW0KIoIlkihHDpueeee82tt94a+73iffbZp/rNN98cZ2YKbJEMUMtaJHu8/OSTTzbF/QG7traW\nd955pxDfIlNEMkBhLZI9Xlq5cmX9yy+/HGsRd911lxUWFj5lZrWxFiLShSisRbKEmTU3NDRMnzFj\nRn1cNbS0tDB9+vS66urq6+OqQaQrUliLZJHm5ubbH3vssbBkyZJYrv/oo49SXV39KfBcLAWIdFEK\na5EsYmZrgavHjx9f19LSktFrr1mzhgkTJjTU1NScY3HfOBfpYhTWIllm/fr1099+++13brrppuZM\nXvfss89uaGxsnG1mT2fyuiKiqVsiWSmEsFthYeEb8+fPLx4xYkTar3frrbe2TJ06dXldXd1eZhbb\nPXORrkota5EsZGbvNzQ0fHvMmDH1L7zwQlqvNWvWrJYpU6asqaurO1xBLRIPhbVIljKzp9atW/ed\n0aNH1993330pP39zczNXXnnlhosuuuiv9fX1B5nZeym/iIi0irrBRbJcCGFISUnJ3MMPP7zXbbfd\nVrTTTh3fufLNN9/klFNOqfvwww8X1dTUHG9mm++TKSIZo5a1SJYzswXr1q3b8+mnn751zz33bLjh\nhhtaVq9e3a5zLVmyhEsuueTzoUOH1r311luX1NTUDFNQi8RPLWuRTiSEMLisrOzfm5qaxhx33HHN\nEydOLBoyZAi9evXa4s+bGStWrODFF1/klltuqa2srMzJzc2dXVdXd52ZLdvig0Qk4xTWIp1QCGG7\n3Nzcs8rKyk6vq6vrX15evmHw4MHN22+/fW5+fn5OQ0NDy7Jlyza8/vrr+Z9//vmGoqKi11evXn0b\ncL+ZNcRdv4h8mcJapJMLIeQA/YCvA2VAd6ARWAX8CViuRU5Ekk1hLSIiknAaYCYiIpJwCmsREZGE\nU1iLiIgknMJaREQk4RTWIiIiCaewFhERSTiFtYiISMIprEVERBJOYS0iIpJwCmsREZGEU1iLiIgk\nnMJaREQk4RTWIiIiCaewFhERSTiFtYiISMIprEVERBJOYS0iIpJwCmsREZGEU1iLiIgknMJaREQk\n4RTWIiIiCaewFhERSTiFtYiISMIprEVERBJOYS0iIpJwCmsREZGEU1iLiIgknMJaREQk4RTWIiIi\nCaewFhERSTiFtYiISMIprEVERBJOYS0iIpJwCmsREZGEU1iLiIgknMJaREQk4RTWIiIiCaewFhER\nSTiFtYiISMIprEVERBJOYS0iIpJwCmsREZGEU1iLiIgknMJaREQk4RTWIiIiCaewFhERSTiFtYiI\nSMIprEVERBJOYS0iIpJwCmsREZGEU1iLiIgknMJaREQk4RTWIiIiCaewFhERSTiFtYiISMIprEVE\nRBJOYS0iIpJwCmsREZGEU1iLiIgknMJaREQk4RTWIiIiCaewFhERSTiFtYiISMIprEVERBJOYS0i\nIpJwCmsREZGEU1iLiIgknMJaREQk4RTWIiIiCaewFhERSTiFtYiISMIprEVERBJOYS0iIpJwCmsR\nEZGEU1iLiIgknMJaREQk4RTWIiIiCaewFhERSTiFtYiISMIprEVERBJOYS0iIpJwCmsREZGEU1iL\niIgk3P8DwhKnFWSzXNsAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x25d29dbd4a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"node_text = ['','','','h1','h2','h3','...', 'h100']\n",
"\n",
"fig = plt.figure(figsize=(8, 8))\n",
"ax = fig.gca()\n",
"draw_neural_net(ax, .1, .9, .1, .9, [3, 5, 2], node_text)\n",
"plt.text(0.1, 0.95, \"Input Layer\\nImages 28x28\", ha='center', va='top', fontsize=16)\n",
"plt.text(0.26, 0.78, \"W1\", ha='center', va='top', fontsize=16)\n",
"plt.text(0.5, 0.95, \"Hidden Layer\\n with ReLU\", ha='center', va='top', fontsize=16)\n",
"plt.text(0.74, 0.74, \"W2\", ha='center', va='top', fontsize=16)\n",
"plt.text(0.88, 0.95, \"Output Layer\\n10 classes\", ha='center', va='top', fontsize=16)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nNd+oiT9q4o+a+JJkBw4c8G5feOGFtm3bNjPL/Nx95JFHrFmzZhYUFGSPP/6497jWrVvb3Llz7YMP\nPrALLrjALr30UouOjrZXXnnlrKtBdtTE3+bNm+2cc86xP/74w+f+Dz74wOrWrWtLliyx6Oho7/5v\nv/3W6tWrZ2ZmHTp0sHLlyll0dLTFxsaaWWat7r33XouLi7MrrrjC/vGPf1hGRoa3be7cud6+evbs\naYmJiaW6rgS/InBy8OvevbulpaXZ0aNHLSgoyL766iszywx3YWFh9tdff9mJEyesc+fO9uSTT3rb\ncgp+Zv7LLI0fP95niZzk5ORiOMLTI8kmTpxoZmaLFi2yypUrW2JiopmZzZw50+Li4swsc/mprH+o\nGRkZdtddd9l//vMfM8v88pJkixYtMjOzGTNmWEhIiGVkZNiwYcNs7Nix3uuVxhpkR038URN/1MTX\nqULOfffdZ2Zm+/bts2rVqtmuXbvMzPfLOfvn69lWg+yoib8ZM2ZYVFSU3/379+83STZz5sxcg9+2\nbdvsvPPO83le69at7dprr7XU1FQ7cuSIxcbG2vTp071tOQU/s9JbV071FrHevXsrMDDQm3cra4kc\nSbr55ptVtWpVlS9fXgMHDtSiRYtOe//NmjXTRx99pBEjRmj+/PmqXLlyYTa/0PTu3VuSFBcXpyNH\njuiWW26RJMXHx2vLli2SMmeInzBhgho3bqyoqCh98MEHPtdKBgUFqW3btpIya7d792798ssvuvrq\nq/XKK6/o4Ycf1ieffKLzzz+/mI+uYKiJP2rij5rk32233SZJqlGjhurXr69t27ad8jllrQbZUZPC\n0a9fP/3tb3/Tueeeq9tvv71A39elpa4EvyJ2OsvZZC2Tc6qllE7WvHlzJSUl6corr9ScOXPUtGlT\nn+eWFll1yFpT9OTbWTV566239Nlnn+nzzz/Xt99+q5EjR+Z57AEBAQoICFDPnj315ZdfKiQkRJMn\nT1bnzp2L+GgKBzXxR038UZP/Kl++fJ6fjQVZPuxsq0F21MRf48aNtWXLFr8JxlesWKG6devqkksu\nyfd3bG4K8n1dWupK8CtBs2bN0uHDh5Wenq7ExES1a9dOUuZSSqtXr5YkJScn68MPP/Sek33ZpW3b\ntqlKlSq6+eabNWnSJG3evFmHDx8u3gMpJAcOHFCNGjVUrVo1HTp0SFOnTvXZvn37du9XaLNmzVKt\nWrVUp04dbdmyRbVq1VK/fv30zDPPlM6LaQuImvijJv5cqUmDBg20atUqSdKcOXN05MiR095H9s/Q\ns60G2VETf8HBwerSpYuGDBmio0ePSsr8NzBixAg98sgjql+/vnbs2KF9+/ZJkqZNm+Y9t1q1akpJ\nSVFqaqrPPrOWtEtJSdFbb73l832dVf9t27bpiy++8NlXaaxrYIm8KiRJTZs2VYcOHbRv3z41b95c\nw4cPlyQNGTJEN910k0JDQ1W/fn01a9bMe86NN96oadOmKSYmRj169FDdunU1fvx47y+5cePG6bzz\nziupQzoj/fr10/z58xUSEqKLLrpIrVq10o4dO7zt4eHhmjp1qoYNG6YKFSro7bffVkBAgGbNmqU3\n33xTFSpUUEZGhl588cUSPIrCRU38URN/rtRkwoQJGjZsmEaNGqUbbrhBF1544Wnvo2/fvkpISNC8\nefN0zz33aN++fWdVDbKjJjl74403NGrUKEVGRqpChQoqX768HnjgAQ0YMECS9OCDDyo+Pl61atVS\nx44dvedVr15d/fr1U1RUlKpUqeKtSxwaGqqrrrpK+/fvV7du3bxLLh588EH17t1bkZGRCg8P15VX\nXuntq7TWlSXbSkhCQoJiYmK8sIe8LV26VMOHDy+y+RHPRtTEHzXxR02AM9OmTRsNHz5c3bt3L+mm\nFApO9QIAADiCET8AAABHMOIHAADgCIIfAOCsMWzYMAUFBSkgIMDnusU2bdro8ssvV0xMjGJiYjRh\nwgSf573wwgvemq3R0dHetBv79u1Tly5dFBUVpdDQUPXv318pKSnFekxn6vjx47r33nsVHBysyMhI\n3X777ZKkO+64Qw0bNlR0dLSuuuoqrVmzxntOQkKCateu7dXrgQceKKnmF7rc+sjevXt1/fXXKzg4\nWBEREVq2bFkJtrIElci00WXcfffdZ/Xq1TNJ3tJIJ5s7d6517tzZwsPDrXHjxnb33Xfb9u3bfR7z\nr3/9y0JCQiwqKspiY2Nt4cKF3ra9e/da586dLTIy0ho1auSz3FteEhISLDg42KKioqxFixa2evVq\nb9vmzZutTZs2Fh0dbSEhIfaPf/zD0tPTz6AKvnKrSUZGho0ePdqCg4MtIiLC2rRp4/fcpUuXWq9e\nvbx69evXzzZs2ODzmOeee87Cw8O9peumTZvmbTt69Ki3XFV4eLh16dLF9u7de8o2F8V7UFz1eP/9\n961JkyZWoUIFn5VeTnb06FELDQ31mcE+L1OmTLGIiAgrX768z2z0J9uzZ4/VrFnTunXrlq99Zte+\nfXuLjIy06Ohoa9mypX3zzTdmlnffzVJW61LUNRk6dKhFR0d7/1WsWNGee+65U7YrPj7ee054eLhJ\nsvXr15/28Z2uzz//3H755RdvhaQs2VdQONm8efOsRYsW9ueff5pZ5r/fEydOmJnZ/fffb3//+9/N\nzOzEiRPWoUMHe/7554v4KArX8OHD7d577/WWEfv999/NzGz+/PmWlpZmZmbvvfeetzqFmf+qEmVJ\nbn3kjjvu8FbBWr16tdWuXdtSU1NLqJUlh+BXBHLrdBkZGTZgwADr37+/bdy40TIyMiw9Pd0+/vhj\ni4uL85ZzMzP78MMPvSCRlJRk1apV89beLOgHVV4fAt26dfM+7FNSUiwiIsI++OCDMyvESXKrycSJ\nE+3GG2+048ePm9l/P7CyPProo9a5c2dbs2aNF0RXrFhhrVq1stmzZ3uPW7RokfehvnPnTrvwwgtt\n69atZmY2YcIE69mzp/ehOGjQIHvggQdO2eaieA+Kqx6bNm2ypKQke/jhh3MNOPfdd58NGjQo3wEn\nKSnJNm7caH379s31C6N79+42YMCAAge/k5eemjNnjrfsUl5916xs16Woa3Ky33//3SpVquTX707l\n3XfftYiIiNN6zpk6neB31VVX2ccff5zjtuHDh9ugQYMsPT3djh49aq1atbL58+cXSZuLwuHDh61q\n1ap28ODBPB+3b98+CwwM9PpMWQ5+WbL3kcqVK/v07aZNm9qnn35aEk0rUZzqLQJXX3216tSp43f/\n5MmTVatWLU2dOlWhoaEKCAhQuXLldN111+nDDz/UiBEjlJaWJknq2LGjzjnnHElSZGSkzMybbDIg\nIECHDh1SRkaGUlNTdfToUe/1Bg8erHvvvVeStH//fl1xxRXecHbXrl0VGJg5dWOzZs3066+/erO4\nBwQEeBNNpqSkKC0tTZdcckmR12TcuHF66qmnVKFCBUnSxRdf7G177733tHnzZi1YsEBxcXEqV66c\n1/aFCxdq/Pjx3szsbdu29eYvrFu3ri6++GL98ssv3rEdPXpUaWlpOnHihA4fPuy15cknn1TXrl1l\nZjp+/LhiY2M1ffp0SQV/D0pDPbJO72S939ktWrRIv/76q/r06eNzf171iI6OVmhoqPe62U2ZMkWX\nX365WrVqle86ZHfyEkYHDx70ZsfPq++W9boUdU1O9vrrr6tDhw5ev8vr8yT7MQ4cOLBAx1eYHnzw\nQUVGRqp37976+eefvfs3btyotWvX6qqrrlJcXJz+7//+z9v2yCOPaOvWrbr44otVs2ZNhYaGqmvX\nriXR/AL56aefVL16dY0dO1ZxcXFq1aqVFi9e7Pe45557Tp06dfLp+xMnTlRkZKQ6d+5c5qf7SU5O\nVlpams9nalBQkHbu3FmCrSohJRo7y7jsf23ExcXZ8ePH7fjx4zZ48GCLiYmxIUOGWOvWrc3M7Jln\nnsnxL81XX33VoqOjvRGr5ORka9OmjV100UVWpUoVGzJkiPfYlJQUi46OtpkzZ1rnzp19FoQ+2ahR\no6xr167e7e3bt1tkZKRdcsklVqlSJXvyyScLowR+Tq7JwYMHLTAw0J555hmLj4+3+Ph4e+edd7zH\ntmvXzvbs2WNmZv/85z8tOjraevfubT169LCdO3fazJkzczwl9emnn9qll17qjc6lpKTYzTffbOed\nd55Vr17dOnbs6I2AZGRk2PXXX2/jxo2zoUOH+tTyZKfzHpSmeowePdpvZOvAgQPWuHFj27Nnjy1Z\nssRnZCs/9chppODnn3+2uLg4O3r0qCUmJhZ4xM/MrG/fvlanTh2rU6eO32lJM/++60JdiqMmZmYN\nGza0BQsWeLfz83myc+dOO+ecc2zfvn0FOraCyv75unPnTjPLfK8mTZpkoaGh3raqVavaoEGD7MSJ\nE7Zv3z4LCwuz9957z8zMnn/+eRs6dKidOHHC/vrrL2vTpo298sorxXosZ+Lrr782Sfb666+bmdk3\n33xjF154oe3evdt7zLRp06xhw4Y+9+3atcv7HJwzZ45dfPHFdujQoeJtfBE7uY/88ccfVqFCBZ/t\nvXr1silTppRE00oUwa8Indzp9u3bZ927dzezzA+aO++80zIyMmz58uUWEBBgZmYffPCBjRs3zmcf\nixYtsrp169qPP/7o3XeqD6rNmzdbtWrVrEOHDl5QOVlOHwIPPvig96G+Z88eCwsLs08++aSQKvFf\nJ9ckOTnZJNljjz1mZmbbtm2zSy65xJKSkszMrGXLlmaWWZcbbrjBUlNTbfPmzVa5cmXbtm2bff/9\n93bPPff47H/Dhg1Wp04dW758uXff/Pnz7aabbrKUlBQ7fvy43Xrrrfbwww972//44w+rW7euRUVF\nWUpKil+bC/IelJZ65BRw+vTpY++++66ZmV/AyU89sgecjIwMa9Omja1cudLM7IyDX5apU6dax44d\nfe7Lqe+6VJeirMmyZcvskksu8a59y3Kqz5MxY8ZYr169zui4CiJ78MuuYsWK9scff5iZWXh4uC1e\nvNjbNnLkSO8zIDw83L788ktv2+TJk+22224rolYXvn379lm5cuV83re4uDjvFOY777xjDRo0sB07\nduS5n4YNG9ratWuLtK3FLXsfOffccznVa5zqLVZZi6x/99136tatmwICAtSyZUtddNFFkqTff//d\n5/Tq559/rjvuuEPvvfeeQkJCvPtfeOEF9enTR+XLl1fVqlV10003eetwStKmTZtUuXJl7d2712+9\nwRkzZuixxx7Tp59+qlq1ann3P//88+rfv78kqWbNmurUqZOWLl1a6DU4WfXq1VWlShXvF2hBQUE+\nvzzLOj313Xff6YYbbtDf/vY3BQcHKzw8XJJ/vTZu3KjOnTvrtddeU8uWLb37X375Zd14442qVKmS\nKlSooD59+vjUa8eOHcrIyNChQ4f81rks6HtQGuqRmy+++EIjR45UUFCQbrnlFm3cuNHn2PKqR07+\n+usvbdiwQb1791ZQUJBGjhypTz75RG3btj3tGpysf//+WrJkiXdKMre+61JdirImU6ZMUf/+/b3P\nqSx5fZ6YmRITE0v8NO+JEye0Z88e7/bs2bNVq1Ytb/my2267TQsXLpSUeSnL0qVLFR0dLUmqX7++\nty0tLU0ff/yxIiIiivkICq5GjRpq27atPv74Y0mZ68Vu27ZNoaGhmjlzpkaNGqVFixbpsssu83ne\nrl27vP9fuXKlkpOT1aBBg2Jte3Hr1auXt0zamjVr9Ouvv6p169Yl3KoSUNLJsyzL/tdG06ZNLTU1\n1Z5//nm75557LCMjw7766isLCAiwHTt2WOvWrb0LdD///HOrW7eu9wu+k3Xp0sUeeeQRMzNLTU21\nLl26eKN1O3bssLp169r3339vd999t911113e82bMmGENGjTw+wWxmVlkZKQ35H348GGLjY21t956\nq/CK8f9lr8ngwYO9H0UkJyfbZZddZqtWrTIzs2uvvdaSk5Ptgw8+sK5du1paWppt3brVKleubF9/\n/bW1b9/eO5aNGzdavXr1fH55m+W+++6z/v37W0ZGhmVkZNjdd9/tnao7ePCgBQcH22effWZPP/20\n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\nXBSyj4KOHDlSjz76aJ7P6dy5s9566y3v9ieffKIrr7yyqJpY7KhJ4SL4Qd98842Cg4NVo0YNv20f\nffSRXnvtNX355Zf69ttvVblyZf3zn//0tq9atUpTp07Vxo0bVbNmTb300kuSMv+hTp061XtcYmKi\nBgwYIEnq06ePevXqpQ0bNujdd9/VwIEDtWPHjny3d9CgQYqLi9OECROUlJSkTp06FUqbs7vqqqu0\nfft2/fbbb3r77bfVq1cvlS9fXlLmF/HixYv1zTff6Ouvv9bs2bO9U1GTJk3SF198oXfffVf9+/fX\noEGDdPXVV+d6PHv27NHatWu1cuVKTZo0SV999ZVSU1PVo0cPjR49Whs2bND48ePVs2dPHT58WN99\n950eeOABffTRR9qwYYNatGhxytMhUmYoiYqK0tdff63Jkyd7pzz37t2rAQMGaO7cuVq/fr0aNWqk\n5ORkv+fTT+gn+ekneendu7d3Cm/u3Lk+25o0aaIvvvhC69at0/LlyzVmzBjt2rVLnTp1UteuXfXA\nAw8oKSlJgwYN0osvvqiQkBAlJSVpwYIFSk9P16233qr//d//1Zo1a7Ry5Uq9/PLLWrNmjbf/ihUr\navXq1froo480bNgwnThx4rTaXlTyqkl+3X///T5B9/nnn/f+qDgbUZOiRfBDnhYtWqTevXt7p/Hu\nvvtuffrpp97266+/XhdeeKEkqXnz5vrpp58kSf369dOMGTN0/Phx/fzzz9q8ebM6duyoQ4cO6Ztv\nvtHAgQMlScHBwWrZsqWWL19e4m3OSd++fTV16lS99tprXiCRpJSUFA0aNEiRkZFq1qyZduzY4Y06\nVapUSe+++64GDRqktLQ0nzCRk4EDByogIEA1atRQjx49tGjRIm3atEnlypVThw4dJEktW7ZUrVq1\nlJSUpCVLluj6669X7dq1JUlDhw7VZ599pvT09Dxfp1KlSurRo4ffca9cuVJRUVHe6dD+/furQoUK\nee4rO/oJ/SQ/ZsyYoaSkJCUlJXkju1mSk5PVq1cvRURE6Nprr1VycrK+++67fO1306ZN+v7773XL\nLbcoJiZGLVq00KFDh7Rx40bvMX369JEkNWrUSIGBgdq9e/dptb2o5FWT/Grfvr0OHjyodevWaceO\nHVq9erVuvvnmQm5p8aEmRYtr/KAmTZpoy5YtSk5O9r7ochMQEOBzu1KlSt7/ly9f3vsruk6dOoqL\ni9P8+fP1/fff6/bbb1dgYM7dLfs+swQGBvp8SR07dixfx1PQNuekX79+atKkiRo2bKjg4GDv/v/5\nn/9RjRo1tG7dOgUGBqpHjx4+7du0aZMqV66svXv3KjU1VRUrVtSiRYs0cuRISVKvXr308MMP56u9\nBb0/u4oVK3qPLV++/CkDQHb0E/pJUbrrrrvUqVMnzZ49WwEBAWrSpEm+30szU/Xq1X1O+Wd3Ou9n\nScqpP1epUuWUzxs2bJgmTZqkWrVqacCAAapYsWJRNrNYUZPCxYgf1KBBA/Xs2VMDBw70filpZpo9\ne7bq16+vmTNn6q+//pIkvfTSS7ruuuvytd+sa5/eeOMNbxSkatWqatKkiXeNzdatW/XFF1/keIqr\nQYMGWrVqlSRp9erV2rRpk7etWrVq3vVY2bVr167Abc7u0ksv1X/+8x89/fTTPvcfOHBAderUUWBg\noDZt2uQzUrRz504NHTpUixYtUrNmzbxfnLVr1877K/bkL/OsU5379+/X3Llz1bZtW4WEhCgjI8Pb\n71dffaXdu3crJiZG11xzjRYuXKjffvtNkvTiiy+qbdu23unF09WsWTNt2LDBq++bb76p1NRUv8fR\nT3JHPzlzBw4cUL169RQQEKBly5Zp/fr13rbs72P22yEhIapWrZrPtXtbt27N9brM0qxBgwZavXq1\npMxR0JOvscxL37599fHHHysxMbFM/OjlZNSkcDHiB0nSa6+9pieeeEJXXnmlAgMDlZGRoauvvlpP\nP/20jh49qubNm6tcuXKKiorSCy+8kK99duvWTXfffbeCg4MVGhrq3T99+nTdddddmjx5sgICAvTq\nq6/qsssu83v+E088of79++ull15S8+bNFR4e7m0bMmSIRowYoQkTJmjs2LE+z+vYsaO+++67ArU5\nJ3fccYfffaNGjVLfvn31+uuv64orrtC1114rKXO6k1tuuUWPP/64wsLCNGHCBLVo0UIzZszIdcqM\niy66SLGxsTp48KDuvfdetWjRQpI0Z84cDRs2TCNGjFClSpU0a9YsValSRRERERo3bpz3A4K6devq\nlVdeKfDx1axZU6+++qq6d++uihUrqn379qpSpUqOv9Kln+SOfnJmnnrqKQ0dOlSPP/64YmJifC7E\n79u3rxISEjRv3jzdc889SkhIUHh4uCIiIlS/fn0tWLBA77//voYPH64JEyYoPT1dNWrU8Lm4/2wx\nZMgQ3XTTTQoNDVX9+vW9XzKfyrnnnqsePXrot99+U926dYu4lcWLmhSuADOzkm4E4KqgoCBvqoqS\ndOjQIVWtWlVS5tQZ//rXv/TDDz+UaJvwX/QTnEp6erpiY2M1adIktWrVqqSbUypQk5wx4gdAkyZN\n0owZM5Senq5q1app+vTpJd0klEL0k9JpwYIFGjZsmDp27EjA+f+oSe4Y8QMAAHAEP+6AJzExUQEB\nAblOlJubhISEPJfQyu+yTEXldF//2LFj6t69uxo2bKjo6Gi1b99eW7duPeXzvv32W1199dXecmYD\nBgxQSkpKobSpsJ3J69NPMtFPUNZNnDixwNPe5GeS5bNNWakHwQ+SMmfsf+WVV/J90WyWOXPm6G9/\n+1sRteq/invqhSFDhmjTpk1av369unXrlq+JbytVqqTJkyfrxx9/1Pr163XkyBG/X3kWppKYjoJ+\n4ot+grLsTIJOWVRW6kHwgzIyMjRo0CBNmjTJZ56jffv2KSgoyFtpYNasWYqOjvZGJ/bs2aOxY8dq\n/Pjx+X6t5cuXKywszFum6+OPP1bLli0VGxur+Ph4LVmyRFLmMlLh4eEaOHCgN3t7QkKC7rzzTrVt\n21YNGzZUjx49vOkksibAjY+PV0xMjG6++WYdOHCgQPWoVKmSOnXq5M1l1qxZM29ZqrxqEhwcrKio\nKEmZ84Q1bdo0X8tZnQ01kegn2dFPUBhWrFihli1bKjo6WlFRUZo/f36uy/Cdakm9vJamy2tJu5za\nMGbMGP3222/eKhpJSUl59pXff/9dHTp0UFhYmNq1a6ddu3ZRj0KoR5EwOG/cuHH273//28zMWrdu\nbXPnzvW2LVu2zOrXr2+rVq2y2rVr26ZNm7xtXbp0scWLF5uZmSQ7cOBAjvvv37+/TZgwwd555x2L\njo62n3/+2czMfvrpJ2vWrJkdPHjQzMy2bNliF198sR07dsyWLFliAQEBtnTpUp/9xMfH25EjR+zE\niRPWokULe+utt8zM7Mknn7QxY8Z4jx0zZowNHTrU5/UL6vbbb7dhw4blqyZZDh8+bCEhITZnzpwy\nUxP6Sd7oJzhdycnJVrNmTVu2bJmZmaWnp9uePXusbt26tnDhQjMzW758udWqVcsOHTpk27ZtM0k2\na9YsMzP76KOPrGHDht7+JNmzzz5rZmY//PCDValSxdLS0uzEiRMWGxtrP/zwg5mZHTlyxCIjI231\n6tU5tiE5OdnMzOrVq2fr1q3z9p9XX7npppts1KhRZma2a9cuq1Gjho0ePZp6nEE9igq/6nXcd999\np9mzZ+e6OHyrVq00cOBAtWjRQm+88YYaNmwoSd6calnzkp3KtGnTVL58eS1ZskQXXHCBJGnhwoXa\nunWrz6S85cqV086dOyVJ9evXV+vWrX32c+ONN+rcc8+VJMXHx3vLSc2bN08HDx7U7NmzJUmpqakK\nCgrKZxVyN3bsWG3dulWLFy/27sutJllSU1PVu3dvXXfddXkuN3Q21YR+kjf6CQpixYoVCgkJ8X51\nWq5cOe3ZsyfXZfjq1KmT65J6WXJamu6vv/7ylrTLkrWk3d69e/3aUL169Rzbm1dfWbx4sZ599llJ\nUu3atdW1a1fqcYb1KCoEP8ctX75c27dv95aZ2r17t4YMGaLff/9dd999tyRp3bp1uuiii/TLL794\nz1uyZImWLVum999/37sva0i8cePGfq8TFRWl5cuXexe2S5mrPrRv3z7HSVZ//fXXHJfkyW3ZJTPT\npEmTCrzyQk6effZZzZkzR4sWLfK+MLPkVBMp87RZ7969dckll+i5557Lc/9nU03oJ7mjn6Conbzc\n3qmW1MvpfbY8lrT74IMP8t2O0+kr+V0isCCox5nhGj/H3X333fr999+1fft2bd++Xc2aNdPLL7/s\nfZlPnjxZBw4c0Pr16/XSSy9511ZMnz5dv/zyi/c8SdqwYUOOX+aSFB0drffee08DBgzQwoULJUkd\nOnTQokWLtGHDBu9xWcvynK7u3btrwoQJOnr0qCTp6NGj+v777wu0L0kaP3683n77bX366ad+KxPk\nVpOs1RiqV6+ul19++ZT/0M+mmtBPckY/wZlo0aKFtmzZouXLl0vKvI62Vq1auS7DV1B5LWmXUxuy\nlrrLvjReXn2lXbt2eu211yRlXt+2YMGC024n9SgejPghV998842effZZrVq1SjVr1tSbb76p22+/\nXWvWrNGFF1542vsLDQ3Vxx9/rE6dOmns2LHq2bOn3nrrLd155506evSoUlNT1bhx4wIts/TQQw/p\n+PHjuvLKK70v0oceeshn+a782rVrl0aMGKH69evrmmuukZT5V+WqVavyrMnChQs1Z84cRUVFecHm\nqquu0vPPP3/W1yQv9BP6CQrmggsu0Ny5czVixAgdOnRI5cqV0+OPP57rMnx//PFHgV4nMDAw1yXt\nateunWMbunTpomHDhmnw4ME699xzNXXq1Dz7ynPPPaeEhASFhYWpdu3a+b68g3oUPyZwBgAAcASn\negEAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHw\nAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEP\nAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8A\nAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAA\nABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAA\ncATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADA\nEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABH\nEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB\n8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATB\nDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/\nAAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwA\nAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMA\nAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAA\nwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAA\nRxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAc\nQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAE\nwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8AAAAHEHwAwAAcATBDwAAwBEE\nPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfADAABwBMEPAADAEQQ/AAAARxD8\nAAAAHEHwAwAAcATBDwAAwBEEPwAAAEcQ/AAAABxB8AMAAHAEwQ8AAMARBD8AAABHEPwAAAAcQfAD\nAABwxP8D3kPJ0Vi2+j4AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x25d2bc4f2e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import os\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"plt.rcdefaults()\n",
"from matplotlib.lines import Line2D\n",
"from matplotlib.patches import Rectangle\n",
"from matplotlib.collections import PatchCollection\n",
"#https://github.com/gwding/draw_convnet\n",
"\n",
"NumConvMax = 8\n",
"NumFcMax = 20\n",
"White = 1.\n",
"Light = 0.7\n",
"Medium = 0.5\n",
"Dark = 0.3\n",
"Black = 0.\n",
"\n",
"\n",
"def add_layer(patches, colors, size=24, num=5,\n",
" top_left=[0, 0],\n",
" loc_diff=[3, -3],\n",
" ):\n",
" # add a rectangle\n",
" top_left = np.array(top_left)\n",
" loc_diff = np.array(loc_diff)\n",
" loc_start = top_left - np.array([0, size])\n",
" for ind in range(num):\n",
" patches.append(Rectangle(loc_start + ind * loc_diff, size, size))\n",
" if ind % 2:\n",
" colors.append(Medium)\n",
" else:\n",
" colors.append(Light)\n",
"\n",
"\n",
"def add_mapping(patches, colors, start_ratio, patch_size, ind_bgn,\n",
" top_left_list, loc_diff_list, num_show_list, size_list):\n",
"\n",
" start_loc = top_left_list[ind_bgn] \\\n",
" + (num_show_list[ind_bgn] - 1) * np.array(loc_diff_list[ind_bgn]) \\\n",
" + np.array([start_ratio[0] * size_list[ind_bgn],\n",
" -start_ratio[1] * size_list[ind_bgn]])\n",
"\n",
" end_loc = top_left_list[ind_bgn + 1] \\\n",
" + (num_show_list[ind_bgn + 1] - 1) \\\n",
" * np.array(loc_diff_list[ind_bgn + 1]) \\\n",
" + np.array([(start_ratio[0] + .5 * patch_size / size_list[ind_bgn]) *\n",
" size_list[ind_bgn + 1],\n",
" -(start_ratio[1] - .5 * patch_size / size_list[ind_bgn]) *\n",
" size_list[ind_bgn + 1]])\n",
"\n",
" patches.append(Rectangle(start_loc, patch_size, patch_size))\n",
" colors.append(Dark)\n",
" patches.append(Line2D([start_loc[0], end_loc[0]],\n",
" [start_loc[1], end_loc[1]]))\n",
" colors.append(Black)\n",
" patches.append(Line2D([start_loc[0] + patch_size, end_loc[0]],\n",
" [start_loc[1], end_loc[1]]))\n",
" colors.append(Black)\n",
" patches.append(Line2D([start_loc[0], end_loc[0]],\n",
" [start_loc[1] + patch_size, end_loc[1]]))\n",
" colors.append(Black)\n",
" patches.append(Line2D([start_loc[0] + patch_size, end_loc[0]],\n",
" [start_loc[1] + patch_size, end_loc[1]]))\n",
" colors.append(Black)\n",
"\n",
"\n",
"def label(xy, text, xy_off=[0, 4]):\n",
" plt.text(xy[0] + xy_off[0], xy[1] + xy_off[1], text,\n",
" family='sans-serif', size=8)\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
"\n",
" fc_unit_size = 2\n",
" layer_width = 40\n",
"\n",
" patches = []\n",
" colors = []\n",
"\n",
" fig, ax = plt.subplots()\n",
"\n",
"\n",
" ############################\n",
" # conv layers\n",
" size_list = [28, 28, 14, 14, 7]\n",
" num_list = [1, 16, 16, 32, 32]\n",
" x_diff_list = [0, layer_width, layer_width, layer_width, layer_width]\n",
" text_list = ['Inputs'] + ['Feature\\nmaps'] * (len(size_list) - 1)\n",
" loc_diff_list = [[3, -3]] * len(size_list)\n",
"\n",
" num_show_list = list(map(min, num_list, [NumConvMax] * len(num_list)))\n",
" top_left_list = np.c_[np.cumsum(x_diff_list), np.zeros(len(x_diff_list))]\n",
"\n",
" for ind in range(len(size_list)):\n",
" add_layer(patches, colors, size=size_list[ind],\n",
" num=num_show_list[ind],\n",
" top_left=top_left_list[ind], loc_diff=loc_diff_list[ind])\n",
" label(top_left_list[ind], text_list[ind] + '\\n{}@{}x{}'.format(\n",
" num_list[ind], size_list[ind], size_list[ind]))\n",
"\n",
"\n",
" ############################\n",
" # in between layers\n",
" start_ratio_list = [[0.4, 0.5], [0.4, 0.8], [0.4, 0.5], [0.4, 0.8]]\n",
" patch_size_list = [4, 2, 4, 2]\n",
" ind_bgn_list = range(len(patch_size_list))\n",
" text_list = ['Convolution', 'Max-pooling', 'Convolution', 'Max-pooling']\n",
"\n",
" for ind in range(len(patch_size_list)):\n",
" add_mapping(patches, colors, start_ratio_list[ind],\n",
" patch_size_list[ind], ind,\n",
" top_left_list, loc_diff_list, num_show_list, size_list)\n",
" label(top_left_list[ind], text_list[ind] + '\\n{}x{} kernel'.format(\n",
" patch_size_list[ind], patch_size_list[ind]), xy_off=[26, -65])\n",
"\n",
"\n",
" ############################\n",
" # fully connected layers\n",
" size_list = [fc_unit_size, fc_unit_size, fc_unit_size]\n",
" num_list = [1568, 625, 10]\n",
" num_show_list = list(map(min, num_list, [NumFcMax] * len(num_list)))\n",
" x_diff_list = [sum(x_diff_list) + layer_width, layer_width, layer_width]\n",
" top_left_list = np.c_[np.cumsum(x_diff_list), np.zeros(len(x_diff_list))]\n",
" loc_diff_list = [[fc_unit_size, -fc_unit_size]] * len(top_left_list)\n",
" text_list = ['Hidden\\nunits'] * (len(size_list) - 1) + ['Outputs']\n",
"\n",
" for ind in range(len(size_list)):\n",
" add_layer(patches, colors, size=size_list[ind], num=num_show_list[ind],\n",
" top_left=top_left_list[ind], loc_diff=loc_diff_list[ind])\n",
" label(top_left_list[ind], text_list[ind] + '\\n{}'.format(\n",
" num_list[ind]))\n",
"\n",
" text_list = ['Flatten\\n', 'Fully\\nconnected', 'Fully\\nconnected']\n",
"\n",
" for ind in range(len(size_list)):\n",
" label(top_left_list[ind], text_list[ind], xy_off=[-10, -65])\n",
"\n",
" ############################\n",
" colors += [0, 1]\n",
" collection = PatchCollection(patches, cmap=plt.cm.gray)\n",
" collection.set_array(np.array(colors))\n",
" ax.add_collection(collection)\n",
" plt.tight_layout()\n",
" plt.axis('equal')\n",
" plt.axis('off')\n",
" plt.show()\n",
" fig.set_size_inches(8, 2.5)\n",
"\n",
" fig_dir = './'\n",
" fig_ext = '.png'\n",
" fig.savefig(os.path.join(fig_dir, 'convnet_fig' + fig_ext),\n",
" bbox_inches='tight', pad_inches=0)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment