Update and add clean
No files matched your search
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -517,7 +517,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -536,9 +536,9 @@
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.188673</td>\n",
|
||||
" <td>0.012107</td>\n",
|
||||
" <td>0.002706</td>\n",
|
||||
" <td>0.169390</td>\n",
|
||||
" <td>0.021388</td>\n",
|
||||
" <td>0.005413</td>\n",
|
||||
" <td>00:14</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
@@ -567,10 +567,10 @@
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.056649</td>\n",
|
||||
" <td>0.009575</td>\n",
|
||||
" <td>0.004736</td>\n",
|
||||
" <td>00:18</td>\n",
|
||||
" <td>0.058748</td>\n",
|
||||
" <td>0.009240</td>\n",
|
||||
" <td>0.002706</td>\n",
|
||||
" <td>00:19</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
@@ -636,7 +636,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -645,7 +645,7 @@
|
||||
"2"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -663,17 +663,17 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAJcAAADACAIAAACGdmZhAADHJElEQVR4nEz9Sa9lS5Ymhn2rMdt7n+Z23r4+XnSZEZXVJMVkUYSKpEoJUhxIIn+ANNH/ECBA/0ITQQQ00qAA6R+wWEpUqqTqsovIrIh4/fPu+r33NHubrUaDfV9AZ+Dw547r551j28zW+rpFwP/088+u/4//h//9//p/8/f+2f/t//T8yfkPfnzd20lks5yHX/3tq7/99avX7ylyk0jKIKQwapXzfDgfH5gAuIjUaUwmM4sIZkJkWCfzgWBLX+4P7Xwmd3JKcyYatGSmu7fWklCnqUzDsJl2l5esFEjPsHAIS9Fknd0skklFS5KmhYoWHQgcQURCxEwCIDLczdycwiQjgohqKbUOKurm3l1YVNXNez8qN+YAEJnpgYhSpC9LApSREaWMkVXrVlW7e2bqMC3NujuxSKkiEhkxN84QQu+niKUqVDnD3XqaZyaSSdkprNtQ6lRrb+18OnNRUgnlBW4RHojORaswpxtzFhGEIQIZlClCTMy6tSD37h76/EX5b/+7//Kf/Od//P/8Z//Xpc03T57NzRHj+Yxvv33/29++efPuFLEDBwHIjPRwJ3BGsLAQA8xMSGSCQCpCoIAxKJGn4+xLS/PoZksT4rRgIkQSEBGlFMvwcPROTVprwiUZSQAxiBKcINWqoAADlAlhJWJ3z3QmKVpAnBmZBASQyBRhruzdIjzCzRqFIxlhiYQDEXBf2lyEtCqDkiiIlmVx91JUpAKoZUwamDQTGZEEyhxq1UwQgSSQ3j3cVaUokwzWI8nN3b2HO9wBYmQiSbhQKVpEBLVmpmdCGMwFAGh9lCiDMolJGMKkdUJ4mHt4pgdoXuYkZYBZ9L/97/7kJz/b/o//4v/x9de//uXPPwjH6zen5dTevpu//urw+o1pecrQyKBMgCLTez/PS1hnYVVhUlAQiBwwj3VVMxkcQb1HLEYehYWkhDkIACKCAACsCuuREdbJpFvvRlBmlmAQUUIyAFZiQWQmCa877/G5IgI4GRkIICM804FgZmYipgBlBMyMDI4IT2JyiYhwq0wEeDMQIjMzwYR8XNHMXMIFEbDM9WfJrA9TUeIMBFE3CzcQSEGSBIIQgTyyeUcmAAKBKSKseRH1jO6OTFZNdxAziFgyM4LcWgJEhUGclJmtNWQmgCRAkGjuAWIigPTlB+fT6VcP7+4+eHn5+vXbr3/7fj6eHu7n4xnLrObTyFtiQxqQzAzP7t6XpkJDHaqKrg8x2D2WSA8vzCoV5ktzqvV8mpfjwunMDFEmJoATBGKiiMwEkjM5giKRTFyUtQpJgkU0ApHklhEJEEDrmcJM60cDAgzKRCZlUqYQQIkwRhABBKLkRGQogQmUwchBqLJ26z08AVXVUrho682Rc+u9d6JlKlyL1FrrOGQiQYhwBIDM9ZENVgbRYn1Zzh5tLJyEJAIAAYOJJeHuYKIQDmIGAM4EEpQsQZLJbuRORElEKgnqPYQLERMRyXrUoKi6RTcLD11OX9y+fri+2P7dr+fT3V07zyrVjEW2ZbhML+dukgvnTIIqmuG9NSDHYRzrQJRMTJzW3ZqlOSLXDUERAkqHNVvOZ5iJqAzD+nVHJINS2Fo3JBdCws3n1nU3QgvVUbggRVjP56V3Z0itg4iYWVEpWsAZYREBJDOIyT0T60ojCchkrP+dSBCl6np/rgcBIdiXRgkFs4rUUkoNQlrvZt3TIkVlaR3BLFylMlMEkImIiAATgCIMASg9ovXWbclkFWLRyKBAEjlzJCK8e5ZEUXHPSFMp7s5gZk4PC1QRApQgxB4R7kzy+9vEA5FBBQ5YhIXrfHw7SHn3+jVFIkTrpaB4ZNDQPRymQ812SuuULCyUBOS6LzOi9YUAAqw7EkRUVYgouqV1b30+nclzqoMndfc+LypKiXBnIlGNiABUKSN663Y+lzYWrcRZmAB2p4giMl7uL54/fzZNm+V8fn//vvfZvIf3REoRLQzkeiICCfDjLYPMQEYiLXM9gwjElAEQZSShaCEREBzo1h3ZWvdIYq7TZhq3drZMuLu7qxZhZubM9AgkmEmYHJFIYpBQdFta5FBVJD0DQSDKJNFBJTykDMO0cbM2L8ycICZWlmAIN6EAQYSZGUA3MgsSZmWRwkQBrG8sRTNSOQpBOQbvwRApY2vmHkAHpdRSSnj4fF6oJWdkBiGQcOtEaEubzycRqaXCASYVjdZ7b+F9OZ7aeVnOM3UrpONQ5/REmrv3TkQaAUJz97aQktYyIzb73bivmTIvnk7z8Xx1efP06bOnT55eXFyMwzA+H+4Od99+++XrN9+15gkDgimJAsgfPjwTAZEW3cM5ACZi8Lq8Yd26mxNyKHUcBiqytG6ttXDzsEh//GrVPQm0vta7VoQzU4UACXe3nolgmDszbcbB/eyewhwRS+8ErlVAkgnhwooEnZupSBlGawYpSHhASHfjNsmW3pJYRUEpkkQCLsRKJInMBK/VR2YKlFq1BFlNcwd6ZngyQSRIO3PLAGUIJyUyPSKEWZREJMy9m3sIK0EjPT3cIxIApVNbupmFBzwISRAIiFgEVMBEIkrCHL6YGdITTFS4zoelXuzI2RZ89unPLnbX07Qd62SdT2bWeBwuPvn4J0z61Te/DRARzIwoQUGQxysEBAIQgAeCASJmhvdu1jJChVULE/fo2ax1m1vr3UiKiogosRAzHD+0MRQRbrZ2L0gIEgjPiG7BxEwU6dGFiGV9nNg9LCI8tYiqMnFEmEW3hXL9H8z1N4VYREU1c1GiTCQYBNVCpCAmZoCICBmPHUMkMtUbA5RBlMiMyC4MVbAEUcJbZCCkFiUiAtx8/Yjrv8XEVWstVYQZHBkAsQoTI5JFHh9gUSFKpshgIhAzY/0rd2dVBUWYMNcykOckA/WsVD/4+KNPPvo8UzLJDdaDhYhQatnvds9f+N3D3e3771v2UokZGQk4EYhIuDAzy1oSO+DrFu3u3UyIiImYuru1JZBEwsTMAmImJS7MAiIAJCSkTExrtRKZCGIQggFO97B0lFo9fJnPWphEKFNEpnFqzdxTWFUqLAAKJNYFIayHE8yDUDJShUilaCQygkFj0YgfjgNQEGkSETLT3COgnIK1BxLKTKSJkHIKgxERMHMigTAThTtlqBZChnUGD8NQa2VQAGuBHplEFIgAWDUSHklMIiWJ0vpacEQEZYRnN9MKpzRLcIZnLM4TqfKzpy8++ejz8JJODna3BFUuxLV3tOU8DvsPX3727t2r1vo4bQGPiIi1NoxkZyGPzKRIyiQCRB4fKzC6R4/GTM17EokIqQgJESM5LIJIpYhwrj8jqsq8fpVuCKdMymCEMNKSMzOSIgQqzIu1BKZxo1yXbkLCQdGDCWBKJhYBk7knsJbfQhSggDAIlGBWYVU1cyBz7foBEDI90ynD03W9liOM2Zkjw4XBROTESZzKyWC2tetBEhMTZa5tWaoIiMMMImWYQJnhTGx9OZ98Xtp5Waz35B/2OoiIcv2yI5mIRCJhkZHRzOJ03kyXp7uHD5998tkHn/az94467jkRSeDIRGtOKsvSh2H77Onz7fbicDJhNbe1ngFIWEQKaxEtyEAmKDLN+hKUJMqM8O7m025UIouITETQ2tt4khMxKVhZg0DCvB6RzASEhZtlerohQphIiSPBOdUSGRQJC4uOChVdm3hYSFJEpIchjJFExJSRzCSiomUtws2DM0Ufb1Na67CIBDiTidLN09kDGUocYc19AUgEzCHMlCsexZqiTM7ZvUc4gVaYRkTdo83NugmTWUCcShXWQIR7azafzud5tghWpuTebemNagEg6wVFYKLI9HAQaqkQAnFb/EcvXj67ecnQwmMZh0hlSlWBOHN6JkhKHTPJArvtZevH1jyADCRIRUodiNQy16+dKQmcmcvi5o4IYiVRJOZuzEogj2CQakmHsBYRZmViJIkyrXdIurtTpvXFeg/ryGBmEVbW7inM0zgdz0c3L1wc4d2JEYGIoJQqggCFA5SZiVwL2PWOsYhI0jrM59ncq3BGtOa1CBIRa3WZSaIiCgn2TGjkAjLmLMoqQmAl5vUQdiTgEaBSS+3WI0K1WoQ3cwuoJnELl2HkKnO0aLMy2PP88HB+OMTSNJmJQSAhJUlKAj3eKci1X+/NN7upuQlLcyRPP/6Df3R9/dI6T9ubjJLEx/PZomspYItoPYKJZutayrC5pMMt2K2FR9RaINrDaT1NLFiIGNZm72e2TuZMVEgTaZRmAhFh1ipM+ohAJPdwAaoWwGBeSFgY4eGW6ZEmnCxwZ4KqDM4M8WAkodZtpkdGoQTQe1tPg06FRYM0mRlZ1qZ2hT4sfO02ZG2zpFFaIszdzEWYhLRKIjw8MlmFlYSYWVUiIwhrCU4EziASZaZIzwhm9ZT1TskElxJmhGDliABRBpxSigix+7kv3c7L8f7eTrMkIR7BNlUtIHcTYmZwEiIyAohaNCPXMzB7fPb5H9bNk+ZlqBe1XrSWHsFUheG+ZFgZSpL3SLdcUZ6EMgu4I0GsyTBzFlEWN6NMooi22DIjnSNJGAmAhYYybvoKBxInkbszMxGlERXhoWSEn+d0B4l7M28RIUyiSlI4hKFah6AEnIkpU1gzws2J17K9OYGFAzF7EDGI16IrPcz7CigSUyZFeAYV4SRdzCORWuZIBZjY0xEJz5bJHMwiAhXKWKvdYHDy4xUvlERFkSmivS3pAUBEVHUtD3rv8zy7e0RkJi0EBTKt9/k0t2Vx91yrKA8hACBaYc8kFg44wsPBNJZ6bl2H0R2Xlzc/+fEvVLbpPO72oiNHYGl1GAvrqdnSTqrIRCQCbh2iIiLuc7gnHotKYlIBc6QEwnt4hPXwdCOWTG7NWYtIiYx0jwxSJWZlKrUykYkLMyG99whyIyAjYE6Z8ESARYS4JNSIg9YiTgVrR2xCIsIctrgnglksqIerMgsDSIdnWIQLine truncated
|
||||
"text/plain": [
|
||||
"<PIL.Image.Image image mode=RGB size=151x192 at 0x7FB714B9C9D0>"
|
||||
"<PIL.Image.Image image mode=RGB size=151x192 at 0x7F67678F7E90>"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -701,13 +701,13 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "22613e22f0c9475cb9696273da3c3d60",
|
||||
"model_id": "f78619047d7544908daa7fadd3c6f0c4",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
@@ -741,7 +741,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"hide_input": true
|
||||
},
|
||||
@@ -754,7 +754,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -771,14 +771,16 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Is this a cat?: True; Probability it's a cat: 0.999992\n"
|
||||
"Is this a cat?: True.\n",
|
||||
"Probability it's a cat: 0.999986\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"img = PILImage.create(uploader.data[0])\n",
|
||||
"is_cat,_,probs = learn.predict(img)\n",
|
||||
"print(f\"Is this a cat?: {is_cat}; Probability it's a cat: {probs[1].item():.6f}\")"
|
||||
"print(f\"Is this a cat?: {is_cat}.\")\n",
|
||||
"print(f\"Probability it's a cat: {probs[1].item():.6f}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -2905,20 +2907,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1629,7 +1629,8 @@
|
||||
],
|
||||
"source": [
|
||||
"#hide_output\n",
|
||||
"VBox([widgets.Label('Select your bear!'), btn_upload, btn_run, out_pl, lbl_pred])"
|
||||
"VBox([widgets.Label('Select your bear!'), \n",
|
||||
" btn_upload, btn_run, out_pl, lbl_pred])"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1946,20 +1947,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1041,34 +1041,6 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {
|
||||
"height": "600px",
|
||||
"width": "365px"
|
||||
},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -2543,20 +2543,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1445,11 +1445,14 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"biwi = DataBlock(blocks=(ImageBlock, PointBlock),\n",
|
||||
"biwi = DataBlock(\n",
|
||||
" blocks=(ImageBlock, PointBlock),\n",
|
||||
" get_items=get_image_files,\n",
|
||||
" get_y=get_ctr,\n",
|
||||
" splitter=FuncSplitter(lambda o: o.parent.name=='13'),\n",
|
||||
" batch_tfms=[*aug_transforms(size=(240,320)), Normalize.from_stats(*imagenet_stats)])"
|
||||
" batch_tfms=[*aug_transforms(size=(240,320)), \n",
|
||||
" Normalize.from_stats(*imagenet_stats)]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1925,6 +1928,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -460,7 +460,8 @@
|
||||
],
|
||||
"source": [
|
||||
"dls = get_dls(128, 128)\n",
|
||||
"learn = Learner(dls, xresnet50(), loss_func=CrossEntropyLossFlat(), metrics=accuracy)\n",
|
||||
"learn = Learner(dls, xresnet50(), loss_func=CrossEntropyLossFlat(), \n",
|
||||
" metrics=accuracy)\n",
|
||||
"learn.fit_one_cycle(4, 3e-3)"
|
||||
]
|
||||
},
|
||||
@@ -1011,6 +1012,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -2296,6 +2296,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -9740,31 +9740,6 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1708,7 +1708,8 @@
|
||||
"TEXT = \"I liked this movie because\"\n",
|
||||
"N_WORDS = 40\n",
|
||||
"N_SENTENCES = 2\n",
|
||||
"preds = [learn.predict(TEXT, N_WORDS, temperature=0.75) for _ in range(N_SENTENCES)]"
|
||||
"preds = [learn.predict(TEXT, N_WORDS, temperature=0.75) \n",
|
||||
" for _ in range(N_SENTENCES)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1891,7 +1892,8 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"learn = text_classifier_learner(dls_clas, AWD_LSTM, drop_mult=0.5, metrics=accuracy).to_fp16()"
|
||||
"learn = text_classifier_learner(dls_clas, AWD_LSTM, drop_mult=0.5, \n",
|
||||
" metrics=accuracy).to_fp16()"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -2260,20 +2262,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -602,7 +602,8 @@
|
||||
"source": [
|
||||
"cut = int(len(files)*0.8)\n",
|
||||
"splits = [list(range(cut)), list(range(cut,len(files)))]\n",
|
||||
"tls = TfmdLists(files, [Tokenizer.from_folder(path), Numericalize], splits=splits)"
|
||||
"tls = TfmdLists(files, [Tokenizer.from_folder(path), Numericalize], \n",
|
||||
" splits=splits)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1083,7 +1084,8 @@
|
||||
"class SiameseTransform(Transform):\n",
|
||||
" def __init__(self, files, label_func, splits):\n",
|
||||
" self.labels = files.map(label_func).unique()\n",
|
||||
" self.lbl2files = {l: L(f for f in files if label_func(f) == l) for l in self.labels}\n",
|
||||
" self.lbl2files = {l: L(f for f in files if label_func(f) == l) \n",
|
||||
" for l in self.labels}\n",
|
||||
" self.label_func = label_func\n",
|
||||
" self.valid = {f: self._draw(f) for f in files[splits[1]]}\n",
|
||||
" \n",
|
||||
@@ -1095,7 +1097,8 @@
|
||||
" def _draw(self, f):\n",
|
||||
" same = random.random() < 0.5\n",
|
||||
" cls = self.label_func(f)\n",
|
||||
" if not same: cls = random.choice(L(l for l in self.labels if l != cls)) \n",
|
||||
" if not same: \n",
|
||||
" cls = random.choice(L(l for l in self.labels if l != cls)) \n",
|
||||
" return random.choice(self.lbl2files[cls]),same"
|
||||
]
|
||||
},
|
||||
@@ -1246,20 +1249,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -497,7 +497,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = Learner(dls, LMModel1(len(vocab), 64), loss_func=F.cross_entropy, metrics=accuracy)\n",
|
||||
"learn = Learner(dls, LMModel1(len(vocab), 64), loss_func=F.cross_entropy, \n",
|
||||
" metrics=accuracy)\n",
|
||||
"learn.fit_one_cycle(4, 1e-3)"
|
||||
]
|
||||
},
|
||||
@@ -654,7 +655,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = Learner(dls, LMModel2(len(vocab), 64), loss_func=F.cross_entropy, metrics=accuracy)\n",
|
||||
"learn = Learner(dls, LMModel2(len(vocab), 64), loss_func=F.cross_entropy, \n",
|
||||
" metrics=accuracy)\n",
|
||||
"learn.fit_one_cycle(4, 1e-3)"
|
||||
]
|
||||
},
|
||||
@@ -1474,7 +1476,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = Learner(dls, LMModel5(len(vocab), 64, 2), loss_func=CrossEntropyLossFlat(), \n",
|
||||
"learn = Learner(dls, LMModel5(len(vocab), 64, 2), \n",
|
||||
" loss_func=CrossEntropyLossFlat(), \n",
|
||||
" metrics=accuracy, cbs=ModelReseter)\n",
|
||||
"learn.fit_one_cycle(15, 3e-3)"
|
||||
]
|
||||
@@ -1867,7 +1870,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = Learner(dls, LMModel6(len(vocab), 64, 2), loss_func=CrossEntropyLossFlat(), \n",
|
||||
"learn = Learner(dls, LMModel6(len(vocab), 64, 2), \n",
|
||||
" loss_func=CrossEntropyLossFlat(), \n",
|
||||
" metrics=accuracy, cbs=ModelReseter)\n",
|
||||
"learn.fit_one_cycle(15, 1e-2)"
|
||||
]
|
||||
@@ -2354,20 +2358,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -3757,6 +3757,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1268,6 +1268,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -233,7 +233,341 @@
|
||||
"source": [
|
||||
"This picture shows the CNN body on the left (in this case, it's a regular CNN, not a ResNet, and they're using 2x2 max pooling instead of stride 2 convolutions, since this paper was written before ResNets came along) and it shows the transposed convolutional layers on the right (they're called \"up-conv\" in this picture). Then then extra skip connections are shown as grey arrows crossing from left to right (these are sometimes called *cross connections*). You can see why it's called a \"U-net\" when you see this picture!\n",
|
||||
"\n",
|
||||
"With this architecture, the input to the transposed convolutions is not just the lower resolution grid in the preceding layer, but also the higher resolution grid in the resnet head. This allows the U-Net to use all of the information of the original image, as it is needed. One challenge with U-Nets is that the exact architecture depends on the image size. fastai has a unique `DynamicUnet` class which auto-generates an architecture of the right size based on the data provided."
|
||||
"With this architecture, the input to the transposed convolutions is not just the lower resolution grid in the preceding layer, but also the higher resolution grid in the resnet head. This allows the U-Net to use all of the information of the original image, as it is needed. One challenge with U-Nets is that the exact architecture depends on the image size. fastai has a unique `DynamicUnet` class which auto-generates an architecture of the right size based on the data provided.\n",
|
||||
"\n",
|
||||
"Let's focus now on an example where we leverage the fastai library to write a custom model:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### A Siamese network"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from fastai2.vision.all import *\n",
|
||||
"path = untar_data(URLs.PETS)\n",
|
||||
"files = get_image_files(path/\"images\")\n",
|
||||
"\n",
|
||||
"class SiameseImage(Tuple):\n",
|
||||
" def show(self, ctx=None, **kwargs): \n",
|
||||
" img1,img2,same_breed = self\n",
|
||||
" if not isinstance(img1, Tensor):\n",
|
||||
" if img2.size != img1.size: img2 = img2.resize(img1.size)\n",
|
||||
" t1,t2 = tensor(img1),tensor(img2)\n",
|
||||
" t1,t2 = t1.permute(2,0,1),t2.permute(2,0,1)\n",
|
||||
" else: t1,t2 = img1,img2\n",
|
||||
" line = t1.new_zeros(t1.shape[0], t1.shape[1], 10)\n",
|
||||
" return show_image(torch.cat([t1,line,t2], dim=2), \n",
|
||||
" title=same_breed, ctx=ctx)\n",
|
||||
" \n",
|
||||
"def label_func(fname):\n",
|
||||
" return re.match(r'^(.*)_\\d+.jpg$', fname.name).groups()[0]\n",
|
||||
"\n",
|
||||
"class SiameseTransform(Transform):\n",
|
||||
" def __init__(self, files, label_func, splits):\n",
|
||||
" self.labels = files.map(label_func).unique()\n",
|
||||
" self.lbl2files = {l: L(f for f in files if label_func(f) == l) for l in self.labels}\n",
|
||||
" self.label_func = label_func\n",
|
||||
" self.valid = {f: self._draw(f) for f in files[splits[1]]}\n",
|
||||
" \n",
|
||||
" def encodes(self, f):\n",
|
||||
" f2,t = self.valid.get(f, self._draw(f))\n",
|
||||
" img1,img2 = PILImage.create(f),PILImage.create(f2)\n",
|
||||
" return SiameseImage(img1, img2, t)\n",
|
||||
" \n",
|
||||
" def _draw(self, f):\n",
|
||||
" same = random.random() < 0.5\n",
|
||||
" cls = self.label_func(f)\n",
|
||||
" if not same: cls = random.choice(L(l for l in self.labels if l != cls)) \n",
|
||||
" return random.choice(self.lbl2files[cls]),same\n",
|
||||
" \n",
|
||||
"splits = RandomSplitter()(files)\n",
|
||||
"tfm = SiameseTransform(files, label_func, splits)\n",
|
||||
"tls = TfmdLists(files, tfm, splits=splits)\n",
|
||||
"dls = tls.dataloaders(after_item=[Resize(224), ToTensor], \n",
|
||||
" after_batch=[IntToFloatTensor, Normalize.from_stats(*imagenet_stats)])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Let's go back to the input pipeline we set up in <<chapter_midlevel_data>> for a Siamese network. If your remember, it consisted of pair of images with the label being `True` or `False`, depending on if they were in the same class or not.\n",
|
||||
"\n",
|
||||
"Using what we just saw, let's build a custom model for this task and train it. How? We will use a pretrained architecture and pass our two images throught it. Then we can concatenate the results and send them to a custom head that will return two predictions. In terms of modules, this looks like this:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class SiameseModel(Module):\n",
|
||||
" def __init__(self, encoder, head):\n",
|
||||
" self.encoder,self.head = encoder,head\n",
|
||||
" \n",
|
||||
" def forward(self, x1, x2):\n",
|
||||
" ftrs = torch.cat([self.encoder(x1), self.encoder(x2)], dim=1)\n",
|
||||
" return self.head(ftrs)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"To create our encoder, we just need to take a pretrained model and cut it, as we explained before. The function `create_body` does that for us, we just have to pass it the place we want to cut. If we remember our look in the dictionary of metadata for pretrained models, the cut value for a resnet is -2:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"encoder = create_body(resnet34, cut=-2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Then we can create our head. A look at the encoder tells us the last layer has 512 features, so this head will need to receive `512*4`. Why 4? First we have to multiply by 2 because we have two images. Then we need a second multiplication by 2 because of our concat-pool trick."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"head = create_head(512*4, 2, ps=0.5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"With our encoder and head, we can now build our model."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"model = SiameseModel(encoder, head)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Before using `Learner`, we have two more things to define. First, we must define the loss function we want to use. It's regular cross entropy, but since our targets are booleans, we need to convert them to integers or PyTorch will throw an error."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def loss_func(out, targ):\n",
|
||||
" return nn.CrossEntropyLoss()(out, targ.long())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"More importantly, to take full advantage of transfer learning, we have to define a custom *splitter*. A splitter is a function that tells the fastai library how to split the model in several parameter groups. This is what is used behind the scenes not only train the head of a model when we do transfert learning. \n",
|
||||
"\n",
|
||||
"Here we want two parameter groups: one for the encoder and one for the head. We can thus define the following splitter (`params` is jsut a function that returns all parameters of a given module):"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def siamese_splitter(model):\n",
|
||||
" return [params(model.encoder), params(model.head)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Then we can define our `Learner` by passing the data, model, loss function, spliiter and any metric we want. Since we are not using a convenience function from fastai for transfer learning (like `cnn_learner`), we have to call `learn.freeze` manually. This will make sure only the last parameter groups (in this case, the head) is trained. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"learn = Learner(dls, model, loss_func=loss_func, \n",
|
||||
" splitter=siamese_splitter, metrics=accuracy)\n",
|
||||
"learn.freeze()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Then we can directly train our model with the usual methods:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.367015</td>\n",
|
||||
" <td>0.281242</td>\n",
|
||||
" <td>0.885656</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>0.307688</td>\n",
|
||||
" <td>0.214721</td>\n",
|
||||
" <td>0.915426</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.275221</td>\n",
|
||||
" <td>0.170615</td>\n",
|
||||
" <td>0.936401</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.223771</td>\n",
|
||||
" <td>0.159633</td>\n",
|
||||
" <td>0.943843</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.fit_one_cycle(4, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Before unfreezing and training a bit more with discriminative learning rates..."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.212744</td>\n",
|
||||
" <td>0.159033</td>\n",
|
||||
" <td>0.944520</td>\n",
|
||||
" <td>00:35</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>0.201893</td>\n",
|
||||
" <td>0.159615</td>\n",
|
||||
" <td>0.942490</td>\n",
|
||||
" <td>00:35</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.204606</td>\n",
|
||||
" <td>0.152338</td>\n",
|
||||
" <td>0.945196</td>\n",
|
||||
" <td>00:36</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.213203</td>\n",
|
||||
" <td>0.148346</td>\n",
|
||||
" <td>0.947903</td>\n",
|
||||
" <td>00:36</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.unfreeze()\n",
|
||||
"learn.fit_one_cycle(4, slice(1e-6,1e-4))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"94.8% is very good when we remember a classifier trained the same way (with no data augmentation) had an arror rate of 7%."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -476,6 +810,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1307,6 +1307,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -2037,7 +2037,8 @@
|
||||
" return self.out\n",
|
||||
" \n",
|
||||
" def backward(self):\n",
|
||||
" self.inp.g = 2. * (self.inp.squeeze() - self.targ).unsqueeze(-1) / self.targ.shape[0]"
|
||||
" x = (self.inp.squeeze()-self.targ).unsqueeze(-1)\n",
|
||||
" self.inp.g = 2.*x/self.targ.shape[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -2189,7 +2190,8 @@
|
||||
"source": [
|
||||
"class Mse(LayerFunction):\n",
|
||||
" def forward (self, inp, targ): return (inp.squeeze() - targ).pow(2).mean()\n",
|
||||
" def bwd(self, out, inp, targ): inp.g = 2*(inp.squeeze()-targ).unsqueeze(-1) / targ.shape[0]"
|
||||
" def bwd(self, out, inp, targ): \n",
|
||||
" inp.g = 2*(inp.squeeze()-targ).unsqueeze(-1) / targ.shape[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -2446,6 +2448,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -653,6 +653,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -26,6 +26,13 @@
|
||||
"The end of chapter questionnaire is particularly important for this chapter. This is where we will be getting you started on the many interesting directions that you could take, using this chapter as your starting out point. What we are really saying is: follow through with this chapter on your computer, not on paper, and do lots of experiments, web searches, and whatever else you need to understand what's going on. You've built up the skills and expertise to do this in the rest of this book, so we think you are going to go great!"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"First let's start with gathering (manually) the data."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -42,7 +49,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -58,7 +65,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -67,7 +74,7 @@
|
||||
"Path('/home/jhoward/.fastai/data/imagenette2-160/val/n03417042/n03417042_3752.JPEG')"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -86,7 +93,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -95,7 +102,7 @@
|
||||
"Path('/home/jhoward/.fastai/data/imagenette2-160/val/n03417042/n03417042_3752.JPEG')"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -117,7 +124,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -127,7 +134,7 @@
|
||||
"<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=213x160 at 0x7FA45AC27D50>"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -139,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -148,7 +155,7 @@
|
||||
"torch.Size([160, 213, 3])"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -167,7 +174,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -176,7 +183,7 @@
|
||||
"(#10) ['n03417042','n03445777','n03888257','n03394916','n02979186','n03000684','n03425413','n01440764','n03028079','n02102040']"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -194,7 +201,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -212,7 +219,7 @@
|
||||
" 'n02102040': 9}"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -225,14 +232,14 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"That's all the pieces we need to put together our `Dataset`:"
|
||||
"That's all the pieces we need to put together our `Dataset`."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Dataset"
|
||||
"### Dataset"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -244,7 +251,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -266,7 +273,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -275,7 +282,7 @@
|
||||
"(9469, 3925)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -295,7 +302,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -304,7 +311,7 @@
|
||||
"(torch.Size([64, 64, 3]), tensor(0))"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -317,7 +324,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -346,7 +353,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -364,7 +371,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -373,7 +380,7 @@
|
||||
"(torch.Size([2, 64, 64, 3]), tensor([0, 0]))"
|
||||
]
|
||||
},
|
||||
"execution_count": 14,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -392,7 +399,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -419,7 +426,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -428,7 +435,7 @@
|
||||
"(torch.Size([128, 64, 64, 3]), torch.Size([128]), 74)"
|
||||
]
|
||||
},
|
||||
"execution_count": 16,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -452,7 +459,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -461,7 +468,7 @@
|
||||
"[tensor([0.4544, 0.4453, 0.4141]), tensor([0.2812, 0.2766, 0.2981])]"
|
||||
]
|
||||
},
|
||||
"execution_count": 17,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -480,7 +487,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -501,7 +508,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -511,7 +518,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -520,7 +527,7 @@
|
||||
"(tensor([0.3732, 0.4907, 0.5633]), tensor([1.0212, 1.0311, 1.0131]))"
|
||||
]
|
||||
},
|
||||
"execution_count": 20,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -537,6 +544,13 @@
|
||||
"Here `tfm_x` isn't just applying `Normalize`, but is also permuting the axis order from `NHWC` to `NCHW` (see <<chapter_convolutions>> if you need a reminder what these acronyms refer to). PIL uses `HWC` axis order, which we can't use with PyTorch, hence the need for this `permute`."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"That's all we need for the data for our model. So now we need the model itself!"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -548,12 +562,12 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"That's all we need for the data for our model. So now we need the model itself! To create a model, we'll need `Module`. To create `Module`, we'll need `Parameter`, so let's start there. Recall that in <<chapter_collab>> we said that `Parameter` \"this class doesn't actually add any functionality (other than automatically calling `requires_grad_()` for us). It's only used as a 'marker' to show what to include in `parameters()`\". Here's a definition which does exactly that:"
|
||||
"To create a model, we'll need `Module`. To create `Module`, we'll need `Parameter`, so let's start there. Recall that in <<chapter_collab>> we said that `Parameter` \"this class doesn't actually add any functionality (other than automatically calling `requires_grad_()` for us). It's only used as a 'marker' to show what to include in `parameters()`\". Here's a definition which does exactly that:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -573,7 +587,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -582,7 +596,7 @@
|
||||
"tensor(3., requires_grad=True)"
|
||||
]
|
||||
},
|
||||
"execution_count": 22,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -600,7 +614,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -658,7 +672,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -686,7 +700,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -695,7 +709,7 @@
|
||||
"2"
|
||||
]
|
||||
},
|
||||
"execution_count": 25,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -714,7 +728,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -723,7 +737,7 @@
|
||||
"torch.Size([128, 4, 64, 64])"
|
||||
]
|
||||
},
|
||||
"execution_count": 26,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -743,7 +757,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -766,7 +780,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -775,7 +789,7 @@
|
||||
"torch.Size([3, 2])"
|
||||
]
|
||||
},
|
||||
"execution_count": 28,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -795,7 +809,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -814,7 +828,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 30,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -823,7 +837,7 @@
|
||||
"4"
|
||||
]
|
||||
},
|
||||
"execution_count": 30,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -842,7 +856,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 31,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -851,7 +865,7 @@
|
||||
"device(type='cuda', index=5)"
|
||||
]
|
||||
},
|
||||
"execution_count": 31,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -865,7 +879,14 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Simple CNN"
|
||||
"We can now use those pieces to create a CNN."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Simple CNN"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -877,7 +898,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 32,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -915,7 +936,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -932,7 +953,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 34,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -956,7 +977,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 35,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -965,7 +986,7 @@
|
||||
"10"
|
||||
]
|
||||
},
|
||||
"execution_count": 35,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -984,7 +1005,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 36,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1003,7 +1024,7 @@
|
||||
"torch.Size([128, 10])"
|
||||
]
|
||||
},
|
||||
"execution_count": 36,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1016,6 +1037,13 @@
|
||||
"r.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We have data and model. Now we need a loss function."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -1027,12 +1055,12 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We have data and model. Now we need a loss function. We've already seen how to define \"negative log likelihood\":"
|
||||
"We've already seen how to define \"negative log likelihood\":"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 37,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1048,7 +1076,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 38,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1057,7 +1085,7 @@
|
||||
"tensor(-1.2790, grad_fn=<SelectBackward>)"
|
||||
]
|
||||
},
|
||||
"execution_count": 38,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1077,7 +1105,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 39,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1086,7 +1114,7 @@
|
||||
"tensor(2.5666, grad_fn=<NegBackward>)"
|
||||
]
|
||||
},
|
||||
"execution_count": 39,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1109,7 +1137,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 40,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1118,7 +1146,7 @@
|
||||
"tensor(-1.2790, grad_fn=<SelectBackward>)"
|
||||
]
|
||||
},
|
||||
"execution_count": 40,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1144,7 +1172,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1153,7 +1181,7 @@
|
||||
"tensor(True)"
|
||||
]
|
||||
},
|
||||
"execution_count": 41,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1173,7 +1201,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 42,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1182,7 +1210,7 @@
|
||||
"tensor(3.9784, grad_fn=<SelectBackward>)"
|
||||
]
|
||||
},
|
||||
"execution_count": 42,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1204,7 +1232,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 43,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1220,7 +1248,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 44,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1229,7 +1257,7 @@
|
||||
"tensor(-1.2790, grad_fn=<SelectBackward>)"
|
||||
]
|
||||
},
|
||||
"execution_count": 44,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1247,13 +1275,20 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 45,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def cross_entropy(preds, yb): return nll(log_softmax(preds), yb).mean()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Let's now combine all those pieces together to create a `Learner`."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -1270,7 +1305,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 46,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1291,7 +1326,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 47,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1310,12 +1345,10 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 57,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#id class_learner\n",
|
||||
"#caption The Learner class\n",
|
||||
"class Learner:\n",
|
||||
" def __init__(self, model, dls, loss_func, lr, cbs, opt_func=SGD):\n",
|
||||
" store_attr(self, 'model,dls,loss_func,lr,cbs,opt_func')\n",
|
||||
@@ -1375,7 +1408,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Callbacks"
|
||||
"### Callbacks"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1391,7 +1424,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 58,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1407,7 +1440,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 59,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1430,7 +1463,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 60,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1460,7 +1493,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 61,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1508,14 +1541,14 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"It's quite amazing to realize that we can implement all the key ideas from fastai's `Learner` in so little code!"
|
||||
"It's quite amazing to realize that we can implement all the key ideas from fastai's `Learner` in so little code! Let's now add some learning rate scheduling."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Annealing"
|
||||
"### Scheduling the learning rate"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1527,7 +1560,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 62,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1556,7 +1589,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 63,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1719,7 +1752,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 64,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1756,6 +1789,13 @@
|
||||
"plt.plot(onecyc.lrs);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"TK conclusion"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -1841,6 +1881,9 @@
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
@@ -1856,20 +1899,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -69,6 +69,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -292,6 +292,18 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -533,31 +533,6 @@
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.5"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": false,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": true,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -0,0 +1,261 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Data Ethics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Sidebar: Acknowledgement: Dr Rachel Thomas"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### End sidebar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Key examples for data ethics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Bugs and recourse: Buggy algorithm used for healthcare benefits"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Feedback loops: YouTube's recommendation system"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Bias: Professor Lantanya Sweeney \"arrested\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Why does this matter?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Integrating machine learning with product design"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Topics in Data Ethics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Recourse and accountability"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Feedback loops"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Bias"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Historical bias"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Measurement bias"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Aggregation Bias"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Representation Bias"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Addressing different types of bias"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Humans are biased, so does algorithmic bias matter?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Disinformation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Identifying and addressing ethical issues"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Analyze a project you are working on"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Processes to implement"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Ethical Lenses"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### The power of diversity"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Fairness, accountability, and transparency"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Role of Policy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### The effectiveness of regulation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Rights and policy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Cars: a historical precedent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conclusion"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questionnaire"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Further research:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Section 1: that's a wrap!"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
@@ -0,0 +1,654 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Training a state-of-the-art model"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Imagenette"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from fastai2.vision.all import *\n",
|
||||
"path = untar_data(URLs.IMAGENETTE)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dblock = DataBlock(blocks=(ImageBlock(), CategoryBlock()),\n",
|
||||
" get_items=get_image_files,\n",
|
||||
" get_y=parent_label,\n",
|
||||
" item_tfms=Resize(460),\n",
|
||||
" batch_tfms=aug_transforms(size=224, min_scale=0.75))\n",
|
||||
"dls = dblock.dataloaders(path, bs=64)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.583403</td>\n",
|
||||
" <td>2.064317</td>\n",
|
||||
" <td>0.401792</td>\n",
|
||||
" <td>01:03</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.208877</td>\n",
|
||||
" <td>1.260106</td>\n",
|
||||
" <td>0.601568</td>\n",
|
||||
" <td>01:02</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.925265</td>\n",
|
||||
" <td>1.036154</td>\n",
|
||||
" <td>0.664302</td>\n",
|
||||
" <td>01:03</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.730190</td>\n",
|
||||
" <td>0.700906</td>\n",
|
||||
" <td>0.777819</td>\n",
|
||||
" <td>01:03</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>0.585707</td>\n",
|
||||
" <td>0.541810</td>\n",
|
||||
" <td>0.825243</td>\n",
|
||||
" <td>01:03</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = xresnet50()\n",
|
||||
"learn = Learner(dls, model, loss_func=CrossEntropyLossFlat(), metrics=accuracy)\n",
|
||||
"learn.fit_one_cycle(5, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Normalization"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(TensorImage([0.4842, 0.4711, 0.4511], device='cuda:5'),\n",
|
||||
" TensorImage([0.2873, 0.2893, 0.3110], device='cuda:5'))"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x,y = dls.one_batch()\n",
|
||||
"x.mean(dim=[0,2,3]),x.std(dim=[0,2,3])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def get_dls(bs, size):\n",
|
||||
" dblock = DataBlock(blocks=(ImageBlock, CategoryBlock),\n",
|
||||
" get_items=get_image_files,\n",
|
||||
" get_y=parent_label,\n",
|
||||
" item_tfms=Resize(460),\n",
|
||||
" batch_tfms=[*aug_transforms(size=size, min_scale=0.75),\n",
|
||||
" Normalize.from_stats(*imagenet_stats)])\n",
|
||||
" return dblock.dataloaders(path, bs=bs)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dls = get_dls(64, 224)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(TensorImage([-0.0787, 0.0525, 0.2136], device='cuda:5'),\n",
|
||||
" TensorImage([1.2330, 1.2112, 1.3031], device='cuda:5'))"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x,y = dls.one_batch()\n",
|
||||
"x.mean(dim=[0,2,3]),x.std(dim=[0,2,3])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.632865</td>\n",
|
||||
" <td>2.250024</td>\n",
|
||||
" <td>0.391337</td>\n",
|
||||
" <td>01:02</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.294041</td>\n",
|
||||
" <td>1.579932</td>\n",
|
||||
" <td>0.517177</td>\n",
|
||||
" <td>01:02</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.960535</td>\n",
|
||||
" <td>1.069164</td>\n",
|
||||
" <td>0.657207</td>\n",
|
||||
" <td>01:04</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.730220</td>\n",
|
||||
" <td>0.767433</td>\n",
|
||||
" <td>0.771845</td>\n",
|
||||
" <td>01:05</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>0.577889</td>\n",
|
||||
" <td>0.550673</td>\n",
|
||||
" <td>0.824496</td>\n",
|
||||
" <td>01:06</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = xresnet50()\n",
|
||||
"learn = Learner(dls, model, loss_func=CrossEntropyLossFlat(), metrics=accuracy)\n",
|
||||
"learn.fit_one_cycle(5, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Progressive resizing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.902943</td>\n",
|
||||
" <td>2.447006</td>\n",
|
||||
" <td>0.401419</td>\n",
|
||||
" <td>00:30</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.315203</td>\n",
|
||||
" <td>1.572992</td>\n",
|
||||
" <td>0.525765</td>\n",
|
||||
" <td>00:30</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.001199</td>\n",
|
||||
" <td>0.767886</td>\n",
|
||||
" <td>0.759149</td>\n",
|
||||
" <td>00:30</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.765864</td>\n",
|
||||
" <td>0.665562</td>\n",
|
||||
" <td>0.797984</td>\n",
|
||||
" <td>00:30</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"dls = get_dls(128, 128)\n",
|
||||
"learn = Learner(dls, xresnet50(), loss_func=CrossEntropyLossFlat(), \n",
|
||||
" metrics=accuracy)\n",
|
||||
"learn.fit_one_cycle(4, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.985213</td>\n",
|
||||
" <td>1.654063</td>\n",
|
||||
" <td>0.565721</td>\n",
|
||||
" <td>01:06</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.706869</td>\n",
|
||||
" <td>0.689622</td>\n",
|
||||
" <td>0.784541</td>\n",
|
||||
" <td>01:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>0.739217</td>\n",
|
||||
" <td>0.928541</td>\n",
|
||||
" <td>0.712472</td>\n",
|
||||
" <td>01:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.629462</td>\n",
|
||||
" <td>0.788906</td>\n",
|
||||
" <td>0.764003</td>\n",
|
||||
" <td>01:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.491912</td>\n",
|
||||
" <td>0.502622</td>\n",
|
||||
" <td>0.836445</td>\n",
|
||||
" <td>01:06</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>0.414880</td>\n",
|
||||
" <td>0.431332</td>\n",
|
||||
" <td>0.863331</td>\n",
|
||||
" <td>01:06</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.dls = get_dls(64, 224)\n",
|
||||
"learn.fine_tune(5, 1e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Test time augmentation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"0.8737863898277283"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"preds,targs = learn.tta()\n",
|
||||
"accuracy(preds, targs).item()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Mixup"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Sidebar: Papers and math"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### End sidebar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"hide_input": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 864x288 with 3 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"church = PILImage.create(get_image_files_sorted(path/'train'/'n03028079')[0])\n",
|
||||
"gas = PILImage.create(get_image_files_sorted(path/'train'/'n03425413')[0])\n",
|
||||
"church = church.resize((256,256))\n",
|
||||
"gas = gas.resize((256,256))\n",
|
||||
"tchurch = tensor(church).float() / 255.\n",
|
||||
"tgas = tensor(gas).float() / 255.\n",
|
||||
"\n",
|
||||
"_,axs = plt.subplots(1, 3, figsize=(12,4))\n",
|
||||
"show_image(tchurch, ax=axs[0]);\n",
|
||||
"show_image(tgas, ax=axs[1]);\n",
|
||||
"show_image((0.3*tchurch + 0.7*tgas), ax=axs[2]);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Label smoothing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Sidebar: Label smoothing, the paper"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### End sidebar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conclusion"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questionnaire"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Further research\n",
|
||||
"\n",
|
||||
"1. Use the fastai documentation to build a function that crops an image to a square in the four corners, then implement a TTA method that averages the predictions on a center crop and those four crops. Did it help? Is it better than the TTA method of fastai?\n",
|
||||
"1. Find the Mixup paper on arxiv and read it. Pick one or two more recent articles introducing variants of Mixup and read them, then try to implement them on your problem.\n",
|
||||
"1. Find the script training Imagenette using Mixup and use it as an example to build a script for a long training on your own project. Execute it and see if it helped.\n",
|
||||
"1. Read the sidebar on the math of label smoothing, and look at the relevant section of the original paper, and see if you can follow it. Don't be afraid to ask for help!"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,840 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *\n",
|
||||
"from IPython.display import display,HTML"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Data munging with fastai's mid-level API"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Going deeper into fastai's layered API"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from fastai2.text.all import *\n",
|
||||
"\n",
|
||||
"dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"path = untar_data(URLs.IMDB)\n",
|
||||
"dls = DataBlock(\n",
|
||||
" blocks=(TextBlock.from_folder(path),CategoryBlock),\n",
|
||||
" get_y = parent_label,\n",
|
||||
" get_items=partial(get_text_files, folders=['train', 'test']),\n",
|
||||
" splitter=GrandparentSplitter(valid_name='test')\n",
|
||||
").dataloaders(path)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Transforms"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"files = get_text_files(path, folders = ['train', 'test'])\n",
|
||||
"txts = L(o.open().read() for o in files[:2000])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(#228) ['xxbos','xxmaj','this','movie',',','which','i','just','discovered','at'...]"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tok = Tokenizer.from_folder(path)\n",
|
||||
"tok.setup(txts)\n",
|
||||
"toks = txts.map(tok)\n",
|
||||
"toks[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 2, 8, 20, 27, 11, 88, 18, 53, 3286, 45])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"num = Numericalize()\n",
|
||||
"num.setup(toks)\n",
|
||||
"nums = toks.map(num)\n",
|
||||
"nums[0][:10]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 2, 8, 20, 27, 11, 88, 18, 53, 3286, 45])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"num = Numericalize()\n",
|
||||
"num.setup(toks)\n",
|
||||
"nums = toks.map(num)\n",
|
||||
"nums[0][:10]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(#10) ['xxbos','xxmaj','this','movie',',','which','i','just','discovered','at']"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"nums_dec = num.decode(nums[0][:10]); nums_dec"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'xxbos xxmaj this movie , which i just discovered at'"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tok.decode(nums_dec)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"((#374) ['xxbos','xxmaj','well',',','\"','cube','\"','(','1997',')'...],\n",
|
||||
" (#207) ['xxbos','xxmaj','conrad','xxmaj','hall','went','out','with','a','bang'...])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tok((txts[0], txts[1]))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Writing your own Transform"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def f(x): return x+1\n",
|
||||
"tfm = Transform(f)\n",
|
||||
"tfm(2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class NormalizeMean(Transform):\n",
|
||||
" def setups(self, items): self.mean = sum(items)/len(items)\n",
|
||||
" def encodes(self, x): return x-self.mean\n",
|
||||
" def decodes(self, x): return x+self.mean"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(3.0, 5.0, 2.0)"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tfm = NormalizeMean()\n",
|
||||
"tfm.setup([1,2,3,4,5])\n",
|
||||
"start = 2\n",
|
||||
"y = tfm(start)\n",
|
||||
"z = tfm.decode(y)\n",
|
||||
"tfm.mean,y,z"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Pipeline"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 2, 8, 76, 10, 23, 3112, 23, 34, 3113, 33, 10, 8, 4477, 22, 88, 32, 10, 27, 42, 14])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tfms = Pipeline([tok, num])\n",
|
||||
"t = tfms(txts[0]); t[:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'xxbos xxmaj well , \" cube \" ( 1997 ) , xxmaj vincenzo \\'s first movie , was one of the most interesti'"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tfms.decode(t)[:100]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## TfmdLists and Datasets: Transformed collections"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### TfmdLists"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"tls = TfmdLists(files, [Tokenizer.from_folder(path), Numericalize])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 2, 8, 91, 11, 22, 5793, 22, 37, 4910, 34, 11, 8, 13042, 23, 107, 30, 11, 25, 44, 14])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"t = tls[0]; t[:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'xxbos xxmaj well , \" cube \" ( 1997 ) , xxmaj vincenzo \\'s first movie , was one of the most interesti'"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tls.decode(t)[:100]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"xxbos xxmaj well , \" cube \" ( 1997 ) , xxmaj vincenzo 's first movie , was one of the most interesting and tricky ideas that xxmaj i 've ever seen when talking about movies . xxmaj they had just one scenery , a bunch of actors and a plot . xxmaj so , what made it so special were all the effective direction , great dialogs and a bizarre condition that characters had to deal like rats in a labyrinth . xxmaj his second movie , \" cypher \" ( 2002 ) , was all about its story , but it was n't so good as \" cube \" but here are the characters being tested like rats again . \n",
|
||||
"\n",
|
||||
" \" nothing \" is something very interesting and gets xxmaj vincenzo coming back to his ' cube days ' , locking the characters once again in a very different space with no time once more playing with the characters like playing with rats in an experience room . xxmaj but instead of a thriller sci - fi ( even some of the promotional teasers and trailers erroneous seemed like that ) , \" nothing \" is a loose and light comedy that for sure can be called a modern satire about our society and also about the intolerant world we 're living . xxmaj once again xxmaj xxunk amaze us with a great idea into a so small kind of thing . 2 actors and a blinding white scenario , that 's all you got most part of time and you do n't need more than that . xxmaj while \" cube \" is a claustrophobic experience and \" cypher \" confusing , \" nothing \" is completely the opposite but at the same time also desperate . \n",
|
||||
"\n",
|
||||
" xxmaj this movie proves once again that a smart idea means much more than just a millionaire budget . xxmaj of course that the movie fails sometimes , but its prime idea means a lot and offsets any flaws . xxmaj there 's nothing more to be said about this movie because everything is a brilliant surprise and a totally different experience that i had in movies since \" cube \" .\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tls.show(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"cut = int(len(files)*0.8)\n",
|
||||
"splits = [list(range(cut)), list(range(cut,len(files)))]\n",
|
||||
"tls = TfmdLists(files, [Tokenizer.from_folder(path), Numericalize], \n",
|
||||
" splits=splits)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 2, 8, 20, 30, 87, 510, 1570, 12, 408, 379, 4196, 10, 8, 20, 30, 16, 13, 12216, 202, 509])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tls.valid[0][:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(#50000) ['pos','pos','pos','pos','pos','pos','pos','pos','pos','pos'...]"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"lbls = files.map(parent_label)\n",
|
||||
"lbls"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"((#2) ['neg','pos'], TensorCategory(1))"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"cat = Categorize()\n",
|
||||
"cat.setup(lbls)\n",
|
||||
"cat.vocab, cat(lbls[0])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"TensorCategory(1)"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tls_y = TfmdLists(files, [parent_label, Categorize()])\n",
|
||||
"tls_y[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Datasets"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"x_tfms = [Tokenizer.from_folder(path), Numericalize]\n",
|
||||
"y_tfms = [parent_label, Categorize()]\n",
|
||||
"dsets = Datasets(files, [x_tfms, y_tfms])\n",
|
||||
"x,y = dsets[0]\n",
|
||||
"x[:20],y"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(tensor([ 2, 8, 20, 30, 87, 510, 1570, 12, 408, 379, 4196, 10, 8, 20, 30, 16, 13, 12216, 202, 509]),\n",
|
||||
" TensorCategory(0))"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x_tfms = [Tokenizer.from_folder(path), Numericalize]\n",
|
||||
"y_tfms = [parent_label, Categorize()]\n",
|
||||
"dsets = Datasets(files, [x_tfms, y_tfms], splits=splits)\n",
|
||||
"x,y = dsets.valid[0]\n",
|
||||
"x[:20],y"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"('xxbos xxmaj this movie had horrible lighting and terrible camera movements . xxmaj this movie is a jumpy horror flick with no meaning at all . xxmaj the slashes are totally fake looking . xxmaj it looks like some 17 year - old idiot wrote this movie and a 10 year old kid shot it . xxmaj with the worst acting you can ever find . xxmaj people are tired of knives . xxmaj at least move on to guns or fire . xxmaj it has almost exact lines from \" when a xxmaj stranger xxmaj calls \" . xxmaj with gruesome killings , only crazy people would enjoy this movie . xxmaj it is obvious the writer does n\\'t have kids or even care for them . i mean at show some mercy . xxmaj just to sum it up , this movie is a \" b \" movie and it sucked . xxmaj just for your own sake , do n\\'t even think about wasting your time watching this crappy movie .',\n",
|
||||
" 'neg')"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"t = dsets.valid[0]\n",
|
||||
"dsets.decode(t)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dls = dsets.dataloaders(bs=64, before_batch=pad_input)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"tfms = [[Tokenizer.from_folder(path), Numericalize], [parent_label, Categorize]]\n",
|
||||
"files = get_text_files(path, folders = ['train', 'test'])\n",
|
||||
"splits = GrandparentSplitter(valid_name='test')(files)\n",
|
||||
"dsets = Datasets(files, tfms, splits=splits)\n",
|
||||
"dls = dsets.dataloaders(dl_type=SortedDL, before_batch=pad_input)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"path = untar_data(URLs.IMDB)\n",
|
||||
"dls = DataBlock(\n",
|
||||
" blocks=(TextBlock.from_folder(path),CategoryBlock),\n",
|
||||
" get_y = parent_label,\n",
|
||||
" get_items=partial(get_text_files, folders=['train', 'test']),\n",
|
||||
" splitter=GrandparentSplitter(valid_name='test')\n",
|
||||
").dataloaders(path)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Applying the mid-tier data API: SiamesePair"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from fastai2.vision.all import *\n",
|
||||
"path = untar_data(URLs.PETS)\n",
|
||||
"files = get_image_files(path/\"images\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class SiameseImage(Tuple):\n",
|
||||
" def show(self, ctx=None, **kwargs): \n",
|
||||
" img1,img2,same_breed = self\n",
|
||||
" if not isinstance(img1, Tensor):\n",
|
||||
" if img2.size != img1.size: img2 = img2.resize(img1.size)\n",
|
||||
" t1,t2 = tensor(img1),tensor(img2)\n",
|
||||
" t1,t2 = t1.permute(2,0,1),t2.permute(2,0,1)\n",
|
||||
" else: t1,t2 = img1,img2\n",
|
||||
" line = t1.new_zeros(t1.shape[0], t1.shape[1], 10)\n",
|
||||
" return show_image(torch.cat([t1,line,t2], dim=2), \n",
|
||||
" title=same_breed, ctx=ctx)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 360x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"img = PILImage.create(files[0])\n",
|
||||
"s = SiameseImage(img, img, True)\n",
|
||||
"s.show();"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 360x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"img1 = PILImage.create(files[1])\n",
|
||||
"s1 = SiameseImage(img, img1, False)\n",
|
||||
"s1.show();"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 360x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"s2 = Resize(224)(s1)\n",
|
||||
"s2.show();"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def label_func(fname):\n",
|
||||
" return re.match(r'^(.*)_\\d+.jpg$', fname.name).groups()[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class SiameseTransform(Transform):\n",
|
||||
" def __init__(self, files, label_func, splits):\n",
|
||||
" self.labels = files.map(label_func).unique()\n",
|
||||
" self.lbl2files = {l: L(f for f in files if label_func(f) == l) \n",
|
||||
" for l in self.labels}\n",
|
||||
" self.label_func = label_func\n",
|
||||
" self.valid = {f: self._draw(f) for f in files[splits[1]]}\n",
|
||||
" \n",
|
||||
" def encodes(self, f):\n",
|
||||
" f2,t = self.valid.get(f, self._draw(f))\n",
|
||||
" img1,img2 = PILImage.create(f),PILImage.create(f2)\n",
|
||||
" return SiameseImage(img1, img2, t)\n",
|
||||
" \n",
|
||||
" def _draw(self, f):\n",
|
||||
" same = random.random() < 0.5\n",
|
||||
" cls = self.label_func(f)\n",
|
||||
" if not same: \n",
|
||||
" cls = random.choice(L(l for l in self.labels if l != cls)) \n",
|
||||
" return random.choice(self.lbl2files[cls]),same"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAAB6CAYAAAD5yEXhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy8d3QUV7r1/TvnVHVQlshC5GgyGBsMmGBwwAkb5zg2xgmHcRjHcQCPs8c5x3FO2OCAE8YkAyaLJJKEUEAoZ6lj1TnfH9Vgz/3W+F3vrHvf63uX9lq9pO7qrj5dXWfX3s+zTwtjDG1oQxva8EeB/O8eQBva0IY2/BZtpNSGNrThD4U2UmpDG9rwh0IbKbWhDW34Q6GNlNrQhjb8odBGSm1oQxv+UGgjpTa0oQ1/KLSRUhv+fxBCtPzmpoUQ4d/cv+i/e3xt+N8N0RaebMPvQQhRBMw2xiz5nedYxhjn/92o2vC/GW1KqQ3/1xBCPCiE+EQI8ZEQohm4WAjxvhBi7m+eMy1BaIfu5wghFgohqoUQ+4UQ1/03DL0N/wPQRkpt+HdxJvAhkA588ntPFEIoYBGwAegKHA/cJoSY+l89yDb8z0MbKbXh38UqY8zXxhhtjAn/H547FkgzxjxsjIkZYwqAN4Hz/+uH2Yb/abD+uwfQhv+xKP2/eG4PoLsQouE3jylg+X/qiNrwvwJtpNSGfxf/sUPSCiT95n7n3/xfCuQbY474Lx9VG/7Ho82+teE/C1uAU4QQmUKILsCNv9n2CxATQtwqhAgIIZQQYqgQ4sj/nqG24Y+MNlJqw38W3gZ2AcXA98DHhzYk4gInA0cDRUAN8CqQ9v96kG3446Mtp9SGNrThD4U2pdSGNrThD4U2UmpDG9rwh0IbKbWhDW34Q6GNlNrQhjb8odBGSm1oQxv+UPjd8GSyCBrXihBQNkJqlBKARPiAKLgaokaBcFAoLOEgESghcaRECINPOzjS4rddPmE0SAHGxjEu0oBCgBG40kFqiVQKIzWg8RkfrtS4xkEZhSsMaANG4hqNEAIAJcHbJBDSRSNAG6SUOHGNkt42qQA0AhuDixACvy/Bz0IdHqdSCmMEjnCxjCDuOgT8Fm7ce40v4EMgcV0XI7z39nYhsfwB7GASwaQUhBB06NjJG4eB9IwMjBQILXBFHOO4uI4hHosQSAoiHI1jNJHWEEpY+AJ+pJ04hkJgjCHuREELpAShBaGWVpLS0jHSW6zvxjXReAQ3EsMYQVJSEloKbCGJOnGENqAkUkpwNaFYHAtBKBbG0hJpCZyYi7YsYqFWmpvqcFyB8geQPj+h4gKME8aWivyalsPHrGvHdjSnhBjcL5X6aID4wUpSOim6Dp7GtJMs4sGjyF/5Lm88sYtBY2Fkx7HsoJHP/z6LR+95ntaI5sLrLya5fTvOuOBOAllw7slDWLdhPz8+/zZXzbuR8qYaZl92E189+RE/lBez+YeX+XLVJ4zvPJkmU80bi7/gyI6jGN9jGFc98waR+iaceJzWRoc7/nYidn2Yq/98I4W1RWzLXcXGNTuoj1dz6vjL+WT5Ak4cPZmXPvieTskpxBtbKNdNJKdaNNSG+O7rL5n/48uM7ZPNCw+s56xZU/nsm6+Y//zPDJzUHbcmnb5dHQb0asdZl5/HL4s3cuWcq8jdsJg6y2Zz3iZ27Gxk/YZ8jj9rIge3bcUfaeXe2x7l09w3+GVpHvc8+BgPzXmcqtZWJk0WXHvVDVx++UtYqpXtqxQzrmlHs9XMnhUh3v54Dnef9iV74mVsXvYtN9x3J7vL8ulswmR0aE+VaeCZx+bx98feormmiZkXn8bZk8/jxy++Y79/LW+8sZbChcvoO+V4enVzEIEAvY/qzZb5Bzj1nAlMvnQyexbXsalgPq/O/ZmbLx9HQ2YTRx1zPO+/8QnnnnMha7bsRYhGkivS6HPEYHqc3p5Xb1+AlWVTE91HhupOwcYidB/FETk5zJx1Kjce/4L4V7yj5s6d+y9J6aHH5s21pMLRBlcb4q7ANQYnCnGtcdE42kEbgYuD0RKEIOqCMQZbKozHBHh0phBSoTVgDMIIhDZIpZAIHOkitQRl0I5GCG/SGAyWEThGYKRBGDAClKsxUnr3MSBBSAthDBwiJwwagxYCicRIjXEB6W1TAoyU2IARAqTElXhjFxJXaKSUSA1SWlgShBIoqRBSgAFhJGCwELjSgPHeU0mbQNCPzxcg4PfhCpBaYyyLeDSMCiYjHZeIq1GWwm/bSGHhaAeQmHgMbQm06xB1Y1j+JJL8ftyoIRoL4RcWSiikELSEmhFIAoFkpKswjusddyNorisjEotiJ6UCBsd1ka5BWAqpFE7MoaWxFtufQjwSRSkNAT9au/i0wInFiYXCRMJRUDbpySm0VBYjDRglqQ/FDp8znbJitMQVqX39nHbqOJZ/vYfW+jgPP3YvfTIcSg4epDhvLwfKWgnWCujYyPSpk9GpDYzoO5EXvv2O8ceNJBxvZsa0QQyeOZUkGhjVrRuTRvTjlRVL0AegQ6dUfli1haPH9CCnVw/eeOFTjj5lKB8v+BpfAMaPGkd5vImcdh1YtmIbxvVR73c46eSBqJBk+b61yFiAx2//gCD1VBiXvC1ljBubzdNPLSUcaaW0qJZpJ0xl+LDB7N+/F59M4ofvvqeuvohRg/rz4gvL+XrRKtykCL17t7Dw63W4JkBpRQPp7VIJOBnUVa6lZ88hVFXs5/s1qxhw5Hh6djIU761k6nGj2Zm7kX59uzN4yEiS0qL0OaIPS5Yupuagn/ZdXEIyRP6mZkrLG1AByd33XkRSph8n1Ex5scWE8dN487NF2BGbHZuXc/NfL+Suv/yVlMxWOnT3s/rnYk6aOZ57bvmC9B6K5gPNdO5tyMrOJBoq5JwLZiObyklKTabVNHLG+ePYs62AxnKX777aQ6yhkszkKMdOH0Fu7jqyKsLsDx/gqDEzuPbC61i47DNyl+2kpbWO2vIyquJlDBo9CuW6zJpzGqeNGctDj33HzFlTuf+iq6ipqGNw764M6XfivH+LlB544IG5RhuMMbh4ykgLMBpcI9BagJFICdrVGAFGSDSGuOPiuBptJBHtEnc0tmWhEuRhXO89XCW8k9sYQCDwRJCQCSJ1QePtW6MPqxHjgk6wk8YjKoREOy4oiZAeaXnbPNKLo1HGIz1PXSksWyK8l4KwEXiEJ72RYrTBRF3wC+8RIQDhrbEw4GLAaE+9uAI3bgiHIzgxh0BSgIAdwAoG8AWTwXVpbW2iefcWnLpSqiqqcJHYto1MjN9nB9DG4ETCNDY3E6qqwBzYjVtVQmNZMY0NDWhp4RiDsC1QHomFy4oJFe2itqkR7bPx+ZMwQhOPx/HVlkN1JY2l+6mvPog/syPReIyWhnpwBPV1tejKg1Ts340vtR3hmCbW0kJzqJma0iIaGurQQuIP1eOG6mloqIWYiy0lrjY0ROKHz5mPF99NUiBI7qZtLF+cx4kn9GffbsM7iz5gyLCuZPmaGTtuGjt2bqJDlwh7cmPU11SzYP5Kjp7SlytuvIS6ulK+/mYl6R0kyQfKaAlFWfH5ZuYt/JT6/Bay+6ZyzrCxfLlxE9h+Bo/qjb86Qs/+A1m8ehG9Wy2sQDtWLlnFxXfN4YJzjmZ7eT5zLj+bV17+mCxl8/HirfQdIDl2/BAGZw9hT1MDQ3sFqC5LZW/ZQXw+w9gB/dl6oIQDu3ZwYE8Lnfp1QdGLaFUzJ50xnB8X5/Pd968jwha9B49mzaKfGJnTnp+Xf8PVtz9L3+5JbNyzGxoruPepDfTr3JmrL7uQfSUHaWpq4b13lvPlJwvJ6Ozw9+dfIWTVsGlFMb1H9KAkP4/vv1jM3vx8LrvgWr788lOCSnHNbRcTlDkM6zqUc2dN4ot3l1FaUUJTjaEoXk9uwXIGZqfz2DOfMvWE0az/vpSJU0ey9OtNWKkhunWCwSMm8P2yhWzatZE/nX4t+5qb2VK0k8n9RnLxCTdw1TUvMn36cRx/ZgfWbm2lPtTM2eNOIXfDdwS6dmZXbYzVyxYy8sQhDEkaQ5G7g4FHTeGoCX0YP3Eay1b8xIi+R7Hio7dZ/NkvdB4aYv3iUp74230syPuYVUvWcsnZt/1LUvr9tW9G4uAiBBidIAljcI3Em0UJu6Q1AgUY4trFLwSWZWOMR2gYC3BpjmsybIUxMTxZo1GuAHFocnsT3SjPdgEgEwRiJEoARqFN3FvO6UqM1oDwCMrVSKE9kkARAWzt+SoDCFejLRCOwSgLKTWu6ykgKUEbjZQ2aIdQLIxxNU5cIy2LVJ+NEQqMQQqBNJLmSBQhBEmWRXMoRjwW88ZrwBKSWDhCNMUhoMHCEEfiVJTQwSeIGU1aqIHm/Gpaeg8lNaMDB0uLceIRWhrqidbVkJKSRHLcoUEIoq6LMQ7xulJai0vJ6JxNTXEZUVy65PRA6Rh19WF0fQnR/EJSMjIJtsuktbKSSCSCcfCsrglTWvkzMdezpBqDVmAj0VpTvnUzQgi0EShpsITEBWhuAm3w+fxYxPAZPBvs/vMps6W5kR83rme41ZN9OSWs3FCMTJEIN0BaVpgFn6/j6EkxKqItBLpnMP2co1n68WJGXzqYWL0gXhVhz/oC8otLeeLK27n+/jk0hdJoCafjy27hz9P60m3cLDYvXsSyb+7kxW920yM5jbpJx3DV44/y6u3n0xTqz/ljcug+pgczh1/Mw69fx1XnTieITbw1mbe+2M2QMR0YOnIim5YsZ9N3G6nJFDR068RHH23nulOPZk1lPZffdSazrn+YWK0mK7M9GfEUqlt3M2hoOkEV5NQJw5GBIDl9/KTqVCaOGszQlB6cdMIkOk/VXH3RBE64YC2vlO4gf8n3nHDDuZRXNFK3p4ULZx/N0iW7yN22gp/XbaasqYXZx05kzhUzOG/ybBaseorLrzmbyqZqGsvDXDt7Dvfc/w9ef/dtbr7Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 360x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"splits = RandomSplitter()(files)\n",
|
||||
"tfm = SiameseTransform(files, label_func, splits)\n",
|
||||
"tfm(files[0]).show();"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 360x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tls = TfmdLists(files, tfm, splits=splits)\n",
|
||||
"show_at(tls.valid, 0);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dls = tls.dataloaders(after_item=[Resize(224), ToTensor], \n",
|
||||
" after_batch=[IntToFloatTensor, Normalize.from_stats(*imagenet_stats)])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Becoming a deep learning practitioner"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,862 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"hide_input": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Resnets"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Going back to Imagenette"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def get_data(url, presize, resize):\n",
|
||||
" path = untar_data(url)\n",
|
||||
" return DataBlock(\n",
|
||||
" blocks=(ImageBlock, CategoryBlock), get_items=get_image_files, \n",
|
||||
" splitter=GrandparentSplitter(valid_name='val'),\n",
|
||||
" get_y=parent_label, item_tfms=Resize(presize),\n",
|
||||
" batch_tfms=[*aug_transforms(min_scale=0.5, size=resize),\n",
|
||||
" Normalize.from_stats(*imagenet_stats)],\n",
|
||||
" ).dataloaders(path, bs=128)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dls = get_data(URLs.IMAGENETTE_160, 160, 128)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x432 with 4 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"dls.show_batch(max_n=4)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def avg_pool(x): return x.mean((2,3))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def block(ni, nf): return ConvLayer(ni, nf, stride=2)\n",
|
||||
"def get_model():\n",
|
||||
" return nn.Sequential(\n",
|
||||
" block(3, 16),\n",
|
||||
" block(16, 32),\n",
|
||||
" block(32, 64),\n",
|
||||
" block(64, 128),\n",
|
||||
" block(128, 256),\n",
|
||||
" nn.AdaptiveAvgPool2d(1),\n",
|
||||
" Flatten(),\n",
|
||||
" nn.Linear(256, dls.c))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def get_learner(m):\n",
|
||||
" return Learner(dls, m, loss_func=nn.CrossEntropyLoss(), metrics=accuracy\n",
|
||||
" ).to_fp16()\n",
|
||||
"\n",
|
||||
"learn = get_learner(get_model())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.47863011360168456, 3.981071710586548)"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.lr_find()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.901582</td>\n",
|
||||
" <td>2.155090</td>\n",
|
||||
" <td>0.325350</td>\n",
|
||||
" <td>00:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.559855</td>\n",
|
||||
" <td>1.586795</td>\n",
|
||||
" <td>0.507771</td>\n",
|
||||
" <td>00:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.296350</td>\n",
|
||||
" <td>1.295499</td>\n",
|
||||
" <td>0.571720</td>\n",
|
||||
" <td>00:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>1.144139</td>\n",
|
||||
" <td>1.139257</td>\n",
|
||||
" <td>0.639236</td>\n",
|
||||
" <td>00:07</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>1.049770</td>\n",
|
||||
" <td>1.092619</td>\n",
|
||||
" <td>0.659108</td>\n",
|
||||
" <td>00:07</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.fit_one_cycle(5, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Building a modern CNN: ResNet"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Skip-connections"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class ResBlock(Module):\n",
|
||||
" def __init__(self, ni, nf):\n",
|
||||
" self.convs = nn.Sequential(\n",
|
||||
" ConvLayer(ni,nf),\n",
|
||||
" ConvLayer(nf,nf, norm_type=NormType.BatchZero))\n",
|
||||
" \n",
|
||||
" def forward(self, x): return x + self.convs(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def _conv_block(ni,nf,stride):\n",
|
||||
" return nn.Sequential(\n",
|
||||
" ConvLayer(ni, nf, stride=stride),\n",
|
||||
" ConvLayer(nf, nf, act_cls=None, norm_type=NormType.BatchZero))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class ResBlock(Module):\n",
|
||||
" def __init__(self, ni, nf, stride=1):\n",
|
||||
" self.convs = _conv_block(ni,nf,stride)\n",
|
||||
" self.idconv = noop if ni==nf else ConvLayer(ni, nf, 1, act_cls=None)\n",
|
||||
" self.pool = noop if stride==1 else nn.AvgPool2d(2, ceil_mode=True)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" return F.relu(self.convs(x) + self.idconv(self.pool(x)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def block(ni,nf): return ResBlock(ni, nf, stride=2)\n",
|
||||
"learn = get_learner(get_model())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.973174</td>\n",
|
||||
" <td>1.845491</td>\n",
|
||||
" <td>0.373248</td>\n",
|
||||
" <td>00:08</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.678627</td>\n",
|
||||
" <td>1.778713</td>\n",
|
||||
" <td>0.439236</td>\n",
|
||||
" <td>00:08</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.386163</td>\n",
|
||||
" <td>1.596503</td>\n",
|
||||
" <td>0.507261</td>\n",
|
||||
" <td>00:08</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>1.177839</td>\n",
|
||||
" <td>1.102993</td>\n",
|
||||
" <td>0.644841</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>1.052435</td>\n",
|
||||
" <td>1.038013</td>\n",
|
||||
" <td>0.667771</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.fit_one_cycle(5, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def block(ni, nf):\n",
|
||||
" return nn.Sequential(ResBlock(ni, nf, stride=2), ResBlock(nf, nf))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.964076</td>\n",
|
||||
" <td>1.864578</td>\n",
|
||||
" <td>0.355159</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.636880</td>\n",
|
||||
" <td>1.596789</td>\n",
|
||||
" <td>0.502675</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.335378</td>\n",
|
||||
" <td>1.304472</td>\n",
|
||||
" <td>0.588535</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>1.089160</td>\n",
|
||||
" <td>1.065063</td>\n",
|
||||
" <td>0.663185</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>0.942904</td>\n",
|
||||
" <td>0.963589</td>\n",
|
||||
" <td>0.692739</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner(get_model())\n",
|
||||
"learn.fit_one_cycle(5, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### A state-of-the-art ResNet"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def _resnet_stem(*sizes):\n",
|
||||
" return [\n",
|
||||
" ConvLayer(sizes[i], sizes[i+1], 3, stride = 2 if i==0 else 1)\n",
|
||||
" for i in range(len(sizes)-1)\n",
|
||||
" ] + [nn.MaxPool2d(kernel_size=3, stride=2, padding=1)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[ConvLayer(\n",
|
||||
" (0): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
|
||||
" (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
||||
" (2): ReLU()\n",
|
||||
" ), ConvLayer(\n",
|
||||
" (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
|
||||
" (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
||||
" (2): ReLU()\n",
|
||||
" ), ConvLayer(\n",
|
||||
" (0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
|
||||
" (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
||||
" (2): ReLU()\n",
|
||||
" ), MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)]"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"_resnet_stem(3,32,32,64)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class ResNet(nn.Sequential):\n",
|
||||
" def __init__(self, n_out, layers, expansion=1):\n",
|
||||
" stem = _resnet_stem(3,32,32,64)\n",
|
||||
" self.block_szs = [64, 64, 128, 256, 512]\n",
|
||||
" for i in range(1,5): self.block_szs[i] *= expansion\n",
|
||||
" blocks = [self._make_layer(*o) for o in enumerate(layers)]\n",
|
||||
" super().__init__(*stem, *blocks,\n",
|
||||
" nn.AdaptiveAvgPool2d(1), Flatten(),\n",
|
||||
" nn.Linear(self.block_szs[-1], n_out))\n",
|
||||
" \n",
|
||||
" def _make_layer(self, idx, n_layers):\n",
|
||||
" stride = 1 if idx==0 else 2\n",
|
||||
" ch_in,ch_out = self.block_szs[idx:idx+2]\n",
|
||||
" return nn.Sequential(*[\n",
|
||||
" ResBlock(ch_in if i==0 else ch_out, ch_out, stride if i==0 else 1)\n",
|
||||
" for i in range(n_layers)\n",
|
||||
" ])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rn = ResNet(dls.c, [2,2,2,2])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.673882</td>\n",
|
||||
" <td>1.828394</td>\n",
|
||||
" <td>0.413758</td>\n",
|
||||
" <td>00:13</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.331675</td>\n",
|
||||
" <td>1.572685</td>\n",
|
||||
" <td>0.518217</td>\n",
|
||||
" <td>00:13</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.087224</td>\n",
|
||||
" <td>1.086102</td>\n",
|
||||
" <td>0.650701</td>\n",
|
||||
" <td>00:13</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.900428</td>\n",
|
||||
" <td>0.968219</td>\n",
|
||||
" <td>0.684331</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>0.760280</td>\n",
|
||||
" <td>0.782558</td>\n",
|
||||
" <td>0.757197</td>\n",
|
||||
" <td>00:12</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner(rn)\n",
|
||||
"learn.fit_one_cycle(5, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Bottleneck layers"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def _conv_block(ni,nf,stride):\n",
|
||||
" return nn.Sequential(\n",
|
||||
" ConvLayer(ni, nf//4, 1),\n",
|
||||
" ConvLayer(nf//4, nf//4, stride=stride), \n",
|
||||
" ConvLayer(nf//4, nf, 1, act_cls=None, norm_type=NormType.BatchZero))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dls = get_data(URLs.IMAGENETTE_320, presize=320, resize=224)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rn = ResNet(dls.c, [3,4,6,3], 4)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1.613448</td>\n",
|
||||
" <td>1.473355</td>\n",
|
||||
" <td>0.514140</td>\n",
|
||||
" <td>00:31</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.359604</td>\n",
|
||||
" <td>2.050794</td>\n",
|
||||
" <td>0.397452</td>\n",
|
||||
" <td>00:31</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.253112</td>\n",
|
||||
" <td>4.511735</td>\n",
|
||||
" <td>0.387006</td>\n",
|
||||
" <td>00:31</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>1.133450</td>\n",
|
||||
" <td>2.575221</td>\n",
|
||||
" <td>0.396178</td>\n",
|
||||
" <td>00:31</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>4</td>\n",
|
||||
" <td>1.054752</td>\n",
|
||||
" <td>1.264525</td>\n",
|
||||
" <td>0.613758</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>5</td>\n",
|
||||
" <td>0.927930</td>\n",
|
||||
" <td>2.670484</td>\n",
|
||||
" <td>0.422675</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>6</td>\n",
|
||||
" <td>0.838268</td>\n",
|
||||
" <td>1.724588</td>\n",
|
||||
" <td>0.528662</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>7</td>\n",
|
||||
" <td>0.748289</td>\n",
|
||||
" <td>1.180668</td>\n",
|
||||
" <td>0.666497</td>\n",
|
||||
" <td>00:31</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>8</td>\n",
|
||||
" <td>0.688637</td>\n",
|
||||
" <td>1.245039</td>\n",
|
||||
" <td>0.650446</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>9</td>\n",
|
||||
" <td>0.645530</td>\n",
|
||||
" <td>1.053691</td>\n",
|
||||
" <td>0.674904</td>\n",
|
||||
" <td>00:31</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>10</td>\n",
|
||||
" <td>0.593401</td>\n",
|
||||
" <td>1.180786</td>\n",
|
||||
" <td>0.676433</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>11</td>\n",
|
||||
" <td>0.536634</td>\n",
|
||||
" <td>0.879937</td>\n",
|
||||
" <td>0.713885</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>12</td>\n",
|
||||
" <td>0.479208</td>\n",
|
||||
" <td>0.798356</td>\n",
|
||||
" <td>0.741656</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>13</td>\n",
|
||||
" <td>0.440071</td>\n",
|
||||
" <td>0.600644</td>\n",
|
||||
" <td>0.806879</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>14</td>\n",
|
||||
" <td>0.402952</td>\n",
|
||||
" <td>0.450296</td>\n",
|
||||
" <td>0.858599</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>15</td>\n",
|
||||
" <td>0.359117</td>\n",
|
||||
" <td>0.486126</td>\n",
|
||||
" <td>0.846369</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>16</td>\n",
|
||||
" <td>0.313642</td>\n",
|
||||
" <td>0.442215</td>\n",
|
||||
" <td>0.861911</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>17</td>\n",
|
||||
" <td>0.294050</td>\n",
|
||||
" <td>0.485967</td>\n",
|
||||
" <td>0.853503</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>18</td>\n",
|
||||
" <td>0.270583</td>\n",
|
||||
" <td>0.408566</td>\n",
|
||||
" <td>0.875924</td>\n",
|
||||
" <td>00:32</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>19</td>\n",
|
||||
" <td>0.266003</td>\n",
|
||||
" <td>0.411752</td>\n",
|
||||
" <td>0.872611</td>\n",
|
||||
" <td>00:33</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner(rn)\n",
|
||||
"learn.fit_one_cycle(20, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questionnaire"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Further research"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"s"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,421 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Application architectures deep dive"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Computer vision"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### cnn_learner"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'cut': -2,\n",
|
||||
" 'split': <function fastai2.vision.learner._resnet_split(m)>,\n",
|
||||
" 'stats': ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])}"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model_meta[resnet50]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"Sequential(\n",
|
||||
" (0): AdaptiveConcatPool2d(\n",
|
||||
" (ap): AdaptiveAvgPool2d(output_size=1)\n",
|
||||
" (mp): AdaptiveMaxPool2d(output_size=1)\n",
|
||||
" )\n",
|
||||
" (1): full: False\n",
|
||||
" (2): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
||||
" (3): Dropout(p=0.25, inplace=False)\n",
|
||||
" (4): Linear(in_features=20, out_features=512, bias=False)\n",
|
||||
" (5): ReLU(inplace=True)\n",
|
||||
" (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
||||
" (7): Dropout(p=0.5, inplace=False)\n",
|
||||
" (8): Linear(in_features=512, out_features=2, bias=False)\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"create_head(20,2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### unet_learner"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### A Siamese network"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from fastai2.vision.all import *\n",
|
||||
"path = untar_data(URLs.PETS)\n",
|
||||
"files = get_image_files(path/\"images\")\n",
|
||||
"\n",
|
||||
"class SiameseImage(Tuple):\n",
|
||||
" def show(self, ctx=None, **kwargs): \n",
|
||||
" img1,img2,same_breed = self\n",
|
||||
" if not isinstance(img1, Tensor):\n",
|
||||
" if img2.size != img1.size: img2 = img2.resize(img1.size)\n",
|
||||
" t1,t2 = tensor(img1),tensor(img2)\n",
|
||||
" t1,t2 = t1.permute(2,0,1),t2.permute(2,0,1)\n",
|
||||
" else: t1,t2 = img1,img2\n",
|
||||
" line = t1.new_zeros(t1.shape[0], t1.shape[1], 10)\n",
|
||||
" return show_image(torch.cat([t1,line,t2], dim=2), \n",
|
||||
" title=same_breed, ctx=ctx)\n",
|
||||
" \n",
|
||||
"def label_func(fname):\n",
|
||||
" return re.match(r'^(.*)_\\d+.jpg$', fname.name).groups()[0]\n",
|
||||
"\n",
|
||||
"class SiameseTransform(Transform):\n",
|
||||
" def __init__(self, files, label_func, splits):\n",
|
||||
" self.labels = files.map(label_func).unique()\n",
|
||||
" self.lbl2files = {l: L(f for f in files if label_func(f) == l) for l in self.labels}\n",
|
||||
" self.label_func = label_func\n",
|
||||
" self.valid = {f: self._draw(f) for f in files[splits[1]]}\n",
|
||||
" \n",
|
||||
" def encodes(self, f):\n",
|
||||
" f2,t = self.valid.get(f, self._draw(f))\n",
|
||||
" img1,img2 = PILImage.create(f),PILImage.create(f2)\n",
|
||||
" return SiameseImage(img1, img2, t)\n",
|
||||
" \n",
|
||||
" def _draw(self, f):\n",
|
||||
" same = random.random() < 0.5\n",
|
||||
" cls = self.label_func(f)\n",
|
||||
" if not same: cls = random.choice(L(l for l in self.labels if l != cls)) \n",
|
||||
" return random.choice(self.lbl2files[cls]),same\n",
|
||||
" \n",
|
||||
"splits = RandomSplitter()(files)\n",
|
||||
"tfm = SiameseTransform(files, label_func, splits)\n",
|
||||
"tls = TfmdLists(files, tfm, splits=splits)\n",
|
||||
"dls = tls.dataloaders(after_item=[Resize(224), ToTensor], \n",
|
||||
" after_batch=[IntToFloatTensor, Normalize.from_stats(*imagenet_stats)])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class SiameseModel(Module):\n",
|
||||
" def __init__(self, encoder, head):\n",
|
||||
" self.encoder,self.head = encoder,head\n",
|
||||
" \n",
|
||||
" def forward(self, x1, x2):\n",
|
||||
" ftrs = torch.cat([self.encoder(x1), self.encoder(x2)], dim=1)\n",
|
||||
" return self.head(ftrs)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"encoder = create_body(resnet34, cut=-2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"head = create_head(512*4, 2, ps=0.5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"model = SiameseModel(encoder, head)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def loss_func(out, targ):\n",
|
||||
" return nn.CrossEntropyLoss()(out, targ.long())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def siamese_splitter(model):\n",
|
||||
" return [params(model.encoder), params(model.head)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"learn = Learner(dls, model, loss_func=loss_func, \n",
|
||||
" splitter=siamese_splitter, metrics=accuracy)\n",
|
||||
"learn.freeze()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.367015</td>\n",
|
||||
" <td>0.281242</td>\n",
|
||||
" <td>0.885656</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>0.307688</td>\n",
|
||||
" <td>0.214721</td>\n",
|
||||
" <td>0.915426</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.275221</td>\n",
|
||||
" <td>0.170615</td>\n",
|
||||
" <td>0.936401</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.223771</td>\n",
|
||||
" <td>0.159633</td>\n",
|
||||
" <td>0.943843</td>\n",
|
||||
" <td>00:26</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.fit_one_cycle(4, 3e-3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.212744</td>\n",
|
||||
" <td>0.159033</td>\n",
|
||||
" <td>0.944520</td>\n",
|
||||
" <td>00:35</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>0.201893</td>\n",
|
||||
" <td>0.159615</td>\n",
|
||||
" <td>0.942490</td>\n",
|
||||
" <td>00:35</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>0.204606</td>\n",
|
||||
" <td>0.152338</td>\n",
|
||||
" <td>0.945196</td>\n",
|
||||
" <td>00:36</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>3</td>\n",
|
||||
" <td>0.213203</td>\n",
|
||||
" <td>0.148346</td>\n",
|
||||
" <td>0.947903</td>\n",
|
||||
" <td>00:36</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.unfreeze()\n",
|
||||
"learn.fit_one_cycle(4, slice(1e-6,1e-4))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Natural language processing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Tabular"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Wrapping up architectures"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questionnaire"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Further research"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,719 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"hide_input": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# The training process"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Let's start with SGD"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def get_data(url, presize, resize):\n",
|
||||
" path = untar_data(url)\n",
|
||||
" return DataBlock(\n",
|
||||
" blocks=(ImageBlock, CategoryBlock), get_items=get_image_files, \n",
|
||||
" splitter=GrandparentSplitter(valid_name='val'),\n",
|
||||
" get_y=parent_label, item_tfms=Resize(presize),\n",
|
||||
" batch_tfms=[*aug_transforms(min_scale=0.5, size=resize),\n",
|
||||
" Normalize.from_stats(*imagenet_stats)],\n",
|
||||
" ).dataloaders(path, bs=128)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"dls = get_data(URLs.IMAGENETTE_160, 160, 128)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def get_learner(**kwargs):\n",
|
||||
" return cnn_learner(dls, resnet34, pretrained=False,\n",
|
||||
" metrics=accuracy, **kwargs).to_fp16()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>2.571932</td>\n",
|
||||
" <td>2.685040</td>\n",
|
||||
" <td>0.322548</td>\n",
|
||||
" <td>00:11</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>1.904674</td>\n",
|
||||
" <td>1.852589</td>\n",
|
||||
" <td>0.437452</td>\n",
|
||||
" <td>00:11</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.586909</td>\n",
|
||||
" <td>1.374908</td>\n",
|
||||
" <td>0.594904</td>\n",
|
||||
" <td>00:11</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner()\n",
|
||||
"learn.fit_one_cycle(3, 0.003)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"learn = get_learner(opt_func=SGD)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.017378008365631102, 3.019951861915615e-07)"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.lr_find()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>2.969412</td>\n",
|
||||
" <td>2.214596</td>\n",
|
||||
" <td>0.242038</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>2.442730</td>\n",
|
||||
" <td>1.845950</td>\n",
|
||||
" <td>0.362548</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>2.157159</td>\n",
|
||||
" <td>1.741143</td>\n",
|
||||
" <td>0.408917</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.fit_one_cycle(3, 0.03, moms=(0,0,0))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## A generic optimizer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def sgd_cb(p, lr, **kwargs): p.data.add_(-lr, p.grad.data)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"opt_func = partial(Optimizer, cbs=[sgd_step])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>2.730918</td>\n",
|
||||
" <td>2.009971</td>\n",
|
||||
" <td>0.332739</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>2.204893</td>\n",
|
||||
" <td>1.747202</td>\n",
|
||||
" <td>0.441529</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.875621</td>\n",
|
||||
" <td>1.684515</td>\n",
|
||||
" <td>0.445350</td>\n",
|
||||
" <td>00:09</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner(opt_func=opt_func)\n",
|
||||
"learn.fit(3, 0.03)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Momentum"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"hide_input": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x = np.linspace(-4, 4, 100)\n",
|
||||
"y = 1 - (x/3) ** 2\n",
|
||||
"x1 = x + np.random.randn(100) * 0.1\n",
|
||||
"y1 = y + np.random.randn(100) * 0.1\n",
|
||||
"plt.scatter(x1,y1)\n",
|
||||
"idx = x1.argsort()\n",
|
||||
"beta,avg,res = 0.7,0,[]\n",
|
||||
"for i in idx:\n",
|
||||
" avg = beta * avg + (1-beta) * y1[i]\n",
|
||||
" res.append(avg/(1-beta**(i+1)))\n",
|
||||
"plt.plot(x1[idx],np.array(res), color='red');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"hide_input": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtEAAAHiCAYAAAAuz5CZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3iTVRvH8e9pKTRllQ0tG9kgFCpDcLBBVkV8AVFBRUDEiSjgHkABxYELRMEByrSioAwBlVFZBZElG9qyocxC13n/eJKSpkm60qRp78919Wrz5El6CumvJ+c55z5Ka40QQgghhBAi83w83QAhhBBCCCG8jXSihRBCCCGEyCLpRAshhBBCCJFF0okWQgghhBAii6QTLYQQQgghRBZJJ1oIIYQQQogskk608ApKqSNKqY6ebocQQoiMSWaLgkA60SJfy60gV4ZJSqlz5o/JSinl4Ny7lVIpSqkrVh+DXN0mIYTwdnkks8fZ5HW8OcPLurpdwrsV8nQDhPBSQ4EwoAmggZXAIeBzB+fHaq0ru6ltQggh0sp0ZmutJwATLLeVUm8Ad2qtz7qlpcJryEi08Ca3KaV2K6UuKKVmKaX8AZRSPZRS25VScUqpDUqpW83HvwWqAj+bRxNeNB9foJQ6qZS6qJT6UynVMBttGQS8p7WO1lrHAO8Bg13yUwohRP7g9ZltHq1+CPg6G99T5HPSiRbeZCDQBagF1AFeUUo1A74ChgFlgOnAEqVUEa31Q8AxoKfWupjWerL5eX4FagPlgW3AHMs3UEqNMQe73Q+rtjQEdljd3mE+5kh5pdQppdRhpdT7SqmiOfh3EEIIb+DNmW1xB1ABWJTln17ke0pr7ek2CJEhpdQRIFxr/bn59j3ANGAFcFZr/arVufuAoVrrP8yPG6K1XuXgeQOBC0Cg1vpiFtqTDDTUWu81364N/Af4aJtfKqVURaA0sBeohjGisUdrPSyz308IIbyJN2e2zeO+BHy11oMz+71EwSEj0cKbHLf6+igQhNEpHWUz8lDFfF86SilfpVS4UuqgUuoScMR8V1YXjFwBSljdLgFcsRfGWuuTWuvdWusUrfVh4EWgbxa/nxBCeBuvzGyr720C7kemcggHpBMtvEkVq6+rArEYIT1eax1o9RGgtf7efJ5tQD4A9AY6AiWB6ubjCuyuyk7zYfU8uzAWqFg0MR/LDG35fkIIkY95e2b3Ac4DazPzw4qCRzrRwps8qZSqrJQqDYwD5gFfAMOVUi2VoahSqrtSqrj5MaeAmlbPURy4AZwDArBagQ3GqmzzXDy7H1anfgM8r5QKVkoFAaOA2fYarYwSd1XN7asChAM/5fQfQwgh8jivzGwrg4BvnI1Wi4JNOtHCm8zFmE93yPzxjtZ6C/A48DHGPLkDpF1xPRFjMUucUuoFjCA9CsQAu4HIbLZlOvAzsBP4F1hqPgaAeRTkDvPNZsBG4CqwwXz+09n8vkII4S28NbNRSgUD7c3fXwi7ZGGhEEIIIYQQWSQj0UIIIYQQQmSRdKKFEEIIIYTIIpd0opVSXymlTiul/nVw/0Cl1D/mjw1KqSZW9x1RSu1Uxu5FW1zRHiGEEI5JZgshRM65aiR6NtDVyf2Hgbu01rcCbwMzbO5vp7VuqrUOdVF7hBBCODYbyWwhhMiRQq54Eq31n0qp6k7u32B1MxKo7IrvK4QQIusks4UQIudc0onOoseAX61ua2CFUkoD07XWtiMe6ZQtW1ZXr149l5onhBC5Z+vWrWe11uU83Y4skMwWQhRYzjLbrZ1opVQ7jEBua3W4jdY6VilVHliplNqrtf7TzmOHAkMBqlatypYtMhVPCOF9lFJHPd2GzJLMFkIUdM4y223VOZRStwIzgd5a63OW41rrWPPn08CPQAt7j9daz9Bah2qtQ8uV86ZBHCGE8D6S2UII4ZxbOtFKqarAYuAhrfV/VseLWrb6VEoVBTpj7CQkhBDCQySzhRAiYy6ZzqGU+h64GyirlIoGXgf8ALTWnwOvAWWAT5VSAEnmVd0VgB/NxwoBc7XWv7miTUIIIeyTzBZCiJxzVXWOARncPwQYYuf4IaBJ+kcIIYTILZLZQgiRc7JjoRBCCCGEEFnkiRJ3QniViKgYpizfR2xcPEGBJkZ3qUtYSLCnmyWEEMIOyWzhLtKJFsKJiKgYxi7eSXxiMgAxcfGMXbwTQEJZCCHyGMls4U4ynUMIJ6Ys35caxhbxiclMWb7PQy0SQgjhiGS2cCfpRAvhRGxcfJaOCyGE8BzJbOFO0okWwomgQFOWjgshhPAcyWzhTtKJFsKJ0V3qYvLzTXPM5OfL6C51PdQiIYQQjkhmC3eShYVCOGFZiOJopbesAhdCiLxDMlu4k3SihchAWEiw3ZCVVeBCCJH3SGYLd5FOtBDZ5GwVeFYCWUZGhBAi90lmC1eTTrQQ2eSKVeAyMiKEEO4hmS1cTRYWigIpIiqGNuGrqTFmKW3CVxMRFeP8AbNmwe7daQ65YhW41DQVQojMyXJu25DMFq4mnWhR4FhGEmLi4tHcHElwGMjR0fDoo9CkCbzwAly6BLhmFbjUNBVCiIxlObftkMwWruaSTrRS6iul1Gml1L8O7ldKqY+UUgeUUv8opZpZ3TdIKbXf/DHIFe0RBVdmRiqyPJKQmGh8rlcPpk41Ps+ZQ1jTICb2aUxwoAkFBAeamNincZYu6UlNU+EJktkir8js6LIrRoDDQoIls4VLuWpO9GzgY+AbB/d3A2qbP1oCnwEtlVKlgdeBUEADW5VSS7TWF1zULlGAZHauWpZHErQ2Pr/wAtSvD08+CQ8+CNOnE/bxx4SNaZ/tNo/uUjdNm0Fqmgq3mI1ktvCwrMwvdtUIsKPKHZklmS2suWQkWmv9J3DeySm9gW+0IRIIVEpVAroAK7XW580hvBLo6oo2iYInsyMVWR5JSEkxPvv4QIsW8PffMGOGMUe6SRMoXhyWLs1Wm10xMiJEVklmi7wgK6PLWc7t8eNhwAB45x1YvBj27YOkpBy3WTJbWHNXdY5g4LjV7WjzMUfHhXDKXomhzI5U2BtJUBijIG3CV6crV7Ry1wk6Ac/N38GmmGDj/scfZ1Xp2nTs2w6uXCGpVy92vhxOyFujM91ey/fI6ciIELlAMlu4VE4yG7KW2xFRMbSe8iGBV+Io8sMPqecn+xXmcJlg9pUMJrJZO0Kfe4zet1XLUpsteS2ZLcB9nWhl55h2cjz9Eyg1FBgKULVqVde1TOR5tkHWrl45Fm2NSXcJMDDAjwvXEtM93nakwnpHq5i4eBQ3X3S2lxMjomKYvnwfnYBkpVLv33L0PKs2nqGj+XG7ytci5O0X2XsylnrTp4JSqW1/Y8ku4uJvtismLp7n5m1ny9HzvBPW2DhomTKi7P1KCOF2ktkiR6xzu6TJj6sJSSQmGy+VrGY2ZD63AcYu3sma5GQWN2zHWx2G0vBiDP2LXSZu83aGbFzILScP033fOmKXfs6/gx+n0RsvQKlSadpt73uky21R4LmrOkc0UMXqdmUg1snxdLTWM7TWoVrr0HLlyuVaQ0XeYm9F9pzIY3YvAWptzE2rcPksShtTMBzNVQsLCWb9mPYEB5rS9QCsLydOWb6PhETLJUCVev/3fx/nrCqc+pgH+o9nfuOO1PviA3jsMThwgF9XbeeNeVuIu5aQ7vtrYE7ksZuLaEaMgHbtICH9uUJ4gGS2yDbb3I6LT0ztQFtYZ7Y1Z/OLM5PblikiPlqjlQ/xhf3ZUq4WLwWE8M6dg1PP/7RVXw6XqkSjjyZA5crQtSvH7+nDpWFP0veXL6l17ni675Eut0WB565O9BLgYfOK71bARa31CWA50FkpVUopVQrobD4mCoDsVtKwO+wFXIxPZFqzANZNH8KgbUszNVct9sI1msTuY8yar5iy9APKXI0zjpsvJ549e4mmsf+l+77JWpPke/NCztUiAbzY7Rk+aDPAqClduzbdOoWwfVIY/717L712/wGAb0oyQZdOpz7flOX74MQJmDkT/vgD3n7b2T+ZEO4imS3SyUklDXsuxidma36xs2kglvt8dArJPje7OMk67V+OL0PDGNh/Avc88pExd/r8eXz+jiTsn1U8t34usxa8gU+K8TOUvnYx9XGpuR0ZCcOHQ4x0qAsyl0znUEp9D9wNlFVKRWOs3vYD0Fp/DiwD7gEOANeAR8z3nVdKvQ1sNj/VW1prZ4tdRD6R00oaALecPUbn/ZEsq9uGI6WDCQo00fG3OZCcxBtHV/PGi58aiwEdWbWKDTOGUCnuFAk+hdBKERK7l6d7vUiby8ehz5dELf2VgITrXPXz51Dpm+3yVSpdKKMUszsNZk/j1hQ7fpiAhHiKJcTz8NZfCNu1hmV12zBj8TvceXgbYQ9P5d+Ktxg/31dfGQteOneGCROgRw9o2TIb/6pCZI5ktsgqV1TSsBUUaDLmF9csBgEB4OeX6cedPXuRRicPsLdcda4WCQCgnl8CdU4coOLB3RRLiCfFanqcJbM/at2PfjtXcq5ooNHWanVpU6QhsWXvRZsLLXXdt57PIyYybNNiWh/9hzuPRPF5y/sIv2swKEXKsePQazScOQPz58Pnn8P//peptov8RWnbjoAXCA0N1Vu2bPF0M0QOhLy1wu5cuOBAE+utSsa1CV9NjINAfmf5Jzy4/VcAIqs04tfG7Ri3/HPOlihL8IUTsGIFdOpkvwF//QVdunCpUhUmNOzBspotqHvmCF8tfJPiCcb3iy9fkZN3dGRSodqsDW7IdT9/wLjceF/zYBZtjWHPO90AqP7SL/j5KFCku2z5+qrp9N+xgpm3hfHUxnlcLmziaKkgej88laBAE39NHwK1a8OiRXDrreDvD1FRxh8VnC9KFN5HKbVVax3q6Xa4k2S298tsZoPz3LYW4OeD3+VLrJw1Er8qwZTatCE19+zSGtau5egH0ym9/GeK37jGDV8/tgXXo0rLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 864x576 with 4 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x = np.linspace(-4, 4, 100)\n",
|
||||
"y = 1 - (x/3) ** 2\n",
|
||||
"x1 = x + np.random.randn(100) * 0.1\n",
|
||||
"y1 = y + np.random.randn(100) * 0.1\n",
|
||||
"_,axs = plt.subplots(2,2, figsize=(12,8))\n",
|
||||
"betas = [0.5,0.7,0.9,0.99]\n",
|
||||
"idx = x1.argsort()\n",
|
||||
"for beta,ax in zip(betas, axs.flatten()):\n",
|
||||
" ax.scatter(x1,y1)\n",
|
||||
" avg,res = 0,[]\n",
|
||||
" for i in idx:\n",
|
||||
" avg = beta * avg + (1-beta) * y1[i]\n",
|
||||
" res.append(avg)#/(1-beta**(i+1)))\n",
|
||||
" ax.plot(x1[idx],np.array(res), color='red');\n",
|
||||
" ax.set_title(f'beta={beta}')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def average_grad(p, mom, grad_avg=None, **kwargs):\n",
|
||||
" if grad_avg is None: grad_avg = torch.zeros_like(p.grad.data)\n",
|
||||
" return {'grad_avg': grad_avg*mom + p.grad.data}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def momentum_step(p, lr, grad_avg, **kwargs): p.data.add_(-lr, grad_avg)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"opt_func = partial(Optimizer, cbs=[average_grad,momentum_step], mom=0.9)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>2.856000</td>\n",
|
||||
" <td>2.493429</td>\n",
|
||||
" <td>0.246115</td>\n",
|
||||
" <td>00:10</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>2.504205</td>\n",
|
||||
" <td>2.463813</td>\n",
|
||||
" <td>0.348280</td>\n",
|
||||
" <td>00:10</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>2.187387</td>\n",
|
||||
" <td>1.755670</td>\n",
|
||||
" <td>0.418853</td>\n",
|
||||
" <td>00:10</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner(opt_func=opt_func)\n",
|
||||
"learn.fit_one_cycle(3, 0.03)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAt0AAAD4CAYAAAAwyVpeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3yV9fn/8deVTfYkjEz2JpAQQETcolVRBAGto9pqtWqdraNaZx1UqbXan7TiqBNwoYI4EBVkJIywAyEJJKwkZJKdnM/vjxz8pjRAgJzcZ1zPx+M8PLnPfd95H4STK/d9fT4fMcaglFJKKaWUchwvqwMopZRSSinl7rToVkoppZRSysG06FZKKaWUUsrBtOhWSimllFLKwbToVkoppZRSysF8rA7QGaKjo01SUpLVMZRS6oStWbOmxBgTY3WOzqSf2UopV3Wsz2yPKLqTkpLIzMy0OoZSSp0wEdlldYbOpp/ZSilXdazPbG0vUUoppZRSysG06FZKKaWUUsrBtOhWSimllFLKwbToVkoppZRSysG06FZKKaWUUsrBHFp0i8hEEckWkRwRub+N1/1F5AP766tEJMm+PV1E1tsfWSJyeXvPqZRSSimllLNxWNEtIt7Ay8CFwCBghogMOmK3G4EyY0wfYBbwrH37JiDNGJMCTAReFRGfdp5TKaWUUkopp+LIebrTgRxjTC6AiLwPTAK2tNpnEvCo/fl84B8iIsaYmlb7BADmBM6pOlh9UzMrc0vJ3l9JTUMzgX7eBPn7EOzvQ3igHwmRgfQM74Kfj3YrKaWsMevr7UQG+TEsLoyU+HBExOpISikXUVHTyP7KOg5U1lFUVU9pdT01Dc3MSE8gNjSgw76PI4vunkBBq68LgdFH28cY0yQiFUAUUCIio4E5QCJwjf319pwTABG5CbgJICEh4dTfjQdqthneWbWLv32zg9LqhmPu6yXQPawL/buFMCI+nBEJEQyPDyMkwLeT0iqlPFVjs43ZP+RS29gMwIBuITx66WDG9IqyOJlSytkUVdWxMreUzXsr2LK3kq37qig5VN/mvuP7xrhM0d3WZQbT3n2MMauAwSIyEHhTRBa185zYj58NzAZIS0trcx91dBW1jdz5/jq+yy5mbK8ofnNGMqmJkQT7+1Db2Ex1fRPV9U2UHGpgd2kNuw9Ws6u0hs17K1myrQgAEUiJD+fcgbGcNyiWvl2D9eqTUqrD+Xp7seXxCyiuqmfJtiJeXprD9Nkruff8fvzurD76uaOUB2tqtrEi9yDfZxezLKeEbfurAPDz9qJvbDBn9o+hf2wI3cMDiA0NoGuIP5FBfnTx9cbHu2Pv4Duy6C4E4lt9HQfsPco+hSLiA4QBpa13MMZsFZFqYEg7z6lOUWVdI9e8toqt+yp54rIh/HJ0wn/90Aq2t5YA9IqB9OTI/zq+oraRrIJyMneVsTS7iJmLs5m5OJuEyEAuS+nB1LR44iMDO/U9KaXcm4jQNTSA6ekJXJrSg4c+3sRfv9pOVV0TD1w00Op4SqlOZIxh7e5yFqzfwxcb91FyqAE/Hy9GJUXwx4kDOL1PNAO6h+DbwUX18Tiy6M4A+opIMrAHmA5cdcQ+C4DrgBXAFGCJMcbYjymwt5QkAv2BfKC8HedUp6Cx2cZNb2WyZW8lr16TyjkDY0/4HGFdfDmjXwxn9Ivh7vP6caCyjm+3FrFo0z5e+i6Hl77LYVzvaKaNimfikG6d/pdeKeXeAv18eOHK4YQE+PDqD7l0Dwvg+nHJVsdSSjlYdX0TH64t5I3l+eSWVOPv48W5A2O5ZHgPJvSLoYuft6X5HFZ02wvm24DFgDcwxxizWUQeBzKNMQuA14D/iEgOLVe4p9sPPx24X0QaARtwqzGmBKCtczrqPXiiZxdtY2VuKS9cOfykCu62xIYGcNXoBK4ancCe8lrmZRYwL7OQ299bR1xEF246oxdTU+Mt/8eglHIfIsKfLxnMvoo6nvhiK8PiwxmZEGF1LKWUA+wtr+X15Xm8n1FAVV0Tw+PDmTllGBOHdHOqsWVijPu3O6elpZnMzEyrYzi9H7YXc+2c1Vw3NpHHJg1x6Pey2Qzfbivin0tzWLu7nKggP244PZkbxiVr8a1UKyKyxhiTZnWOztSRn9mVdY1c9OKPiMCXvz+DIH9H3uBVSnWmoso6Xlm6k3dX7abZGC4c0o0bTk+29BfsY31m66ePAqCqrpH7P9xA75igTul/9PISzhsUy7kDu5KRX8YrS3OYuTibt1bkc/d5/ZiSGo+3lw5+UkqdmtAAX2ZNS2Hq/1vB377ZzkO/0KUdlHJ1FTWNvLI0hzdX5NPYbJiaGsdtZ/chLsK5x4tp0a0AeGlJDvsq65j/29MI8O28K80iQnpyJOnJ6WTkl/KXhVv544cbmbMsn4d+MZAz+sV0WhallHsalRTJ9FHxzFmezxWpcQzoFmp1JKXUSbDZDHMzC3hucTZlNQ1cltKT35/Tl6ToIKujtYuOYFPklVTz+vI8poyMIzXRulsyo5Ii+eiW03jl6pHUNTVz7ZzV3PHeOoqr2p4/Uyml2uuPEwcQ7O/D0wu3WR1FKXUSsgrKufyV5dz/0UZ6xwTxxe3jmTUtxWUKbtCiWwEzF2/Dz9uL+yb2tzoKIsJFQ7vz1V1ncOe5ffly037OeX4p76/ejc3m/uMPlFKOERHkx61n9ub77cX8tLPE6jhKqXaqa2zmic+3cNkry9lbUcesacOZe/NYBvVwvTtWWnR7uM17K1i4cT83np5M15COW3XpVPn7eHPnuf1Y+PvxDOweyv0fbeSaOavYV1FrdTSllIu67rQkuocF8PxX2/GESQSUcnVrd5dx0Ys/8tqyPK5KT2DJPRO4fEScyy54pUW3h/vbNzsIDfDhxvG9rI7Spj5dg3n/pjE8PXko63aXM/FvP/LFhn1Wx1JKuaAAX29+O6E3a3aVsTqv9PgHKKUs0dBk45lF25jyz5+ob7Lx9o2jeeryoU41/d/J0KLbg+UWH+LrLQe4flwyYV2c9y+yiDAjPYGFd4wnOTqI3727lrvnrudQfZPV0ZRSLmbaqHiig/34x3c5VkdRSrWhoLSGqa+u4P99v5Mr0+L58s7xnN432upYHUKLbg/2+vJ8/Ly9uGZMotVR2iUpOoh5vx3L78/pyyfr9nDpP5ax40CV1bGUUi4kwNebX41L5scdJeQU6eeHUs7kq837+cXffyS36BCvXD2SZ64Y5vJXt1vTottDVdQ0Mn9NIZem9CAmxN/qOO3m6+3FXef1451fj6GytpFJLy/ns6y9VsdSSrmQaaPi8fP24u2Vu62OopQCmpptPPn5Fm76zxoSo4L4/I7TuWhod6tjdTgtuj3Uexm7qW1s5oZxyVZHOSlje0fx+e0tgyxvf28dj3+2haZmm9WxlFIuIDrYnwuHduPDNYXUNGibmlJWqqhp5FdvZPDvZXlcOzaR+beMJTHKdaYBPBFadHugxmYbb/6Uz9heUS455c5h3cICeO83Y7j+tCTmLM/jV29kUFnXaHUspZQLuGZMIlX1TXy6Xu+UKWWVnKIqJr28jJW5B3nuimE8PmkI/j6dt0BfZ9Oi2wN9veUA+yrquPF017zK3ZqfjxePXjqYZyYPZcXOg1zxyk8UlNZYHUsptyIiE0UkW0RyROT+Nl5PFJFvRWSDiCwVkbgjXg8VkT0i8o/OS31sqYkRDOgWwn9W7NLpA5WywNLsIi5/+ScO1Tfx3m/GcOWoeKsjOZwW3R5oXmYB3cMCOGtAV6ujdJjp6Qm8dUM6ByrruPyV5azdXWZ1JKXcgoh4Ay8DFwKDgBkiMuiI3f4KvGWMGQY8Djx9xOtPAN87OuuJEBF+OSaRLfsqWVdQbnUcpTzK3IwCbnwzk/jIQD697XTSkiKtjtQptOj2MEWVdXy/vZjJI3vi7eWak8sfzWl9ovno1nEE+fswY/ZKvtlywOpISrmDdCDHGJNrjGkA3gcmHbHPIOBb+/PvWr8uIqlALPBVJ2Q9IZeN6EmgnzdzMwqsjqKURzDG8OI3O/jDhxs4rXcUc387lp7hXayO1Wm06PYwn6zfg83A5JFxx9/ZBfXpGszHt45jQLcQbn57DR+uKbQ6klKurifQuiottG9rLQu4wv78ciBERKJExAt4HrjveN9ERG4SkUwRySwuLu6A2McX7O/DBYO7sWjTfuqbmjvleyrlqZqabTz48UZmfbOdySN7Muf6UQT7+1gdq1Np0e1BjDHMX1PIyIRwescEWx3HYSKD/HjnN2MY0yuSe+Zl8e8fc62OpJQra+uW2JFN0PcCE0RkHTAB2AM0AbcCC40xx72UbIyZbYxJM8akxcTEnGrmdrs0pQcVtY18n905hb5SnqihycZt767jvdUF3HZWH56fOhxfb88rQT3vHXuwjXsq2H7gEFNS3X+wQrC/D3OuH8VFQ7vx5Bdbmbl4mw6WUurkFAKtPzTigP+a8sMYs9cYM9kYMwJ4yL6tAhgL3CYi+bT0fV8rIs90Sup2Or1PNJFBfnyq8/0r5RB1jc3c9J9Mvty8n0cuHsS9F/RHxL3aW9vLs67re7gP1xTi5+PFL4a534TzbfH38ealGSMJ67KJl7/bSWOz4YELB3jsP3alTlIG0FdEkmm5gj0duKr1DiISDZQaY2zAA8AcAGPM1a32uR5IM8b8z+wnVvL19uIXQ7szN7OAQ/VNHne7WylHqq5v4tdvZrIy7yBPTx7KjPQEqyNZSq90e4jGZhsLsvZy/qBYwrq4z5Kqx+PtJfzl8iFcNzaR2T/k8sTnW/WKt1InwBjTBNwGLAa2AnONMZtF5HERudS+25lAtohsp2XQ5FOWhD1Jl43oQX2Tja8277c6ilJuo7KukWteW8Xq/FJmXZni8QU36JVuj7Eqt5SymkYuHd7D6iidTkR49NLBeHkJc5bn0Wyz8eilg/WKt1LtZIxZCCw8YtsjrZ7PB+YLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 864x288 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn.recorder.plot_sched()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## RMSProp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def average_sqr_grad(p, sqr_mom, sqr_avg=None, **kwargs):\n",
|
||||
" if sqr_avg is None: sqr_avg = torch.zeros_like(p.grad.data)\n",
|
||||
" return {'sqr_avg': sqr_avg*sqr_mom + p.grad.data**2}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def rms_prop_step(p, lr, sqr_avg, eps, grad_avg=None, **kwargs):\n",
|
||||
" denom = sqr_avg.sqrt().add_(eps)\n",
|
||||
" p.data.addcdiv_(-lr, p.grad, denom)\n",
|
||||
"\n",
|
||||
"opt_func = partial(Optimizer, cbs=[average_sqr_grad,rms_prop_step],\n",
|
||||
" sqr_mom=0.99, eps=1e-7)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>accuracy</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>2.766912</td>\n",
|
||||
" <td>1.845900</td>\n",
|
||||
" <td>0.402548</td>\n",
|
||||
" <td>00:11</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>2.194586</td>\n",
|
||||
" <td>1.510269</td>\n",
|
||||
" <td>0.504459</td>\n",
|
||||
" <td>00:11</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <td>2</td>\n",
|
||||
" <td>1.869099</td>\n",
|
||||
" <td>1.447939</td>\n",
|
||||
" <td>0.544968</td>\n",
|
||||
" <td>00:11</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"learn = get_learner(opt_func=opt_func)\n",
|
||||
"learn.fit_one_cycle(3, 0.003)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Adam"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Decoupled weight_decay"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Callbacks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Creating a callback"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class ModelReseter(Callback):\n",
|
||||
" def begin_train(self): self.model.reset()\n",
|
||||
" def begin_validate(self): self.model.reset()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class RNNRegularizer(Callback):\n",
|
||||
" def __init__(self, alpha=0., beta=0.): self.alpha,self.beta = alpha,beta\n",
|
||||
"\n",
|
||||
" def after_pred(self):\n",
|
||||
" self.raw_out,self.out = self.pred[1],self.pred[2]\n",
|
||||
" self.learn.pred = self.pred[0]\n",
|
||||
"\n",
|
||||
" def after_loss(self):\n",
|
||||
" if not self.training: return\n",
|
||||
" if self.alpha != 0.:\n",
|
||||
" self.learn.loss += self.alpha * self.out[-1].float().pow(2).mean()\n",
|
||||
" if self.beta != 0.:\n",
|
||||
" h = self.raw_out[-1]\n",
|
||||
" if len(h)>1:\n",
|
||||
" self.learn.loss += self.beta * (h[:,1:] - h[:,:-1]\n",
|
||||
" ).float().pow(2).mean()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Callback ordering and exceptions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class TerminateOnNaNCallback(Callback):\n",
|
||||
" run_before=Recorder\n",
|
||||
" def after_batch(self):\n",
|
||||
" if torch.isinf(self.loss) or torch.isnan(self.loss):\n",
|
||||
" raise CancelFitException"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questionnaire"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Further research"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Foundations of Deep Learning: Wrap up"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,462 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"hide_input": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# CNN interpretation with CAM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## CAM and hooks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>error_rate</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.181760</td>\n",
|
||||
" <td>0.032238</td>\n",
|
||||
" <td>0.009472</td>\n",
|
||||
" <td>00:14</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: left;\">\n",
|
||||
" <th>epoch</th>\n",
|
||||
" <th>train_loss</th>\n",
|
||||
" <th>valid_loss</th>\n",
|
||||
" <th>error_rate</th>\n",
|
||||
" <th>time</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0.059119</td>\n",
|
||||
" <td>0.014090</td>\n",
|
||||
" <td>0.002706</td>\n",
|
||||
" <td>00:18</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"path = untar_data(URLs.PETS)/'images'\n",
|
||||
"def is_cat(x): return x[0].isupper()\n",
|
||||
"dls = ImageDataLoaders.from_name_func(\n",
|
||||
" path, get_image_files(path), valid_pct=0.2, seed=42,\n",
|
||||
" label_func=is_cat, item_tfms=Resize(224))\n",
|
||||
"learn = cnn_learner(dls, resnet34, metrics=error_rate)\n",
|
||||
"learn.fine_tune(1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"img = PILImage.create('images/chapter1_cat_example.jpg')\n",
|
||||
"x, = first(dls.test_dl([img]))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Hook():\n",
|
||||
" def hook_func(self, m, i, o): self.stored = o.detach().clone()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"hook_output = Hook()\n",
|
||||
"hook = learn.model[0].register_forward_hook(hook_output.hook_func)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"with torch.no_grad(): output = learn.model.eval()(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"act = hook_output.stored[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([[2.7374e-09, 1.0000e+00]], device='cuda:5')"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"F.softmax(output, dim=-1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(#2) [False,True]"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"dls.vocab"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"torch.Size([1, 3, 224, 224])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"torch.Size([2, 7, 7])"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"cam_map = torch.einsum('ck,kij->cij', learn.model[1][-1].weight, act)\n",
|
||||
"cam_map.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"x_dec = TensorImage(dls.train.decode((x,))[0][0])\n",
|
||||
"_,ax = plt.subplots()\n",
|
||||
"x_dec.show(ctx=ax)\n",
|
||||
"ax.imshow(cam_map[0].detach().cpu(), alpha=0.6, extent=(0,224,224,0),\n",
|
||||
" interpolation='bilinear', cmap='magma');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"hook.remove()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Hook():\n",
|
||||
" def __init__(self, m):\n",
|
||||
" self.hook = m.register_forward_hook(self.hook_func) \n",
|
||||
" def hook_func(self, m, i, o): self.stored = o.detach().clone()\n",
|
||||
" def __enter__(self, *args): return self\n",
|
||||
" def __exit__(self, *args): self.hook.remove()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"with Hook(learn.model[0]) as hook:\n",
|
||||
" with torch.no_grad(): output = learn.model.eval()(x.cuda())\n",
|
||||
" act = hook.stored"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Gradient CAM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class HookBwd():\n",
|
||||
" def __init__(self, m):\n",
|
||||
" self.hook = m.register_backward_hook(self.hook_func) \n",
|
||||
" def hook_func(self, m, gi, go): self.stored = go[0].detach().clone()\n",
|
||||
" def __enter__(self, *args): return self\n",
|
||||
" def __exit__(self, *args): self.hook.remove()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"cls = 1\n",
|
||||
"with HookBwd(learn.model[0]) as hookg:\n",
|
||||
" with Hook(learn.model[0]) as hook:\n",
|
||||
" output = learn.model.eval()(x.cuda())\n",
|
||||
" act = hook.stored\n",
|
||||
" output[0,cls].backward()\n",
|
||||
" grad = hookg.stored"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"w = grad[0].mean(dim=[1,2], keepdim=True)\n",
|
||||
"cam_map = (w * act[0]).sum(0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"_,ax = plt.subplots()\n",
|
||||
"x_dec.show(ctx=ax)\n",
|
||||
"ax.imshow(cam_map.detach().cpu(), alpha=0.6, extent=(0,224,224,0),\n",
|
||||
" interpolation='bilinear', cmap='magma');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"with HookBwd(learn.model[0][-2]) as hookg:\n",
|
||||
" with Hook(learn.model[0][-2]) as hook:\n",
|
||||
" output = learn.model.eval()(x.cuda())\n",
|
||||
" act = hook.stored\n",
|
||||
" output[0,cls].backward()\n",
|
||||
" grad = hookg.stored"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"w = grad[0].mean(dim=[1,2], keepdim=True)\n",
|
||||
"cam_map = (w * act[0]).sum(0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"_,ax = plt.subplots()\n",
|
||||
"x_dec.show(ctx=ax)\n",
|
||||
"ax.imshow(cam_map.detach().cpu(), alpha=0.6, extent=(0,224,224,0),\n",
|
||||
" interpolation='bilinear', cmap='magma');"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Questionnaire"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Further research"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Concluding thoughts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#hide\n",
|
||||
"from utils import *\n",
|
||||
"from fastai2.vision.widgets import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Creating a blog"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Blogging with GitHub Pages"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Creating the repository"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Setting up your homepage"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Creating posts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Synchronizing GitHub and your computer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Jupyter for blogging"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Appendix: Jupyter notebook 101"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Introduction"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"2"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"1+1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Writing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"1.5"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"3/2"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Modes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Other Important Considerations"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Markdown formatting\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Italics, Bold, Strikethrough, Inline, Blockquotes and Links"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Headings"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Lists"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Code Capabilities"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Import necessary libraries\n",
|
||||
"from fastai2.vision.all import * \n",
|
||||
"import matplotlib.pyplot as plt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from PIL import Image"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(1, 2, 4, 8)"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"a = 1\n",
|
||||
"b = a + 1\n",
|
||||
"c = b + a + 1\n",
|
||||
"d = c + b + a + 1\n",
|
||||
"a, b, c ,d"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plt.plot([a,b,c,d])\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=394x500 at 0x7F689F7B16D0>"
|
||||
]
|
||||
},
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"Image.open('images/chapter1_cat_example.jpg')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Running the app locally"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Creating a notebook"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Shortcuts and tricks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Command Mode Shortcuts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Cell Tricks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Line Magics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"56.1 µs ± 592 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%timeit [i+1 for i in range(1000)]"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"jupytext": {
|
||||
"split_at_heading": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
../images
|
||||
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 808 B After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 664 B After Width: | Height: | Size: 884 B |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 808 B After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 664 B After Width: | Height: | Size: 884 B |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 444 KiB After Width: | Height: | Size: 685 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 585 KiB After Width: | Height: | Size: 819 KiB |
|
Before Width: | Height: | Size: 623 KiB After Width: | Height: | Size: 911 KiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 471 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 295 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 161 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 194 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 177 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 653 KiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 83 KiB |