stud-ai/1-intro/3_cnn.ipynb

786 lines
1.1 MiB
Plaintext
Raw Normal View History

2020-12-02 13:10:58 +01:00
{
"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": "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
},
"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": "iVBORw0KGgoAAAANSUhEUgAAArwAAAD+CAIAAABX10FaAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4AezdB6AdVdU2YBVRIIBgBVTAAhKKKCAWUFRASgClCYr0lkLvCNJBSugd6VJD6FVa6B2UpnSkK6KfSrFA4H/WWjPnnntvghDyAd/vvWwmc+bsPnP2++53rb3nPa8N/A30wEAPDPTAQA9UD7z62msDYaAHBnqg0wNj+w4N7xn4hQz0wH9pD/T9LQx8HuiBAcYw0AMDPdC7BwZIw38pQHZo48CJHvAzcBz4G+iB/j0w8AMZ6IGBHtADBskaJwdIwwBpGOiBAdLQHysHrjQ9MKGA8erYV8e+7P9X/b7i/JU47wmvvPqqkN/2/wH2RMskzfM5oTXpn//rXKmiXyfCO/zV2OjMTvjfq0yniLenQ7qL0ygf64F55eVXxr4Sj1BdfLVg+215ErLEXr2tMioWT2PvvwHzRG8p5u26PfVYDBzfmR6on2LvX8LAp4EeiB6Y0BGgM+4XHsCAFgbG/vuf/3753y93aER3EVAhQ+CiMVq0l/8NNiJtG8ZNNVCQNkIn5jhOiqlUldpjrza6KJ86dmfYRlZ61XAcxyI3FaG7UW/2vC2rKULy9koPXagr483ZL7oTJugO9ilxvAW9qczbruvLAse+pqu7H4ns+Whs3gv3saGY3Xdk/OcNyehT52hR5ZPHPt/2/1jxPYT/+ue//v2vf7eVGSANb+qWD0T+/7UHBkjDAEEYXw9M6DMfY26GnCyO/cdL/7jvd/f95o7fOD54/4MP3P/gvffce8dtd/z6jt/85td33vmbO++6866777xbuOs3d93leOddvnL9/vse+P2jv3/s94899uhjcfJonMTH3z/eJzz+2OOvHzJV34TjTNLGjIIiwu87OT/x+GNPPDG+8PiTT0TICM15XHnyiSefeuKpp598WnjqyaeefKJ/iAhPdb59/EmFdkp5Ug5ye0zRj8s8couYTz/9VIY8l20U8dTTzzz9zDNPPfN0hCjuDQZpZdsnNG3RnMeVqHpPRU0yWtQ2Ktw06vVLETOziq7Qe00HRrY9Ia7rZN386GMPP/TwA/c/4L7f/7v777/vfs+J5+Heu+99+MGHu+9Lz3k9Eu3RQzKO8EhcfPSRRx99uA2PPhofu4Jy+4fnnn0uiUvQlwGloRe/7s+zBq78F/XAAGkYH2QOXJ8g0mC2XSNszc/MFA2+Rx1x1LZbb7vbrrvtO3K/ffbeZ4ef7bD5ZptvvtkWW2y+xZZbbClsvdXWwlZbbr3tNj/dZuttfLvl5lvusfvPDz3k0CMOP+LwQw8/7NDDDjv0cCdHHn7kUUce1SsccdSR/ymIf8zRxxx7zHHd4ZhfHPOLo37hq0peeR5x2BFKVMqRRxyp2iIcd8xxxx17/PEZTjjuhP7h+ONOOP644wXRjjvWP3HeCSeecMIvT/ylcOIJJ55w/An9g+tNOD4iSNhTxPEnnnj8iZVVXDz+BB9FPunEk076ZYYTT6rMT/7lySefdEocf3nySYIInTgVM48VufvYU3pXNTqV17QoMStWMdu0bQW6Mm+q1F4Rs1N5vadnhGOPOfboXxzdHXSyrj76qKPd4gP2P8Djsfde+/x8j5/vsdseO+2w08+2+9muu+x6wH4HxE3p3OW4ZUceftgRhx92eHfwtAiHHXL4YYc0T4s8Dzn4kEMOPlQ4+KBDMhx80IEH9QnK7Q7773fAQQcefP1113uSYQFb25snDaSV1ghXDLpDPbolr9dBmg71dlLR+l8ZX/KKOb5v3/HrHUVxItakk2e2/f8Sxem+rd3nhs4grfkUOYnz9knQb52YE7EP+2SliCw3q9FIf6aDrYPPAEAO9ED/Hpgg0kB/rifcOFvPuZnx/vvtv9GGG224wYabbLTJsKHD1llrnfXXXX/o+kOHrT/Mx+HDho/wn3+HDhdn0403Hbr+sLXWWsu3G4zYwFeui9YJYvYJ4nSH4cPk1if0yqGyqkyUoiYVhmdlpB0hDB+xQdaqU8+q6rD+f1m9yGG9oeuv17RLE4ZFthE7KzN8eO9WNM1pIwwbqplqItWwiJl/qhGVHBphqL+s5/rr+ZA9kNcjslRd/VPRKp9K2zl2R+s5z0IjkwyRvMpazz9RGcHFJkJbaCfP8Z1E/tm3TiRX7aZzuqpaX8lhgxEbamlEW3d9qaLhQ4eLv9666627jn/W9+0GwzfoBHenf7lti+rxiJuYt9IDFI+QPnV/M07TpZ0cmqa1PeDGqc/ZZ539yr/DlQFpaHx0DJi9/8bv0+BnIFk71jvxewhTxytsb5Hdy/9iggsYELoxoK5EqdJWDnkUp35ODZZ04Uefsb6TW//rb/FKb2COmkcow0+d977S1xbVDijy0QoJx1efTif0PmmpQAe32gyzyZHn2Px79ZU2pgjjijy+cjOftl2v28ORg1Jk3lWHznmn2v2v1Fed607Gutf+2qel7rJornhmiq7meVLXljpEhPa8J7dq7Hhq1RNtXHXu/rZzo9OcHKbisS+/6tipT0Qe+Bvogf498J8ere7HrPu8nud6xowMz/7hWVO3jTfaeOONNkEC1l1nXcF4bShvhvWA5w2gQmDD0OGbbbqZyNBi7bXWhg0bjtjQtwESDbdIRC9crxzGBWMFut1HybuDr6oCcq7MwUlbRBckZ6EVJ45d5fY6z68i/wCnXtEK56TdYFgP5nUuNtdHNF911zDyb+tW111p+IdaBRBG+5QYVGNoAm22MRqyftSku/l13p1/J89eDVHo0Lov0QltHaL/m2i+TcDun3nfK6rUpopqd25TS4OaK9HDLTVMwqTcak4WNAKNWGftdZorXX3rSvcfQqAfGnJTt7I6sKvTIkndoOzYqF7WMC92PR5Dh2+84cZnjj6TT4PHOGAx0TAwovffeEnDq/7acd/gLhdWOrYcNqQ/Pfunv/z5L34V7D2PPvL7Rx5+5NFHwljy+0fSiPLIow8+8GAZuphh2HUk+fNzf/77357/+1//Hse//f2v//PX5//+fJ/gutBc/Ft8+8LzL/QPL77wYv/wwvMvil85KCIyccxQJTofZ6r+F12Rm3JffL6roBdf0vz/EF78x0svvvTSC00YT84vVIR/vBi5/fOlf/7zHxle+qePkjv+6x//ai7+w8V/vpTZRmQxM5q0UVDf4GJcV+3qtD4VqBKbY7ZFhvKXc5N5lfvSP7MCTR3q2yjrhZf6ZFgfq6+e//sLdePq5v75T3/2ePzhmT+ExfHpZxrr4ONPPvvHZ936v/21vcvtLau0XXcwnoQIf41HJcJf8pjn//OX/+kTPI1NeK45+fNzf/HICfms/hXZ7Tij9TCV3r+EgU8DPRA9MKGkoWYRnq4IL4/1qI/ceyTYoCIAgLXWXDvmyjmtDFhqIGqE2d6668accqMNiBIbGd8JEgHAwScaxhDcooM97UmM+DBSSDSSsOI0IJeoUF/FsStEzPgYmUuiAo6VysX4NqG3gLPyVNY4Q8FPJ/MGjbqRKatR7KfKFUd8uck/rhccDs+aZMWiXUMrTiMkSBI9kE2oyXHlYGYsz66K5bnmZLuaYxOhySoyz3wc5dkJVSuVcR0k193J5iRvU+f6a9O23VI92ZNnFZpd1zat+jkSyryHl0TRIzYA9oH3eiO7RfIR0dVR28hKRVJfqR4QMy/2Lk5E8ZM/1bdZeqSt5sTFembioWrC8LwvGbPr4rBQvM4+8+ya5gVjSKn4TZAGPx7JQksIaSHmizxNRu6zL0bMSsfoxRr3rW9+a/rppv/oRz768Y9+fIbpZvjUJz8VYYZPzTrLrN/59ncWWXiROWefc9555l3lxz8Zuc/IMkqdctIpp51y2qmnnHraqac76YTTTz191Omj0ByVrnDO2eece865Gc4779zzzj/v/AvOv0C46MKL+ocLz79Q/LPOPEsOZ40+Sxh9xujRZ8Q5vcVX5597/sUXXfyrS3512aWXX3HZFVdeceWYK8ZcecWYMVdedfWYq68ac3V8vPxKX1126WW/uuRSMTPyZddcdc11115/w3U33HjDjTffdPMt
}
},
"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",
"Lets 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, its (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 zeros 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 youre 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. Its because the convolution is a feature detector and if its 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 its 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 dont 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 its 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",
"Its 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",
"Heres 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 networks 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",
"Lets 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": [
"Heres the result when you do model summary. Lets 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 its 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 dont 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 its 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 dont 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 youve 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
}