786 lines
1.1 MiB
Plaintext
786 lines
1.1 MiB
Plaintext
|
{
|
|||
|
"cells": [
|
|||
|
{
|
|||
|
"attachments": {
|
|||
|
"image-10.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-11.png": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAF2CAIAAAADQ9xbAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4AeydB3wVV3b/N//ks8lmky1JdpPd9N1kUza7brumF/XeACGJXm2MMe69V7CNTRcgiiTUkeiid5tqbDC9q4IaqPcngf/fO/cxfiro3REGnuDymY+YN3PPPXfOvDfnN6d+7xv9T0tAS0BLQEtAS0BLQEtAQQLfUxijh2gJaAloCWgJaAloCWgJfKNBg/4SaAloCWgJaAloCWgJKElAgwYlMelBWgJaAloCWgJaAloCGjTo74CWgJaAloCWgJaAloCSBDRoUBKTHqQloCWgJaAloCWgJaBBg/4OaAloCWgJaAloCWgJKElAgwYlMelBWgJaAloCWgJaAloCGjTo74CWgJaAloCWgJaAloCSBDRoUBKTHqQloCWgJaAloCWgJaBBg/4OaAloCWgJaAloCWgJKElAgwYlMelBWgJaAloCWgJaAloCGjTo74CWgJaAloCWgJaAloCSBDRoUBKTHqQloCWgJaAloCWgJaBBg/4OaAloCWgJaAloCWgJKElAgwYlMelBWgJaAloCWgJaAloCGjTo74CWgJaAloCWgJaAloCSBDRoUBKTHqQloCWgJaAloCWgJaBBg/4OaAloCWgJaAloCWgJKElAgwYlMelBWgJaAloCWgJaAloCGjRY/g5cu3atuaa6sajQwlZw6Wpj47XmZltxkQWqwsKmslLBrrLCAhULKyy41tR01WazFVtZZGFBU2UF7GBqiZ2tqPDa1atXGxosUbHI5toa2NmuXLZAWFhoKykWMqmttUCFTLgFDQ2sE3ILhLArvSJkUlVlgUqys9ksf7c0gZaAloCWgGtLQIMGa/cH/dFQcOncyMhTIb6nQpW2k8HeJ736lK7MKJw361SwtyIVw0769j83Zljt8aNnBodYYBfkddK7T9W+Pfnvvn4qxEeZnc9Jn/45LzxdtffzU2H+ylS+JwM9WWftqRPZTz9ugV2Iz0nvvpemf1SaudoCFTLxdz8V6Fmfk3V+7DALMgn2OeHVpyQxvmhJzKlgdZlwC9zORIbVnT51JmqABZkEiTtesXO7te+WHq0loCWgJeDyEtCgwcItsiOGEYPPjoq88Nhole3chFEng7wO9u8OyamBAefVqBh2ZujAL917ngzxPT0w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
|
|||
|
},
|
|||
|
"image-12.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-2.png": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAADhCAIAAAClV/EUAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Ae2de9yVU97/MyiHojJFymSEUjQGORVhYvDkVERKKY8OpgiVKcY5FCIZE8lhJIlIaAySHMepcoqk5JBTZDLOGc/vPfP9zXrWs/d9731da+99X9fe92f/sV/fa13rWofP+q61Puu7TnX+Rz8hIASEgBAQAkJACERAoE4EP/IiBISAEBACQkAICIH/EWmQEggBISAEhIAQEAKREBBpiASTPAkBISAEhIAQEAIiDdIBISAEhIAQEAJCIBICIg2RYJInISAEhIAQEAJCQKRBOiAEhIAQEAJCQAhEQkCkIRJM8iQEhIAQEAJCQAiINEgHhIAQEAJCQAgIgUgIiDREgkmehIAQEAJCQAgIAZEG6YAQEAJCQAgIASEQCQGRhkgwyZMQEAJCQAgIASFQfNLwwQcfDBkyZKh+tR6BwYMHz5s3T3VMCAgBISAEKgaB4pOGV155pUePHvPnz388od9DDz100EEHPfjggwnF/zh5v+qqq3r37v3UU08llYY5c+bss88+jz76aFIJIO/Dhw+fOHFixVQVZUQICAEhIASKTxoWLVo0aNCgBJH9+uuvu3XrtmbNmgTT8MgjjwwbNizBBHz55Ze/+c1vfvzxxwTTcN11111++eUJJkBRCwEhIASEQHERqEDS8I9//OOoo4764osviotUrND++te/nnbaabE+Ka7nv//975CG77//vrjBxgrtj3/84xVXXBHrE3kWAkJACAiBNCMg0lCS0hFpAFaRhpLolgIVAkJACCSHgEhDSbAXaQBWkYaS6JYCFQJCQAgkh4BIQ0mwF2kAVpGGkuiWAhUCQkAIJIeASENJsBdpAFaRhpLolgIVAkJACCSHgEhDSbAXaQBWkYaS6JYCFQJCQAgkh4BIQ0mwF2kAVpGGkuiWAhUCQkAIJIeASENJsBdpAFaRhpLolgIVAkJACCSHQLpIA4cRffXVV59//jlnLSD/9NNPAcgUck4DMf7www+c8bB69WoOOQhLAGkunDQQ9apVq9auXRuAAJ8U5ZwGQPjmm2+CQRBpCCs7fSUEhIAQSC0CKSIN33333QUXXNCyZctGjRo1b978oosu4mzHgB6rENJAP923b9/GjRtvsskmhx566PLly8NKrkDS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
|
|||
|
},
|
|||
|
"image-3.png": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAADsCAIAAAAZyeLKAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Ae2dB5gVRfb2UVnz6ipmRUUlKMbFuGZdXXXNWVExrqysOa6LrrjKmkERAyrmhKCoiCBIFgQBARERkKSIERAFhmHu5fuNx39tf7dnmr51m+k7d977zAPV1RVOvXW66q1Tqd5y/YSAEBACQkAICAEhEAOBejHCKIgQEAJCQAgIASEgBJaLNEgJhIAQEAJCQAgIgVgIiDTEgkmBhIAQEAJCQAgIAZEG6YAQEAJCQAgIASEQCwGRhlgwKZAQEAJCQAgIASEg0iAdEAJCQAgIASEgBGIhINIQCyYFEgJCQAgIASEgBEQapANCQAgIASEgBIRALAREGmLBpEBCQAgIASEgBISASIN0QAgIASEgBISAEIiFgEhDLJgUSAgIASEgBISAEBBpkA4IASEgBISAEBACsRAQaYgFkwIJASEgBISAEBACIg3SASEgBISAEBACQiAWAiINsWBSICEgBISAEBACQkCkQTogBISAEBACQkAIxEJApCEWTAokBISAEBACQkAIJEkastlMNlOhvyJBoKJiWUUR/PSNCQEhIASEQMkgkCRpyEx7NzOqQ2Z05zT/Prw38+EDaQpA8T+8P/PhfenKMKX3fe3a3tgu1V/btm2ffPLJkvlUVBAhIASEgBBIkjRkh95OT5md+X6Kf5n3b8h8cFeKApB1ZtidmYE3Z2cOSFGMbwZ07HlPqzfffOvN9H7333//mWeeqW9MCAgBISAESgaBREkDneVXH2ZTxSY7tktmaq+UZZj8Rmb8MynLMHtIdsS9qVbF8tGjR5977rnpyqDchYAQEAJCIEEEkiYNX45IUDiPpLJjH89M6eURMcEo2cmvZ8Y/nWCCHkllZw3ODE+ZNHz00UciDR51pyhCQAgIgaJFQKQh+aoRaTBMRRqS1y2lKASEgBBIFQGRhuThF2kwTEUaktctpSgEhIAQSBUBkYbk4RdpMExFGpLXLaUoBISAEEgVAZGG5OEXaTBMRRqS1y2lKASEgBBIFQGRhuThF2kwTEUaktctpSgEhIAQSBUBkYbk4RdpMExFGpLXLaUoBISAEEgVAZGG5OEXaTBMRRqS1y2lKASEgBBIFYFiIQ2ZTObHH3+cPXv2119/vWjRomzW82ykQs5pINMFCxbMmjVrzpw5ZWVl/jIUfE4DWSPDL7/84q0bhZ/TgAzUxc8//+wtg0iDN3SKKASEgBAoTgSKgjQsW7bslVde2XvvvbfddtvGjRu3atVq+vTpfn22N2kgu5EjRx566KFbb701Ytxwww0//fSTpwyFkQYyhTztsMMOffr08VaaAkkDMsAYmjdv3qNHD28ZRBq8oVNEISAEhEBxIlAUpGHAgAFrrLHGrbfeOnny5IEDB+6yyy7777//kiVLPCDzJg3ffffdVlttdfbZZ0+YMKFbt24NGjS45ZZbap40cC3lpEmT9ttvv3r16vXu3dsDAYtSCGlAhs8///yQQw5BBqDwlkGkwRs6RRQCQkAIFCcCRUEaLrnkkoMPPtgBNGjQoFVWWWXGjBnOJ77DmzQ8/PDDG264IdYFy4vHDTbYYP78+fGzdiELWdPQtWvXhg0bHnjggauuumpapOGll17C1vKnP/2pfv36Ig2uWuUQAkJACAiBoiANn3322cSJE92w/t1334U0TJ061aN6vEnDiSeeeNhhh7G0gkyRZMqUKcgwbtw4HxkKmJ4455xzOnfu/P3336+55pppkYaLL764Y8eO8+bNW3fddUUaPBRAUYSAEBACpYpA+qTBcQWDmKWIjLNbtGjB9ETOqzh14E0adt999wsuuMDlSLe9+uqr9+rlc/dVIZYGEwALR4qkwZgTSyBFGuKoXF5hspll2WVl+isWBDLLGCLkVYMKLATqOALpkwZXAfSXjG4vuuiiTTfdlOlw55+Xw5s0NGnS5O9//7sjDWzlWHvttbt3755X7ha4ENJgKaRLGkwGkQaPql9hlPIvBpUNvKts8L0p/i0ZeBd/KQpQmXWlDP9NWYZBd5d/3ne5OMMKtVYBhEAAgWIhDfTWX3755SmnnMJqRNZCBiTMz+lNGnbdddcLL7zQkQazNPjtXxBpsDrTQsiw7i4d/Uz5+Fcqvp6Q4l/ZiMfKRj2VogBkvXTsC2XDOqYrQ/nEN8tGPMpsZLia5CMEhEB1CBQFaaCrZlkDWy7Z4zd+/PjqZI3j700ajj/++COPPNIs82TE9gGWItb8mgYroywNceq6NoZZOvzhZdOHpCv50nGvlk/sma4My6b2X/pR15Rl+Gps2eB7RBrSrQXlXusQKArSgI1h5513ZpvlV199VSCC3qSBpX9Mi/zwww8wGH6sRtx4442ZLsGdr0iyNBhisjSENWfp8M7Lpg8O+9ekT3GQhn5FQBrGiDTUpOIpr9JAIH3SQK/MloHVVluNbpsjnl7+vx/9twfEfqQBGTjLiJmRNm3afPLJJ/369eOIp5tuusmDMSCzSINVnEhDWIFFGgyTZVNFGsLaIR8hUAsQSJ80LF68eN99923atGmjRo04HsB+9Nljx471wM+PNFhGbHFkD8X222+/3Xbbsb7B+xTnwkkDx0Xstttugwf7D0kLOdzJ0OAw7z/+8Y9sf/WoBYsi0hCGTqTBMBFpCOuGfIRArUAgfdLAaJ7dleGfW16QF47epMGMCojB6oq5c+fmlWlO4MJJg2HCyYw5Kcd/LJw0FC6DSEO4vkQaDBORhrBuyEcI1AoE0icNycLkTRoSFKNw0lC4MIWThsJlEGkIYyjSYJiINIR1Qz5CoFYgINKQfDWJNBimIg1h3RJpMExEGsK6IR8hUCsQEGlIvppEGgxTkYawbok0GCYiDWHdkI8QqBUIiDQkX00iDYapSENYt0QaDBORhrBuyEcI1AoERBqSryaRBsNUpCGsW4WTBpbHjh49mj1H4cRj+hRyTgPLk2fPnj1q1ChumEMGWz4cM99gsMJJA1mzwWrhwoXBZPNyL/tK5zTkBZgCC4FKBEQaktcDkQbDVKQhrFsFkgb67P79+6+//vp+d8CaPN6kgdw5SYXNwM2aNWODNHe1cHSpH28okDSQ6ciRI7nLHh0LgxzTR6QhJlAKJgSCCIg0BNFIxi3SYDiKNIT1yZs00E0ysn/99dc322wz74vjTR5v0jB58uT11lvvtttumzlz5jvvvMMJqu3atat50lBWVsalMBymUq9ePWweYZBj+og0xARKwYRAEAGRhiAaybhFGgxHkYawPnmTBkb5HFe6xRZbnHXWWdyKkoql4frrr+fos2XLllm57rnnHniD3xlohVgabr75ZsMB8iTSENYx+QiBlYqASEPy8Io0GKYiDWHdKoQ0cGv8gAEDOHyMM9dTIQ377LNPy5YtzbTAvywpoNv+4osvwsVcoU8hpKF169bYOebMmVO/fn2RhhVCrQBCIFkEkiUNd2RmDMgu/TnFv8xHnTKfdU9RALLOTHw5M/bxdGUon9p3fv///PTTQk6kTus3aNAgbhVJVl9re2repMHNArACMRXSgAANGzZklO8kYZICSYYPH+5RKYWQBssO0kDuIg0e4CuKECgEgURJw9DbK3pdnBn4rxT/KrqfUvHmuSkKQNYVPVtW9DgtXRkmPHHeRcftxdg0xR+3jZ922mmFaGfpxfUmDQ6KtEgD8yObbLJJcBHDrFmzfve73/ndkFI4aeBGXJEGpxVyCIEaQyBZ0nBHZnLP7IKZKf5lht+dGf9MigKQdWbsE5mRD6Qrwy/ju33+2o0YsVP8sWoPa3aNqXKtyKj2kgYMDNtss82NN97oLA3Tp0+n22b/pwfyIg0eoCmKECgGBBIlDcPuzHw5IptqsbJju2Sm9kpZhslvVBKXdHGYNSQ74t5URVhOd3LuueemK0Ox5V57SQNIHnLIIaeeeqojDcOGDWNVwZdffukBskiDB2iKIgSKAYHkSUO6pdKFVYa/LqxKVw+ry71Wk4Y777yTZQ3z5s2DNzBbcd1113GjPRfDOhpRXanD/iINYUzkIwRqBQIiDclX
|
|||
|
},
|
|||
|
"image-4.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-5.png": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAADfCAIAAACbJ5fJAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Ae2dB5gVRfb2MS5g2DVhDpgwYkRFxVUxB4xrVmQVDKuooGvCBAgo6qp/zIiurhlECUYUI4pIEBCUMGMOGFDEScyM3284a329NXcufavH6Xtn3vvwDNXVFd86feqtU6nZb/oJASEgBISAEBACQiAGAs1ihFEQISAEhIAQEAJCQAj8JtIgIRACQkAICAEhIARiISDSEAsmBRICQkAICAEhIAREGiQDQkAICAEhIASEQCwERBpiwaRAQkAICAEhIASEgEiDZEAICAEhIASEgBCIhYBIQyyYFEgICAEhIASEgBBIRBrKysp++eWXhan+8qEA+VCGVBuhJvNff/21urpaX5QQEAJCQAg0YgQSkYa+ffvuu+++x6T3O/LII3fddVf+pleEYzp27LjPPvukWACybteuXadOnVIsw1FHHXXooYf+/PPPjfhTUdWEgBAQAkIgEWno3r37ww8//P3333+b0q+oqOiQQw6ZPXt2Svl/+91339122219+vRJqwDkO3/+/A4dOkyaNCnFMsyYMeOAAw744Ycf9EUJASEgBIRAI0YgEWm44IILRo4cmSI6CxYsYIxLr5liGYYMGXLrrbemWACyxtrx6aefplgG+Mree+8NfUyxDMpaCAgBISAE/mgERBqSIizSAIIiDUnFSPGFgBAQAoWAgEhD0lYSaQBBkYakYqT4QkAICIFCQECkIWkriTSAoEhDUjFSfCEgBIRAISAg0pC0lUQaQFCkIakYKb4QEAJCoBAQEGlI2koiDSAo0pBUjBRfCAgBIVAICIg0JG0lkQYQFGlIKkaKLwSEgBAoBAREGpK2kkgDCIo0JBUjxRcCQkAIFAICIg1JW0mkAQRFGpKKkeILASEgBAoBgXRIA5cUcOTwo48+et11191xxx2zZs0KwyrJ4U6U4bPPPuM8x2uvvfb5559ftGhRWBmSk4aKior7779/2rRpYQUgVvLDnebOnXvnnXeWl5eHlUGkIQw3xRICQkAIFBYC6ZAGTl/eY489Nttss9NOO22vvfbaYIMNRowYEQBcEtIwffp0CrDbbrsdffTRrVq1uvTSSwMKQJSEpKGqqooUll9++WHDhoUVgFgJSQMnOR522GFbb701l06FlUGk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
|
|||
|
},
|
|||
|
"image-6.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-7.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-8.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-9.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image.png": {
|
|||
|
"image/png": "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
|
|||
|
}
|
|||
|
},
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"adapted from https://towardsdatascience.com/a-beginners-guide-to-convolutional-neural-networks-cnns-14649dbddce8\n",
|
|||
|
"## What is a Convolution?\n",
|
|||
|
"A convolution is how the input is modified by a filter. In convolutional networks, multiple filters are taken to slice through the image and map them one by one and learn different portions of an input image. Imagine a small filter sliding left to right across the image from top to bottom and that moving filter is looking for, say, a dark edge. Each time a match is found, it is mapped out onto an output image.\n",
|
|||
|
"\n",
|
|||
|
"![image.png](attachment:image.png)\n",
|
|||
|
"> https://www.cs.columbia.edu/education/courses/course/COMSW4995-7/26050/\n",
|
|||
|
"\n",
|
|||
|
"For example, there is a picture of Eileen Collins and the matrix above the red arrow is used as a convolution to detect dark edges. As a result, we see an image where only dark edges are emphasized.\n",
|
|||
|
"\n",
|
|||
|
"Note that an image is 2 dimensional with width and height. If the image is colored, it is considered to have one more dimension for RGB color. For that reason, 2D convolutions are usually used for black and white images, while 3D convolutions are used for colored images.\n",
|
|||
|
"\n",
|
|||
|
"## Convolution in 2D\n",
|
|||
|
"Let’s start with a (4 x 4) input image with no padding and we use a (3 x 3) convolution filter to get an output image.\n",
|
|||
|
"\n",
|
|||
|
"![image-2.png](attachment:image-2.png)!\n",
|
|||
|
"\n",
|
|||
|
"The first step is to multiply the yellow region in the input image with a filter. Each element is multiplied with an element in the corresponding location. Then you sum all the results, which is one output value.\n",
|
|||
|
"\n",
|
|||
|
"![image-3.png](attachment:image-3.png)\n",
|
|||
|
"\n",
|
|||
|
"Mathematically, it’s (2 * 1) + (0 * 0) + (1 * 1) + (0 * 0) + (1 * 0) + (0 * 0) + (0 * 0) + (0 * 1) + (1 * 0) = 3\n",
|
|||
|
"\n",
|
|||
|
"Then, you repeat the same step by moving the filter by one column. And you get the second output.\n",
|
|||
|
"\n",
|
|||
|
"![image-4.png](attachment:image-4.png)\n",
|
|||
|
"\n",
|
|||
|
"Notice that you moved the filter by only one column. The step size as the filter slides across the image is called a stride. Here, the stride is 1. The same operation is repeated to get the third output. A stride size greater than 1 will always downsize the image. If the size is 1, the size of the image will stay the same.\n",
|
|||
|
"\n",
|
|||
|
"![image-5.png](attachment:image-5.png)\n",
|
|||
|
"\n",
|
|||
|
"![image-6.png](attachment:image-6.png)\n",
|
|||
|
"\n",
|
|||
|
"We see that the size of the output image is smaller than that of the input image. In fact, this is true in most cases.\n",
|
|||
|
"\n",
|
|||
|
"## Convolution in 3D\n",
|
|||
|
"\n",
|
|||
|
"Convolution in 3D is just like 2D, except you are doing the 2d work 3 times, because there are 3 color channels.\n",
|
|||
|
"\n",
|
|||
|
"![image-7.png](attachment:image-7.png)\n",
|
|||
|
"> https://twitter.com/martin_gorner\n",
|
|||
|
"\n",
|
|||
|
"Normally, the width of the output gets smaller, just like the size of the output in 2D case.\n",
|
|||
|
"\n",
|
|||
|
"![image-8.png](attachment:image-8.png)\n",
|
|||
|
"> https://twitter.com/martin_gorner\n",
|
|||
|
"\n",
|
|||
|
"If you want to keep the output image at the same width and height without decreasing the filter size, you can add padding to the original image with zero’s and make a convolution slice through the image.\n",
|
|||
|
"\n",
|
|||
|
"![image-9.png](attachment:image-9.png)\n",
|
|||
|
"> https://twitter.com/martin_gorner\n",
|
|||
|
"\n",
|
|||
|
"We can apply more padding!\n",
|
|||
|
"\n",
|
|||
|
"![image-10.png](attachment:image-10.png)\n",
|
|||
|
"> https://twitter.com/martin_gorner\n",
|
|||
|
"\n",
|
|||
|
"Once you’re done, this is what the result would look like:\n",
|
|||
|
"\n",
|
|||
|
"![image-11.png](attachment:image-11.png)\n",
|
|||
|
"> https://twitter.com/martin_gorner\n",
|
|||
|
"\n",
|
|||
|
"As you add more filters, it increases the depth of the output image. If you have the depth of 4 for the output image, 4 filters were used. Each layer corresponds to one filter and learns one set of weights. It does not change between steps as it slides across the image.\n",
|
|||
|
"\n",
|
|||
|
"![image-12.png](attachment:image-12.png)\n",
|
|||
|
"> https://twitter.com/martin_gorner\n",
|
|||
|
"\n",
|
|||
|
"An output channel of the convolutions is called a **feature map**. It encodes the presence or absence, and degree of presence of the feature it detects. Notice that unlike the 2D filters from before, each filter connects to every input channel. (question? what does it mean by each filter connects to every input channel unlike 2D?) This means they can compute sophisticates features. Initially, by looking at R, G, B channels, but after, by looking at combinations of learned features such as various edges, shapes, textures and semantic features."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"attachments": {
|
|||
|
"image-2.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-3.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-4.png": {
|
|||
|
"image/png": "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
|
|||
|
},
|
|||
|
"image-6.png": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAvcAAADRCAIAAADHdwruAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4AezdCfx91bz4/zu75jFCboRkqiRDkiIylswNVBSRSiJl7DZIUVyzJCkq85Ars4tbN0UpSZnikmumPwoVv/+z79t3tdt7n/PZZ+99ztnn81nr8X18vvusvfbaa7/32mu91vv9Xmv93Z/+fEX+VyuBb37zm/9vbPjLX/7yx7HhT3/609gMrj45NoOrT/71r38dn8mf//zn8ZlcddVV43O48sorx+fgFuNzUMjxOSyKKMhq/IN0F4X8xwvTWeIaX4zutcJLH1+MRRGFz3D8g1xxxRXjhSnB+BwG8qUvWSuWFMWSX/qiiGLSRu+zn/1sbSOfI1eCBP5uJTxku2fMlJP6hu5de6acJEwH4/tUZ5fszzLlJHku2bVnykn1LVNOu74gX7XQEvgb5aTPIB9kCWQJZAlkCWQJZAlkCSwPCWTKWR7vMT9FlkCWQJZAlkCWQJZAWQKZcsoSyb+zBLIEsgSyBLIEsgSWhwQy5SyP95ifIksgSyBLIEsgSyBLoCyBTDllieTfWQJZAlkCWQJZAlkCy0MCmXKWx3vMT5ElkCWQJZAlkCWQJVCWQKacskTy7yyB8RIwi9vs5SUnMI/PZJhnPZplcpacpj7MwudSZQlkCWQJVCWQKacqkxyTJVAvAd2/lWx++tOfnnnmmV/+8pd/85vfxEpCyOAPf/jDb3/729/97nej1lUTf+mllzZZLKf+3h1iY32/yACceYT/b1VIixh5Lg8i7rvf/e7nP/95fxW1ukhSrLaS8rn88svHP7KULkl38dPd46rf//73TkVW+W+WQJZAlsD0JJApZ3qyzTkvNwno1N/znvc8+clPfuITn/j4xz/+UY961Ic+9CEM8e1vf/tlL3vZzjvvvM8++3zqU5+q7b+/8pWvbLvtth/84AdnKRRlwxOY7N3vfnfc9xe/+MUJJ5zwrGc9a/fdd3/Xu96FvZDHL3/5y49+9KNitt5665122skDPvWpTz3llFMuu+yyuCry+Z//+Z+TTjpJDCr68Y9//IY3vOFpT3vaC1/4wi984QsSlJ4rLjn99NNPPvnkOOWq//3f/33961/vqv322++//uu/lqU+rCSH/DNLIEtgvhLIlDNf+ee7L4wEdMlnnHHGdttt94lPfAI6/OxnPzv22GN12D/84Q+POeYYfKMLf//737/99tvThQAdep2EOw4+/OEPP+QhD6H+KT1wqDd+9atfyZCWCEg5/slPfvLrX/8aKKAQPyGFU9RFYmTrlJ//93//JyZyoy9xuWR4pahMuuSSS974xjcq0kEHHSSly0EYGsM9//mf//n85z//W9/61s9//vM3velNz3nOc7761a/KweMoPwBy1fHHHx+P8KMf/QidiDn00EPlQx/zvve9DxWdc845nv0Zz3iGqxRGPJTxVyFJ4z/+4z+I61WvelUUUjxIevazn/31r3/9bW972zOf+UzFi1P5b5ZAlkCWwJQkkClnSoLN2S43CWCLt771rXvvvXdgROgzPvKRj5x//vkUPJ/85Cd18/QTu+222ze+8Y0f/OAHGMjfkAIIwATrrbce1inJhZ2IHkWX/5SnPIVyaP/9999rr70e9KAHPe95z3O5rOhdNt10U1oWGX7ve9973etepwyPe9zjHvrQhx533HHULejhc5/73BOe8IR73/veEp999tnpFngF3zz96U8/8MADRaIKCpjXvOY1IOniiy/GKHAKtCmzpzjvvPMOP/xwmb/yla+k73nLW94CXy666CIX+iufXXbZ5eCDD/bz+9//vpRIBTa53Ute8hKsQ2dDs0VX9IEPfOCd73znhRde+O///u8ukZtLBIVBPG9/+9tdhahchbTiVP6bJZAlkCUwJQlkypmSYHO2y00CuvYDDjjg6KOPTg8GdKg69Nm4R++ujwcoKIHChjKDmoTKJxJT2OjRH/awhyXtTsqEqua1r33tk570JOSBDzbffHPQc9ZZZ1EOQQfaFDQgzcc//nF6IxoUFiUKEpoSiiW3cwleQRLwBYu8973vVYyUufuGOico54ILLnAJlQzkEkCSmFe/+tV45dxzz2V7osKBO9Lsu+++NC4vetGLwkQlH2oe6pygHDxEFCeeeKIbOUZmjtmtkBk2cpU94FxCA4TJEuXI0FWRIcBylcdJRc0HWQJZAlkC05BAppxpSDXnuQwlgHIAh148PRtkQTNUKUCHpgedPPe5z6VTgQ7SYKCU0gFT0cMf/vBiTBwjGOSk+5ee786LX/xifEARAgIob3gBgwMaIwm49dCXYAjxEuMqhXnFK14Bj5AKZQ81Cc1KQqvIP5IF5YAP5qpdd90VJPEy3mOPPahbgMunP/1pFIV+kqUJYOEe3jMJRFjEGL8S5QTZuEVQDnbxIEceeeR973tfmq14dgUDRkXKcVW46QTlYLKqQHJMlkCWQJZAjxLIlNOjMHNWy1kCNDQwggokWax01YxB73jHOxygHA//ne98R0cuRjcPfaKzD6EkyolTSVJBOfhJDHeZl770pQ6Ccuh4aFke/OAHH3HEETBlxx13hAjIQ/7S8Kd585vfLB4VQRmYQgdDXZSoIm5RpBzqJTeisHGKbobViZkMuDC3ASn+1Oxf/IURFdPbxz72MfYvl0c+Rcqh70FjrFpOhcoHrwAy/j0PeMAD6J88u1MlysFDrsJATqExuMaNKTLPf7MEsgSyBKYkgUw5UxJsznYZSoCu5ZGPfKS+mTMNjxad+jbbbAMLoAPgoETRkeu8df+QCPro+JMUEuWgE5ek+DGUgwkAB2cg8EHdssMOO8iZxYqziwJ87WtfY9UCXpx+aHc+85nPcAxSNsqklLmDIuUoD8h4+ctfTmfDKKao+ImvDNwxMd7EMQzHR2fLLbd08IIXvADrpKyKlMNFGmm53CN7Lp7LzGcKwJ2ZvoePEbcbMFeiHDKhtfJQruIMRO/lEVL++SBLIEsgS2AaEsiUMw2p5jyXpwSwBdPMAx/4wEc84hGPecxjYIE+HoJQe/AFZgkyAZt3C4bgNUzpQueRBIEY+NP46UCypOahBMIuhx12mFPAKGYkcdQ1mwk58bbZYost5Bmzu7nLoJDNNtvssY99LFceJickgZOQEPxCGxiI52+6qQNn+d8waUWkgqEQl2Mms98V9Utf+pKr6HK49Xzxi1+kjlJsTjYsdLREKSu0hKWolyKGCocHksIIFE5sYXRIXII8DvCCMsSC58CQmVYpE1iTrmIUS0JICfJBlkCWQJZAvxLIlNOvPAeXm46E+0h1hbfBFXQRChTCNIWbUwvrEoAI0wwJi6QOAQomdUuGDxwUKUHKWBIwHcQTF1+Q9PGm4oBpDFfRD4EDqhQTrKhqaFCgD1jBGXEvOfANAkb//d//jVHCoJbE6ayYVAHkjFeoXrjdiHRWJp/97Ge5NvMdZszizow/oJhTKRMHkU/KXD4ghuFJqURGgckhkqWCOSWkfEpXpfh8kCWQJZAlMCUJZMqZkmDnn63+xnjaPBf2EfYOfhhpeRWF09fqQUeVUs+k2x6ToHSh3IqZl84us58Eqzv3yA7SozkWoxdPMb0cyFaecS8HMT3bhCbHQvEWfjYsQLWoHgdFnXrqqSaZC1jHJPZi5rXH1Xxqk5Ui211VyiT/zBLIEsgSaCiBTDkNBbV4yWCHcTnDBEOJ6TP8UlkuVnWOf2GnMA+IW4l+sfbB6CQYZdKCubVpipGG9Xm+TFEgUzqmPWJUKhrC+roR+MA6dDACHU8JobrfRU2T86j61j3/OeYQcutdYnN8onzrLIHlJIFMOcvpbV7zLDotpGKVOf4WNDrcRR2Yycz/VOA5gX54dWigXaPvEZksC37qSu95z3vysdB2O2XNFQEbxQ0k0N3SEkWkTHibWkFOSkaZSCYNzNJfinF3VhLxcSNXcd1NuclTadlc5MnLxKlY/5fyyUq+LpF/3C6uEuNaZaNtkibycSPaCBOk/XV8jSCW19EiKkK8Pn7HTGx8mLjvqCSeIl6LUzyRx+ztpVYAaBV49q8R
|
|||
|
},
|
|||
|
"image.png": {
|
|||
|
"image/png": "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
|
|||
|
}
|
|||
|
},
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Translation-Invariant\n",
|
|||
|
"Another interesting fact is CNNs are somewhat resistant to translation such as an image shifting a bit, which would have a similar activation map as the one before shifting. It’s because the convolution is a feature detector and if it’s detecting a dark edge and the image is moved to the bottom, then dark edges will not be detected until the convolution is moved down.\n",
|
|||
|
"\n",
|
|||
|
"## Special Case — 1D Convolution\n",
|
|||
|
"1D convolution is covered here, because it’s usually under-explained, but it has noteworthy benefits.\n",
|
|||
|
"\n",
|
|||
|
"![image.png](attachment:image.png)\n",
|
|||
|
"> https://github.com/GoogleCloudPlatform/tensorflow-without-a-phd\n",
|
|||
|
"\n",
|
|||
|
"They are used to reduce the depth (number of channels). Width and height are unchanged in this case. If you want to reduce the horizontal dimensions, you would use pooling, increase the stride of the convolution, or don’t add paddings. The 1D convolutions computes a weighted sum of input channels or features, which allow selecting certain combinations of features that are useful downstream. 1D convolution compresses because there is only one It has a same effect of\n",
|
|||
|
"\n",
|
|||
|
"## Pooling\n",
|
|||
|
"\n",
|
|||
|
"Note that pooling is a separate step from convolution. Pooling is used to reduce the image size of width and height. Note that the depth is determined by the number of channels. As the name suggests, all it does is it picks the maximum value in a certain size of the window. Although it’s usually applied spatially to reduce the x, y dimensions of an image.\n",
|
|||
|
"\n",
|
|||
|
"## Max-Pooling\n",
|
|||
|
"Max pooling is used to reduce the image size by mapping the size of a given window into a single result by taking the maximum value of the elements in the window.\n",
|
|||
|
"\n",
|
|||
|
"![image-2.png](attachment:image-2.png)\n",
|
|||
|
"> http://cs231n.github.io/convolutional-networks/\n",
|
|||
|
"\n",
|
|||
|
"## Average-Pooling\n",
|
|||
|
"It’s same as max-pooling except that it averages the windows instead of picking the maximum value.\n",
|
|||
|
"\n",
|
|||
|
"![image-3.png](attachment:image-3.png)\n",
|
|||
|
"> http://cs231n.github.io/convolutional-networks/\n",
|
|||
|
"\n",
|
|||
|
"## Common Set-up\n",
|
|||
|
"In order to implement CNNs, most successful architecture uses one or more stacks of convolution + pool layers with relu activation, followed by a flatten layer then one or two dense layers.\n",
|
|||
|
"\n",
|
|||
|
"![image-4.png](attachment:image-4.png)\n",
|
|||
|
"\n",
|
|||
|
"![image-6.png](attachment:image-6.png)\n",
|
|||
|
"\n",
|
|||
|
"> LeNet is a convolutional neural network structure proposed by Yann LeCun et al. in **1989**. In general, LeNet refers to lenet-5 and is a simple convolutional neural network. Convolutional neural networks are a kind of feed-forward neural network whose artificial neurons can respond to a part of the surrounding cells in the coverage range and perform well in large-scale image processing. [Wikipedia](https://en.wikipedia.org/wiki/LeNet)\n",
|
|||
|
"\n",
|
|||
|
"It is a simple feed-forward network. It takes the input, feeds it\n",
|
|||
|
"through several layers one after the other, and then finally gives the\n",
|
|||
|
"output.\n",
|
|||
|
"\n",
|
|||
|
"As we move through the network, feature maps become smaller spatially, and increase in depth. Features become increasingly abstract and lose spatial information. For example, the network understands that the image contained an eye, but it is not sure where it was.\n",
|
|||
|
"\n",
|
|||
|
"Here’s an example of a typical CNN network in PyTorch.\n",
|
|||
|
"\n",
|
|||
|
"A typical training procedure for a neural network is as follows:\n",
|
|||
|
"\n",
|
|||
|
"- Define the neural network that has some learnable parameters (or\n",
|
|||
|
" weights)\n",
|
|||
|
"- Iterate over a dataset of inputs\n",
|
|||
|
"- Process input through the network\n",
|
|||
|
"- Compute the loss (how far is the output from being correct)\n",
|
|||
|
"- Propagate gradients back into the network’s parameters\n",
|
|||
|
"- Update the weights of the network, typically using a simple update rule:\n",
|
|||
|
" ``weight = weight - learning_rate * gradient``\n",
|
|||
|
"\n",
|
|||
|
"\n",
|
|||
|
"## Define the network\n",
|
|||
|
"\n",
|
|||
|
"Let’s define this network:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 1,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"import torch\n",
|
|||
|
"import torch.nn as nn\n",
|
|||
|
"import torch.nn.functional as F\n",
|
|||
|
"\n",
|
|||
|
"\n",
|
|||
|
"class Net(nn.Module):\n",
|
|||
|
"\n",
|
|||
|
" def __init__(self):\n",
|
|||
|
" super(Net, self).__init__()\n",
|
|||
|
" # 1 input image channel, 6 output channels, 3x3 square convolution\n",
|
|||
|
" # kernel\n",
|
|||
|
" self.conv1 = nn.Conv2d(1, 6, 3)\n",
|
|||
|
" self.conv2 = nn.Conv2d(6, 16, 3)\n",
|
|||
|
" # an affine operation: y = Wx + b\n",
|
|||
|
" self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension \n",
|
|||
|
" self.fc2 = nn.Linear(120, 84)\n",
|
|||
|
" self.fc3 = nn.Linear(84, 10)\n",
|
|||
|
"\n",
|
|||
|
" def forward(self, x):\n",
|
|||
|
" # Max pooling over a (2, 2) window\n",
|
|||
|
" x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))\n",
|
|||
|
" # If the size is a square you can only specify a single number\n",
|
|||
|
" x = F.max_pool2d(F.relu(self.conv2(x)), 2)\n",
|
|||
|
" x = x.view(-1, self.num_flat_features(x))\n",
|
|||
|
" x = F.relu(self.fc1(x))\n",
|
|||
|
" x = F.relu(self.fc2(x))\n",
|
|||
|
" x = self.fc3(x)\n",
|
|||
|
" return x\n",
|
|||
|
"\n",
|
|||
|
" def num_flat_features(self, x):\n",
|
|||
|
" size = x.size()[1:] # all dimensions except the batch dimension\n",
|
|||
|
" num_features = 1\n",
|
|||
|
" for s in size:\n",
|
|||
|
" num_features *= s\n",
|
|||
|
" return num_features"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"Here’s the result when you do model summary. Let’s break those layers down and see how we get those parameter numbers."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 2,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Net(\n",
|
|||
|
" (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))\n",
|
|||
|
" (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))\n",
|
|||
|
" (fc1): Linear(in_features=576, out_features=120, bias=True)\n",
|
|||
|
" (fc2): Linear(in_features=120, out_features=84, bias=True)\n",
|
|||
|
" (fc3): Linear(in_features=84, out_features=10, bias=True)\n",
|
|||
|
")\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"net = Net()\n",
|
|||
|
"print(net)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"You just have to define the ``forward`` function, and the ``backward`` function (where gradients are computed) is automatically defined for you using ``autograd``. You can use any of the Tensor operations in the ``forward`` function.\n",
|
|||
|
"\n",
|
|||
|
"The learnable parameters of a model are returned by ``net.parameters()``"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 10,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"10\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"params = list(net.parameters())\n",
|
|||
|
"print(len(params))"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 1\n",
|
|||
|
"``(conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))``\n",
|
|||
|
"\n",
|
|||
|
"Filter size (3 x 3) * input depth (1) * # of filters (6). Here, the input depth is 1, because it’s for MNIST black and white data. \n",
|
|||
|
"\n",
|
|||
|
"The learnable parameters of a model:\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 19,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"torch.Size([6, 1, 3, 3])\n",
|
|||
|
"torch.Size([6])\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(params[0].size()) # conv1's .weight input\n",
|
|||
|
"print(params[1].size()) # conv1's .weight output"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 2\n",
|
|||
|
"``F.max_pool2d(F.relu(self.conv1(x)), (2, 2))``\n",
|
|||
|
"\n",
|
|||
|
"Pooling layers don’t have learnable parameters."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 3\n",
|
|||
|
"``(conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))``\n",
|
|||
|
"\n",
|
|||
|
"Filter size (3 x 3) * input depth (6) * # of filters (16). Here, the input depth is 6, because it’s based on previous layer output. \n",
|
|||
|
"\n",
|
|||
|
"The learnable parameters of a model:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 20,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"torch.Size([16, 6, 3, 3])\n",
|
|||
|
"torch.Size([16])\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(params[2].size()) # conv2's .weight input\n",
|
|||
|
"print(params[3].size()) # conv2's .weight output"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 4\n",
|
|||
|
"``F.max_pool2d(F.relu(self.conv1(x)), (2, 2))``\n",
|
|||
|
"\n",
|
|||
|
"Pooling layers don’t have learnable parameters."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"attachments": {
|
|||
|
"image.png": {
|
|||
|
"image/png": "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
|
|||
|
}
|
|||
|
},
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 5\n",
|
|||
|
"``x = x.view(-1, self.num_flat_features(x))``\n",
|
|||
|
"\n",
|
|||
|
"It unstacks the volume above it into an array.\n",
|
|||
|
"\n",
|
|||
|
"![image.png](attachment:image.png)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 6\n",
|
|||
|
"``(fc1): Linear(in_features=576, out_features=120, bias=True)``\n",
|
|||
|
"\n",
|
|||
|
"Input Dimension (576) * Output Dimension (120) + One bias per output neuron (120)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 21,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"torch.Size([120, 576])\n",
|
|||
|
"torch.Size([120])\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(params[4].size()) # fc1's .weight input\n",
|
|||
|
"print(params[5].size()) # fc1's .weight output"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 7\n",
|
|||
|
"``(fc2): Linear(in_features=120, out_features=84, bias=True)``\n",
|
|||
|
"\n",
|
|||
|
"Input Dimension (120) * Output Dimension (84) + One bias per output neuron (84)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 22,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"torch.Size([84, 120])\n",
|
|||
|
"torch.Size([84])\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(params[6].size()) # fc1's .weight input\n",
|
|||
|
"print(params[7].size()) # fc1's .weight output"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Layer 8\n",
|
|||
|
"``(fc3): Linear(in_features=84, out_features=10, bias=True)``\n",
|
|||
|
"\n",
|
|||
|
"Input Dimension (84) * Output Dimension (10) + One bias per output neuron (84)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 23,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"torch.Size([10, 84])\n",
|
|||
|
"torch.Size([10])\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(params[8].size()) # fc1's .weight input\n",
|
|||
|
"print(params[9].size()) # fc1's .weight output"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Working example\n",
|
|||
|
"Let's try a random 32x32 input.\n",
|
|||
|
"Note: expected input size of this net (LeNet) is 32x32. To use this net on\n",
|
|||
|
"the MNIST dataset, please resize the images from the dataset to 32x32."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 27,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"tensor([[-0.0187, -0.0279, -0.0972, -0.0216, 0.0167, 0.2310, -0.1081, -0.0525,\n",
|
|||
|
" 0.0611, 0.0367]], grad_fn=<AddmmBackward>)\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"input = torch.randn(1, 1, 32, 32)\n",
|
|||
|
"out = net(input)\n",
|
|||
|
"print(out)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"Zero the gradient buffers of all parameters and backprops with random\n",
|
|||
|
"gradients:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 28,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"net.zero_grad()\n",
|
|||
|
"out.backward(torch.randn(1, 10))"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"<div class=\"alert alert-info\"><h4>Note</h4><p>``torch.nn`` only supports mini-batches. The entire ``torch.nn``\n",
|
|||
|
" package only supports inputs that are a mini-batch of samples, and not\n",
|
|||
|
" a single sample.\n",
|
|||
|
"\n",
|
|||
|
" For example, ``nn.Conv2d`` will take in a 4D Tensor of\n",
|
|||
|
" ``nSamples x nChannels x Height x Width``.\n",
|
|||
|
"\n",
|
|||
|
" If you have a single sample, just use ``input.unsqueeze(0)`` to add\n",
|
|||
|
" a fake batch dimension.</p></div>\n",
|
|||
|
"\n",
|
|||
|
"Before proceeding further, let's recap all the classes you’ve seen so far.\n",
|
|||
|
"\n",
|
|||
|
"**Recap:**\n",
|
|||
|
" - ``torch.Tensor`` - A *multi-dimensional array* with support for autograd\n",
|
|||
|
" operations like ``backward()``. Also *holds the gradient* w.r.t. the\n",
|
|||
|
" tensor.\n",
|
|||
|
" - ``nn.Module`` - Neural network module. *Convenient way of\n",
|
|||
|
" encapsulating parameters*, with helpers for moving them to GPU,\n",
|
|||
|
" exporting, loading, etc.\n",
|
|||
|
" - ``nn.Parameter`` - A kind of Tensor, that is *automatically\n",
|
|||
|
" registered as a parameter when assigned as an attribute to a*\n",
|
|||
|
" ``Module``.\n",
|
|||
|
" - ``autograd.Function`` - Implements *forward and backward definitions\n",
|
|||
|
" of an autograd operation*. Every ``Tensor`` operation creates at\n",
|
|||
|
" least a single ``Function`` node that connects to functions that\n",
|
|||
|
" created a ``Tensor`` and *encodes its history*.\n",
|
|||
|
"\n",
|
|||
|
"**At this point, we covered:**\n",
|
|||
|
" - Defining a neural network\n",
|
|||
|
" - Processing inputs and calling backward\n",
|
|||
|
"\n",
|
|||
|
"**Still Left:**\n",
|
|||
|
" - Computing the loss\n",
|
|||
|
" - Updating the weights of the network\n",
|
|||
|
"\n",
|
|||
|
"Loss Function\n",
|
|||
|
"-------------\n",
|
|||
|
"A loss function takes the (output, target) pair of inputs, and computes a\n",
|
|||
|
"value that estimates how far away the output is from the target.\n",
|
|||
|
"\n",
|
|||
|
"There are several different\n",
|
|||
|
"`loss functions <https://pytorch.org/docs/nn.html#loss-functions>`_ under the\n",
|
|||
|
"nn package .\n",
|
|||
|
"A simple loss is: ``nn.MSELoss`` which computes the mean-squared error\n",
|
|||
|
"between the input and the target.\n",
|
|||
|
"\n",
|
|||
|
"For example:\n",
|
|||
|
"\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 30,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"tensor(0.8534, grad_fn=<MseLossBackward>)\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"output = net(input)\n",
|
|||
|
"target = torch.randn(10) # a dummy target, for example\n",
|
|||
|
"target = target.view(1, -1) # make it the same shape as output\n",
|
|||
|
"criterion = nn.MSELoss()\n",
|
|||
|
"\n",
|
|||
|
"loss = criterion(output, target)\n",
|
|||
|
"print(loss)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"Now, if you follow ``loss`` in the backward direction, using its\n",
|
|||
|
"``.grad_fn`` attribute, you will see a graph of computations that looks\n",
|
|||
|
"like this:\n",
|
|||
|
"\n",
|
|||
|
"::\n",
|
|||
|
"\n",
|
|||
|
" input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d\n",
|
|||
|
" -> view -> linear -> relu -> linear -> relu -> linear\n",
|
|||
|
" -> MSELoss\n",
|
|||
|
" -> loss\n",
|
|||
|
"\n",
|
|||
|
"So, when we call ``loss.backward()``, the whole graph is differentiated\n",
|
|||
|
"w.r.t. the loss, and all Tensors in the graph that has ``requires_grad=True``\n",
|
|||
|
"will have their ``.grad`` Tensor accumulated with the gradient.\n",
|
|||
|
"\n",
|
|||
|
"For illustration, let us follow a few steps backward:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 31,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"<MseLossBackward object at 0x7f78386ee438>\n",
|
|||
|
"<AddmmBackward object at 0x7f78386ee390>\n",
|
|||
|
"<AccumulateGrad object at 0x7f78386ee438>\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(loss.grad_fn) # MSELoss\n",
|
|||
|
"print(loss.grad_fn.next_functions[0][0]) # Linear\n",
|
|||
|
"print(loss.grad_fn.next_functions[0][0].next_functions[0][0]) # ReLU"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"Backprop\n",
|
|||
|
"--------\n",
|
|||
|
"To backpropagate the error all we have to do is to ``loss.backward()``.\n",
|
|||
|
"You need to clear the existing gradients though, else gradients will be\n",
|
|||
|
"accumulated to existing gradients.\n",
|
|||
|
"\n",
|
|||
|
"\n",
|
|||
|
"Now we shall call ``loss.backward()``, and have a look at conv1's bias\n",
|
|||
|
"gradients before and after the backward.\n",
|
|||
|
"\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 32,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"conv1.bias.grad before backward\n",
|
|||
|
"tensor([0., 0., 0., 0., 0., 0.])\n",
|
|||
|
"conv1.bias.grad after backward\n",
|
|||
|
"tensor([ 0.0008, 0.0015, 0.0122, 0.0016, 0.0040, -0.0035])\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"net.zero_grad() # zeroes the gradient buffers of all parameters\n",
|
|||
|
"\n",
|
|||
|
"print('conv1.bias.grad before backward')\n",
|
|||
|
"print(net.conv1.bias.grad)\n",
|
|||
|
"\n",
|
|||
|
"loss.backward()\n",
|
|||
|
"\n",
|
|||
|
"print('conv1.bias.grad after backward')\n",
|
|||
|
"print(net.conv1.bias.grad)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"Now, we have seen how to use loss functions.\n",
|
|||
|
"\n",
|
|||
|
"**Read Later:**\n",
|
|||
|
"\n",
|
|||
|
" The neural network package contains various modules and loss functions\n",
|
|||
|
" that form the building blocks of deep neural networks. A full list with\n",
|
|||
|
" documentation is `here <https://pytorch.org/docs/nn>`_.\n",
|
|||
|
"\n",
|
|||
|
"**The only thing left to learn is:**\n",
|
|||
|
"\n",
|
|||
|
" - Updating the weights of the network\n",
|
|||
|
"\n",
|
|||
|
"Update the weights\n",
|
|||
|
"------------------\n",
|
|||
|
"The simplest update rule used in practice is the Stochastic Gradient\n",
|
|||
|
"Descent (SGD):\n",
|
|||
|
"\n",
|
|||
|
" ``weight = weight - learning_rate * gradient``\n",
|
|||
|
"\n",
|
|||
|
"We can implement this using simple Python code:\n",
|
|||
|
"\n",
|
|||
|
".. code:: python\n",
|
|||
|
"\n",
|
|||
|
" learning_rate = 0.01\n",
|
|||
|
" for f in net.parameters():\n",
|
|||
|
" f.data.sub_(f.grad.data * learning_rate)\n",
|
|||
|
"\n",
|
|||
|
"However, as you use neural networks, you want to use various different\n",
|
|||
|
"update rules such as SGD, Nesterov-SGD, Adam, RMSProp, etc.\n",
|
|||
|
"To enable this, we built a small package: ``torch.optim`` that\n",
|
|||
|
"implements all these methods. Using it is very simple:\n",
|
|||
|
"\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 34,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"import torch.optim as optim\n",
|
|||
|
"\n",
|
|||
|
"# create your optimizer\n",
|
|||
|
"optimizer = optim.SGD(net.parameters(), lr=0.01)\n",
|
|||
|
"\n",
|
|||
|
"# in your training loop:\n",
|
|||
|
"optimizer.zero_grad() # zero the gradient buffers\n",
|
|||
|
"output = net(input)\n",
|
|||
|
"loss = criterion(output, target)\n",
|
|||
|
"loss.backward()\n",
|
|||
|
"optimizer.step() # Does the update"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
".. Note::\n",
|
|||
|
"\n",
|
|||
|
" Observe how gradient buffers had to be manually set to zero using\n",
|
|||
|
" ``optimizer.zero_grad()``. This is because gradients are accumulated\n",
|
|||
|
" as explained in the `Backprop`_ section."
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"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.6.9"
|
|||
|
}
|
|||
|
},
|
|||
|
"nbformat": 4,
|
|||
|
"nbformat_minor": 4
|
|||
|
}
|