diff --git a/week06/hw/AndrosovDima.ipynb b/week06/hw/AndrosovDima.ipynb
new file mode 100644
index 0000000..b1956ab
--- /dev/null
+++ b/week06/hw/AndrosovDima.ipynb
@@ -0,0 +1,7433 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "name": "Androsov_spotter_hw.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ },
+ "widgets": {
+ "application/vnd.jupyter.widget-state+json": {
+ "a1ee52b11ea94aee991a15afba908231": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_f46d48961a9d4c62b598f9d7ce7fa064",
+ "IPY_MODEL_12b3bd3ca01e4706b572e10800888247",
+ "IPY_MODEL_c7587af96b5d4dbab8f11b9ca1c39511"
+ ],
+ "layout": "IPY_MODEL_4f9021b2600646c4af9651abf7c100be"
+ }
+ },
+ "f46d48961a9d4c62b598f9d7ce7fa064": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_ab4b611801a140259a5132207a8fffd3",
+ "placeholder": "",
+ "style": "IPY_MODEL_03f49df15c4541b2af1d7fa006e9a93a",
+ "value": "100%"
+ }
+ },
+ "12b3bd3ca01e4706b572e10800888247": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_8eff2693027641c4875701a38d648850",
+ "max": 50,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_84f6360721d74d868a57f1a623e3e058",
+ "value": 50
+ }
+ },
+ "c7587af96b5d4dbab8f11b9ca1c39511": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_34b1cdcf58f84d798ba8173c1b0a71e0",
+ "placeholder": "",
+ "style": "IPY_MODEL_20a9ea5506ef4cb9bf29e5fdef5fd464",
+ "value": " 50/50 [02:32<00:00, 3.08s/it]"
+ }
+ },
+ "4f9021b2600646c4af9651abf7c100be": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "ab4b611801a140259a5132207a8fffd3": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "03f49df15c4541b2af1d7fa006e9a93a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "8eff2693027641c4875701a38d648850": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "84f6360721d74d868a57f1a623e3e058": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "34b1cdcf58f84d798ba8173c1b0a71e0": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "20a9ea5506ef4cb9bf29e5fdef5fd464": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "a19f44b643f4454b98daca4e42b10b7c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_a93352ea51c94fc99d7c5d5fe023aee6",
+ "IPY_MODEL_c6c0731a16a24781afd7faf17a3bff6c",
+ "IPY_MODEL_6c55603e66da4785a30280960a72a20a"
+ ],
+ "layout": "IPY_MODEL_4a313d8bc4e94b75952f528389045170"
+ }
+ },
+ "a93352ea51c94fc99d7c5d5fe023aee6": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_4ff688d03c6048d7a19310fb40d21ca8",
+ "placeholder": "",
+ "style": "IPY_MODEL_0cad72e2ac37421baa14b1ef3f7b58d4",
+ "value": "100%"
+ }
+ },
+ "c6c0731a16a24781afd7faf17a3bff6c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_6090a61df15e4ec0b1de4971cd807560",
+ "max": 30,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_078a2e7bcdd54661b16547c296804b63",
+ "value": 30
+ }
+ },
+ "6c55603e66da4785a30280960a72a20a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_e7a135a45cd84ab3b1a19aaeca6a205b",
+ "placeholder": "",
+ "style": "IPY_MODEL_4470a2c5172049f08761dac43282b8c5",
+ "value": " 30/30 [10:45<00:00, 21.58s/it]"
+ }
+ },
+ "4a313d8bc4e94b75952f528389045170": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "4ff688d03c6048d7a19310fb40d21ca8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "0cad72e2ac37421baa14b1ef3f7b58d4": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "6090a61df15e4ec0b1de4971cd807560": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "078a2e7bcdd54661b16547c296804b63": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "e7a135a45cd84ab3b1a19aaeca6a205b": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "4470a2c5172049f08761dac43282b8c5": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "d28e8506bc59439787c25b97321a0df0": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_8b1886d6e6414261b0371af50d244439",
+ "IPY_MODEL_6a3b6b91968c450c81ace2a09f451ffe",
+ "IPY_MODEL_6b38964b8f944e7695ecdcee0c99d154"
+ ],
+ "layout": "IPY_MODEL_a32360353170435ba7e6b2767d56030e"
+ }
+ },
+ "8b1886d6e6414261b0371af50d244439": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_79d48fca8d5342748d473916a37b2dbc",
+ "placeholder": "",
+ "style": "IPY_MODEL_cbef124fabce4e73a6c04b5a2db59e27",
+ "value": "100%"
+ }
+ },
+ "6a3b6b91968c450c81ace2a09f451ffe": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_557f128b4b224ce39250bca72132576a",
+ "max": 15,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_ea2364e82e0d4e4a8bb42a8fcc1c5e3b",
+ "value": 15
+ }
+ },
+ "6b38964b8f944e7695ecdcee0c99d154": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_a09a3bac2f5d42f1bcce54750215b7f5",
+ "placeholder": "",
+ "style": "IPY_MODEL_9d450cb2265141929d7aafff252ceec9",
+ "value": " 15/15 [39:24<00:00, 157.43s/it]"
+ }
+ },
+ "a32360353170435ba7e6b2767d56030e": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "79d48fca8d5342748d473916a37b2dbc": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "cbef124fabce4e73a6c04b5a2db59e27": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "557f128b4b224ce39250bca72132576a": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "ea2364e82e0d4e4a8bb42a8fcc1c5e3b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "a09a3bac2f5d42f1bcce54750215b7f5": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "9d450cb2265141929d7aafff252ceec9": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "873b4d4a07234ff5ad29864bd925e0c3": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_c1deb5815a0447248582e3484cb04635",
+ "IPY_MODEL_01d76f7002b24bb3acf8f0081e65cb48",
+ "IPY_MODEL_7b7da43ad0554ef5b15d676c21ad866e"
+ ],
+ "layout": "IPY_MODEL_b8ad378df36e4125b05ded99fbe54f9d"
+ }
+ },
+ "c1deb5815a0447248582e3484cb04635": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_334c9aa8095e4edd9a1afb872ed526c8",
+ "placeholder": "",
+ "style": "IPY_MODEL_3eb2668641394af9bc9e0f7d2c04958b",
+ "value": "100%"
+ }
+ },
+ "01d76f7002b24bb3acf8f0081e65cb48": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_8d49371624784b4295f85051b509c9e2",
+ "max": 5,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_ae733cb1f8d84633a31b1c61af5f2bf8",
+ "value": 5
+ }
+ },
+ "7b7da43ad0554ef5b15d676c21ad866e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_ddfde2e76bfb419fb01e53c7ecb5fc04",
+ "placeholder": "",
+ "style": "IPY_MODEL_3ea1b903cf3949df93be35d33b550046",
+ "value": " 5/5 [23:27<00:00, 281.45s/it]"
+ }
+ },
+ "b8ad378df36e4125b05ded99fbe54f9d": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "334c9aa8095e4edd9a1afb872ed526c8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "3eb2668641394af9bc9e0f7d2c04958b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "8d49371624784b4295f85051b509c9e2": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "ae733cb1f8d84633a31b1c61af5f2bf8": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "ddfde2e76bfb419fb01e53c7ecb5fc04": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "3ea1b903cf3949df93be35d33b550046": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "9ca77079e21346c6b67efd7c84244218": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_648c62ce35b54057aff012d9fa8c8868",
+ "IPY_MODEL_1fe1217084e14cf7a056b722c50cec6a",
+ "IPY_MODEL_291237b93b884081b714ef85608074c1"
+ ],
+ "layout": "IPY_MODEL_7a14d91659c44bfab2865743269b7707"
+ }
+ },
+ "648c62ce35b54057aff012d9fa8c8868": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_f35289fc008a47d2b368260637a090dc",
+ "placeholder": "",
+ "style": "IPY_MODEL_f28b750b796b4165ab9901f0fdec9aad",
+ "value": "100%"
+ }
+ },
+ "1fe1217084e14cf7a056b722c50cec6a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_21a69f5d253c465a9194dc1c95e6b0ea",
+ "max": 4,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_b69ba20d45f5430f9d2dc9a1405f4d7b",
+ "value": 4
+ }
+ },
+ "291237b93b884081b714ef85608074c1": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_cddcae93ef954edca7ffb0e828a7415d",
+ "placeholder": "",
+ "style": "IPY_MODEL_5c7fa3bc82fd4cce8dae0eb56752c39d",
+ "value": " 4/4 [00:47<00:00, 14.90s/it]"
+ }
+ },
+ "7a14d91659c44bfab2865743269b7707": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "f35289fc008a47d2b368260637a090dc": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "f28b750b796b4165ab9901f0fdec9aad": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "21a69f5d253c465a9194dc1c95e6b0ea": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "b69ba20d45f5430f9d2dc9a1405f4d7b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "cddcae93ef954edca7ffb0e828a7415d": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "5c7fa3bc82fd4cce8dae0eb56752c39d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "abb35c94c74940ec82e12ba8c3243b91": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HBoxView",
+ "_dom_classes": [],
+ "_model_name": "HBoxModel",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "box_style": "",
+ "layout": "IPY_MODEL_ca3a930bb33543fd893baec27ec81a5f",
+ "_model_module": "@jupyter-widgets/controls",
+ "children": [
+ "IPY_MODEL_4aead5752d21457787e2f7b0b861a57e",
+ "IPY_MODEL_316c57f018b1410dae3cf71c789e971e",
+ "IPY_MODEL_64bdf8f26e8a49ec80091b0001ba7a99"
+ ]
+ }
+ },
+ "ca3a930bb33543fd893baec27ec81a5f": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "4aead5752d21457787e2f7b0b861a57e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_8670185e627f48d3b13e9b9a1ca03cda",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": "100%",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_e92f972d1a9b4d26a9d2c2d18febab64"
+ }
+ },
+ "316c57f018b1410dae3cf71c789e971e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "ProgressView",
+ "style": "IPY_MODEL_a31fcbe28d754d759196ad3b7ed0632b",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "FloatProgressModel",
+ "bar_style": "success",
+ "max": 2,
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": 2,
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "orientation": "horizontal",
+ "min": 0,
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_b65568fdd9464cb68140941f57dd44ce"
+ }
+ },
+ "64bdf8f26e8a49ec80091b0001ba7a99": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_37800daf604d4f64bbb4e479a7ac2188",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": " 2/2 [1:00:19<00:00, 1810.05s/it]",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_ce8169bedbd840129e31f02f685daef4"
+ }
+ },
+ "8670185e627f48d3b13e9b9a1ca03cda": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "e92f972d1a9b4d26a9d2c2d18febab64": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "a31fcbe28d754d759196ad3b7ed0632b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "ProgressStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "bar_color": null,
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "b65568fdd9464cb68140941f57dd44ce": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "37800daf604d4f64bbb4e479a7ac2188": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "ce8169bedbd840129e31f02f685daef4": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "682fdfbe18074347b71b382b9f140141": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HBoxView",
+ "_dom_classes": [],
+ "_model_name": "HBoxModel",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "box_style": "",
+ "layout": "IPY_MODEL_d2e02c80579d40f2969cbd62869ddf51",
+ "_model_module": "@jupyter-widgets/controls",
+ "children": [
+ "IPY_MODEL_be584960263a47f083fcc738ec1f7a75",
+ "IPY_MODEL_8f1e5a8dd8f646f2bf5ac2500decbffa",
+ "IPY_MODEL_c7f8746fcbbf4e1791637a815c90462d"
+ ]
+ }
+ },
+ "d2e02c80579d40f2969cbd62869ddf51": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "be584960263a47f083fcc738ec1f7a75": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_08a24c518c2a4e25aedf243d5cb01045",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": "100%",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_a1358d61ef2246e3b7045effd03aef65"
+ }
+ },
+ "8f1e5a8dd8f646f2bf5ac2500decbffa": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "ProgressView",
+ "style": "IPY_MODEL_6140aaa2c0da49508004a28c7df36872",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "FloatProgressModel",
+ "bar_style": "success",
+ "max": 252,
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": 252,
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "orientation": "horizontal",
+ "min": 0,
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_6494ca997dc4401394efa95594eea0bd"
+ }
+ },
+ "c7f8746fcbbf4e1791637a815c90462d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_4ea8351599cc4937ba828d6fcb4cf3e8",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": " 252/252 [03:10<00:00, 1.33it/s]",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_c495d9fdc23340cf9540ad631f494879"
+ }
+ },
+ "08a24c518c2a4e25aedf243d5cb01045": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "a1358d61ef2246e3b7045effd03aef65": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "6140aaa2c0da49508004a28c7df36872": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "ProgressStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "bar_color": null,
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "6494ca997dc4401394efa95594eea0bd": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "4ea8351599cc4937ba828d6fcb4cf3e8": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "c495d9fdc23340cf9540ad631f494879": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "05f05b8c622d42dfb8033454f91a212b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HBoxView",
+ "_dom_classes": [],
+ "_model_name": "HBoxModel",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "box_style": "",
+ "layout": "IPY_MODEL_8c920420edda4c16a213764c816ce227",
+ "_model_module": "@jupyter-widgets/controls",
+ "children": [
+ "IPY_MODEL_27684ab7cf62412bbfa56d43db9a2305",
+ "IPY_MODEL_fb5467979e214859a890d1e94def6b1e",
+ "IPY_MODEL_d2a914a513b2461c8028d3881c5b8349"
+ ]
+ }
+ },
+ "8c920420edda4c16a213764c816ce227": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "27684ab7cf62412bbfa56d43db9a2305": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_280ab8d6b4304ce69ff516fe43226f8a",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": "100%",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_4d0ce419de7045c39fb09e1f8ebb1edb"
+ }
+ },
+ "fb5467979e214859a890d1e94def6b1e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "ProgressView",
+ "style": "IPY_MODEL_041b196f8e644c13afc826543766f981",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "FloatProgressModel",
+ "bar_style": "success",
+ "max": 1,
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": 1,
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "orientation": "horizontal",
+ "min": 0,
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_b85dbb9eb0964ddc81689b6c40986453"
+ }
+ },
+ "d2a914a513b2461c8028d3881c5b8349": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_2d4e2e7ade7b41faa6211859129816ed",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": " 1/1 [24:41<00:00, 1481.78s/it]",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_6c0b8150348e4d4f89ef0071b5658721"
+ }
+ },
+ "280ab8d6b4304ce69ff516fe43226f8a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "4d0ce419de7045c39fb09e1f8ebb1edb": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "041b196f8e644c13afc826543766f981": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "ProgressStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "bar_color": null,
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "b85dbb9eb0964ddc81689b6c40986453": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "2d4e2e7ade7b41faa6211859129816ed": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "6c0b8150348e4d4f89ef0071b5658721": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "a2586a70a06644bebc4be710940a6694": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HBoxView",
+ "_dom_classes": [],
+ "_model_name": "HBoxModel",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "box_style": "",
+ "layout": "IPY_MODEL_8d7143d6e13b47728179850ffa33d43b",
+ "_model_module": "@jupyter-widgets/controls",
+ "children": [
+ "IPY_MODEL_cd6aad4f7bcf4e068f8413da02d30848",
+ "IPY_MODEL_e2c29c0a000e4ff3bf94b6dfc581bee9",
+ "IPY_MODEL_78b13b3d9f54464fbf437bab94dd6086"
+ ]
+ }
+ },
+ "8d7143d6e13b47728179850ffa33d43b": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "cd6aad4f7bcf4e068f8413da02d30848": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_b69fc78345d947cd9334ff8828da196d",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": "100%",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_91a2d3a78f7949d5911eafd52f266104"
+ }
+ },
+ "e2c29c0a000e4ff3bf94b6dfc581bee9": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "ProgressView",
+ "style": "IPY_MODEL_ea1118456db049fb80ea44209affb18d",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "FloatProgressModel",
+ "bar_style": "success",
+ "max": 252,
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": 252,
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "orientation": "horizontal",
+ "min": 0,
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_7e4e450f949343fe8eb86bc1b5db1418"
+ }
+ },
+ "78b13b3d9f54464fbf437bab94dd6086": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_3ed54cbf68ee4ad99e348d00bbd7e94f",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": " 252/252 [02:33<00:00, 1.64it/s]",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_25bf6a89b93c422eb62c7430d95ae2af"
+ }
+ },
+ "b69fc78345d947cd9334ff8828da196d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "91a2d3a78f7949d5911eafd52f266104": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "ea1118456db049fb80ea44209affb18d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "ProgressStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "bar_color": null,
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "7e4e450f949343fe8eb86bc1b5db1418": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "3ed54cbf68ee4ad99e348d00bbd7e94f": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "25bf6a89b93c422eb62c7430d95ae2af": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "1d1d8f9d05874562b0da0d9f42022f5e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HBoxView",
+ "_dom_classes": [],
+ "_model_name": "HBoxModel",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "box_style": "",
+ "layout": "IPY_MODEL_2ef90ce5007f45868c06df86abf7bef9",
+ "_model_module": "@jupyter-widgets/controls",
+ "children": [
+ "IPY_MODEL_c11a2d13af084317a714c254775b2a07",
+ "IPY_MODEL_e60ddc48f732420c9f5130df2bad349e",
+ "IPY_MODEL_7988d180e38a4c1f9ed3e700339a4029"
+ ]
+ }
+ },
+ "2ef90ce5007f45868c06df86abf7bef9": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "c11a2d13af084317a714c254775b2a07": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_01e13fefb4344b958654d40324a160db",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": "100%",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_a01606b4960840cdae66fdaa7d90f4b4"
+ }
+ },
+ "e60ddc48f732420c9f5130df2bad349e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "ProgressView",
+ "style": "IPY_MODEL_f458289e94ea4315aff2c9e1f6a33d1d",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "FloatProgressModel",
+ "bar_style": "success",
+ "max": 5797,
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": 5797,
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "orientation": "horizontal",
+ "min": 0,
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_131fbe8d79544d508756fdda0ab55520"
+ }
+ },
+ "7988d180e38a4c1f9ed3e700339a4029": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_94bd7c2cdd6745049bbc6656422df364",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": " 5797/5797 [00:00<00:00, 116517.38it/s]",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_c91aa585907545898c626e068d5380fb"
+ }
+ },
+ "01e13fefb4344b958654d40324a160db": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "a01606b4960840cdae66fdaa7d90f4b4": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "f458289e94ea4315aff2c9e1f6a33d1d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "ProgressStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "bar_color": null,
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "131fbe8d79544d508756fdda0ab55520": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "94bd7c2cdd6745049bbc6656422df364": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "c91aa585907545898c626e068d5380fb": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "ebe5ff03043b40049e918c1a25e140d1": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HBoxModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HBoxView",
+ "_dom_classes": [],
+ "_model_name": "HBoxModel",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "box_style": "",
+ "layout": "IPY_MODEL_3a201a95aad64a898b45fcd8ce8ebe1f",
+ "_model_module": "@jupyter-widgets/controls",
+ "children": [
+ "IPY_MODEL_f5f930c8ffd14693af6914e3314da71f",
+ "IPY_MODEL_24b846ae797244bc9becfd44a216cc58",
+ "IPY_MODEL_d66e2540f0594470beadf03c9cb11b5b"
+ ]
+ }
+ },
+ "3a201a95aad64a898b45fcd8ce8ebe1f": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "f5f930c8ffd14693af6914e3314da71f": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_d808ed95076d49faaf508529334303d7",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": "100%",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_3ccc98a3d0fc43e6978116961f24bdad"
+ }
+ },
+ "24b846ae797244bc9becfd44a216cc58": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "FloatProgressModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "ProgressView",
+ "style": "IPY_MODEL_5216c9a211e545af9ad63deebfc21fbd",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "FloatProgressModel",
+ "bar_style": "success",
+ "max": 90,
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": 90,
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "orientation": "horizontal",
+ "min": 0,
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_59e0a76fe8914cffbd0dc1a423c9092b"
+ }
+ },
+ "d66e2540f0594470beadf03c9cb11b5b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "HTMLModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "HTMLView",
+ "style": "IPY_MODEL_37e1c8d6f36b49a5af6ff01fab880fb8",
+ "_dom_classes": [],
+ "description": "",
+ "_model_name": "HTMLModel",
+ "placeholder": "",
+ "_view_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "value": " 90/90 [00:55<00:00, 1.66it/s]",
+ "_view_count": null,
+ "_view_module_version": "1.5.0",
+ "description_tooltip": null,
+ "_model_module": "@jupyter-widgets/controls",
+ "layout": "IPY_MODEL_cb3627dc92854c1ca0f0fea7d64dc5f2"
+ }
+ },
+ "d808ed95076d49faaf508529334303d7": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "3ccc98a3d0fc43e6978116961f24bdad": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "5216c9a211e545af9ad63deebfc21fbd": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "ProgressStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "ProgressStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "bar_color": null,
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "59e0a76fe8914cffbd0dc1a423c9092b": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ },
+ "37e1c8d6f36b49a5af6ff01fab880fb8": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_name": "DescriptionStyleModel",
+ "model_module_version": "1.5.0",
+ "state": {
+ "_view_name": "StyleView",
+ "_model_name": "DescriptionStyleModel",
+ "description_width": "",
+ "_view_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.5.0",
+ "_view_count": null,
+ "_view_module_version": "1.2.0",
+ "_model_module": "@jupyter-widgets/controls"
+ }
+ },
+ "cb3627dc92854c1ca0f0fea7d64dc5f2": {
+ "model_module": "@jupyter-widgets/base",
+ "model_name": "LayoutModel",
+ "model_module_version": "1.2.0",
+ "state": {
+ "_view_name": "LayoutView",
+ "grid_template_rows": null,
+ "right": null,
+ "justify_content": null,
+ "_view_module": "@jupyter-widgets/base",
+ "overflow": null,
+ "_model_module_version": "1.2.0",
+ "_view_count": null,
+ "flex_flow": null,
+ "width": null,
+ "min_width": null,
+ "border": null,
+ "align_items": null,
+ "bottom": null,
+ "_model_module": "@jupyter-widgets/base",
+ "top": null,
+ "grid_column": null,
+ "overflow_y": null,
+ "overflow_x": null,
+ "grid_auto_flow": null,
+ "grid_area": null,
+ "grid_template_columns": null,
+ "flex": null,
+ "_model_name": "LayoutModel",
+ "justify_items": null,
+ "grid_row": null,
+ "max_height": null,
+ "align_content": null,
+ "visibility": null,
+ "align_self": null,
+ "height": null,
+ "min_height": null,
+ "padding": null,
+ "grid_auto_rows": null,
+ "grid_gap": null,
+ "max_width": null,
+ "order": null,
+ "_view_module_version": "1.2.0",
+ "grid_template_areas": null,
+ "object_position": null,
+ "object_fit": null,
+ "grid_auto_columns": null,
+ "margin": null,
+ "display": null,
+ "left": null
+ }
+ }
+ }
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "DLqUa76aAHIg",
+ "outputId": "9857ec61-44f1-4270-c68f-718b81ffdd04"
+ },
+ "source": [
+ "!apt install sox"
+ ],
+ "execution_count": 1,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Reading package lists... Done\n",
+ "Building dependency tree \n",
+ "Reading state information... Done\n",
+ "sox is already the newest version (14.4.2-3ubuntu0.18.04.1).\n",
+ "0 upgraded, 0 newly installed, 0 to remove and 37 not upgraded.\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "eX_UvnL9FOB2"
+ },
+ "source": [
+ "### Baseline commands recognition (2-5 points)\n",
+ "\n",
+ "We're now going to train a classifier to recognize voice. More specifically, we'll use the [Speech Commands Dataset] that contains around 30 different words with a few thousand voice records each."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "9GOZSrI9epgU"
+ },
+ "source": [
+ "import os\n",
+ "from IPython.display import display, Audio\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "import numpy as np\n",
+ "import librosa\n",
+ "import torch\n",
+ "from torch.utils.data import TensorDataset, DataLoader"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "FvHkw2rfY9k7",
+ "outputId": "70c3555b-d430-4b84-d23e-eaf6473d359c"
+ },
+ "source": [
+ "datadir = \"speech_commands\"\n",
+ "\n",
+ "!wget http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz -O speech_commands_v0.01.tar.gz\n",
+ "# alternative url: https://www.dropbox.com/s/j95n278g48bcbta/speech_commands_v0.01.tar.gz?dl=1\n",
+ "!mkdir {datadir} && tar -C {datadir} -xvzf speech_commands_v0.01.tar.gz 1> log\n",
+ "\n",
+ "samples_by_target = {\n",
+ " cls: [os.path.join(datadir, cls, name) for name in os.listdir(\"./speech_commands/{}\".format(cls))]\n",
+ " for cls in os.listdir(datadir)\n",
+ " if os.path.isdir(os.path.join(datadir, cls))\n",
+ "}\n",
+ "print('Classes:', ', '.join(sorted(samples_by_target.keys())[1:]))"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "--2021-10-24 17:43:06-- http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz\n",
+ "Resolving download.tensorflow.org (download.tensorflow.org)... 74.125.70.128, 2607:f8b0:4001:c02::80\n",
+ "Connecting to download.tensorflow.org (download.tensorflow.org)|74.125.70.128|:80... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 1489096277 (1.4G) [application/gzip]\n",
+ "Saving to: ‘speech_commands_v0.01.tar.gz’\n",
+ "\n",
+ "speech_commands_v0. 100%[===================>] 1.39G 212MB/s in 6.6s \n",
+ "\n",
+ "2021-10-24 17:43:12 (214 MB/s) - ‘speech_commands_v0.01.tar.gz’ saved [1489096277/1489096277]\n",
+ "\n",
+ "Classes: bed, bird, cat, dog, down, eight, five, four, go, happy, house, left, marvin, nine, no, off, on, one, right, seven, sheila, six, stop, three, tree, two, up, wow, yes, zero\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ME4cVShQ916w",
+ "outputId": "f908de11-00cf-4872-fb44-9c98f9b5fb2e"
+ },
+ "source": [
+ "!sox --info speech_commands/bed/00176480_nohash_0.wav"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Input File : 'speech_commands/bed/00176480_nohash_0.wav'\n",
+ "Channels : 1\n",
+ "Sample Rate : 16000\n",
+ "Precision : 16-bit\n",
+ "Duration : 00:00:01.00 = 16000 samples ~ 75 CDDA sectors\n",
+ "File Size : 32.0k\n",
+ "Bit Rate : 256k\n",
+ "Sample Encoding: 16-bit Signed Integer PCM\n",
+ "\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "6t5j_qZDpNps"
+ },
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from itertools import chain\n",
+ "from tqdm.notebook import tqdm\n",
+ "import joblib as jl\n",
+ "import pickle"
+ ],
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "COBM_YuwU7hw"
+ },
+ "source": [
+ "device = 'cuda' if torch.cuda.is_available() else 'cpu'"
+ ],
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "nzKvHNS8kKAJ",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "fa4ae08e-35c5-4ba2-f99c-e01230fe1763"
+ },
+ "source": [
+ "from google.colab import drive\n",
+ "drive.mount('/content/drive')"
+ ],
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "rc9cm1etnDes",
+ "outputId": "3229efe1-98ed-4629-dff7-19187452a1e7"
+ },
+ "source": [
+ "classes = (\"left\", \"right\", \"up\", \"down\", \"stop\")\n",
+ "\n",
+ "def preprocess_sample(filepath, max_length=150):\n",
+ " amplitudes, sr = librosa.core.load(filepath)\n",
+ " spectrogram = librosa.feature.melspectrogram(amplitudes, sr=sr)[:, :max_length]\n",
+ " spectrogram = np.pad(spectrogram, [[0, 0], [0, max(0, max_length - spectrogram.shape[1])]], mode='constant')\n",
+ " target = classes.index(filepath.split(os.sep)[-2])\n",
+ " return np.float32(spectrogram), np.int64(target)\n",
+ "\n",
+ "all_files = chain(*(samples_by_target[cls] for cls in classes))\n",
+ "spectrograms_and_targets = jl.Parallel(n_jobs=-1)(tqdm(list(map(jl.delayed(preprocess_sample), all_files))))\n",
+ "X, y = map(np.stack, zip(*spectrograms_and_targets))\n",
+ "X = X.transpose([0, 2, 1]) # to [batch, time, channels]\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 11834/11834 [07:26<00:00, 26.49it/s]\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 75
+ },
+ "id": "TGgEXx8kTCYw",
+ "outputId": "513ba118-ef58-45f1-ae57-c6f59f715028"
+ },
+ "source": [
+ "Audio('speech_commands/down/00176480_nohash_0.wav')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "STwaZBHmoXDz"
+ },
+ "source": [
+ "## Попробуем сетку на 1D свертках"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "RwjxGDD7eR7B"
+ },
+ "source": [
+ "X_trainn = X_train.reshape(8875, 128, 150)\n",
+ "X_testt = X_test.reshape(2959, 128, 150)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "7Ol6sywTG_Y9"
+ },
+ "source": [
+ "batch_size = 32\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_trainn)\n",
+ "tensor_y = torch.LongTensor(y_train)\n",
+ "\n",
+ "train_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_testt) # transform to torch tensor\n",
+ "tensor_y = torch.LongTensor(y_test)\n",
+ "\n",
+ "test_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "\n",
+ "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n",
+ " shuffle=True, num_workers=2, drop_last=True)\n",
+ "testloader = DataLoader(test_dataset, batch_size=batch_size,\n",
+ " shuffle=False, num_workers=2, drop_last=True)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "-qr8t6wCF8vT"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "\n",
+ "\n",
+ "class Net_Conv1D(nn.Module):\n",
+ " def __init__(self, n_input=1, n_output=5, stride=5, n_channel=32):\n",
+ " super().__init__()\n",
+ " # TODO: define your layers here\n",
+ " self.conv1 = nn.Conv1d(n_input, n_channel, kernel_size=80, stride=stride)\n",
+ " nn.init.xavier_normal_(self.conv1.weight) # проинициализируем веса (так лучше учится)\n",
+ " self.bn1 = nn.BatchNorm1d(n_channel)\n",
+ " self.conv2 = nn.Conv1d(n_channel, n_channel, kernel_size=3)\n",
+ " nn.init.xavier_normal_(self.conv2.weight)\n",
+ " self.bn2 = nn.BatchNorm1d(n_channel)\n",
+ " self.conv3 = nn.Conv1d(n_channel, 2 * n_channel, kernel_size=3)\n",
+ " nn.init.xavier_normal_(self.conv3.weight)\n",
+ " self.bn3 = nn.BatchNorm1d(2 * n_channel)\n",
+ " self.conv4 = nn.Conv1d(2 * n_channel, 2 * n_channel, kernel_size=1)\n",
+ " nn.init.xavier_normal_(self.conv4.weight)\n",
+ " self.bn4 = nn.BatchNorm1d(2 * n_channel)\n",
+ " self.fc1 = nn.Linear(2 * n_channel, n_output)\n",
+ "\n",
+ " def forward(self, x):\n",
+ " # TODO: apply your layers here\n",
+ " x = F.relu(self.bn1(self.conv1(x)))\n",
+ " x = F.relu(self.bn2(self.conv2(x)))\n",
+ " x = F.relu(self.bn3(self.conv3(x)))\n",
+ " x = F.relu(self.bn4(self.conv4(x)))\n",
+ " x = F.avg_pool1d(x, x.shape[-1])\n",
+ " x = x.permute(0, 2, 1)\n",
+ " x = self.fc1(x)\n",
+ " x = x.reshape(32, 5)\n",
+ " return F.softmax(x)\n",
+ "\n",
+ "# net on 1D conv layers with 128 input channels\n",
+ "net_1D_conv = Net_Conv1D(n_input=128, n_output=5).to(device)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "MCZ7MkvsF9gs"
+ },
+ "source": [
+ "import torch.optim as optim\n",
+ "\n",
+ "criterion = nn.CrossEntropyLoss()\n",
+ "optimizer = optim.Adam(net_1D_conv.parameters(), lr=0.01)\n",
+ "# scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.1)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "a1ee52b11ea94aee991a15afba908231",
+ "f46d48961a9d4c62b598f9d7ce7fa064",
+ "12b3bd3ca01e4706b572e10800888247",
+ "c7587af96b5d4dbab8f11b9ca1c39511",
+ "4f9021b2600646c4af9651abf7c100be",
+ "ab4b611801a140259a5132207a8fffd3",
+ "03f49df15c4541b2af1d7fa006e9a93a",
+ "8eff2693027641c4875701a38d648850",
+ "84f6360721d74d868a57f1a623e3e058",
+ "34b1cdcf58f84d798ba8173c1b0a71e0",
+ "20a9ea5506ef4cb9bf29e5fdef5fd464"
+ ]
+ },
+ "id": "xR1uxQ-GGGLr",
+ "outputId": "57002880-434e-4793-a531-3a0f64706c07"
+ },
+ "source": [
+ "from tqdm.notebook import tqdm\n",
+ "\n",
+ "losses_train = []\n",
+ "\n",
+ "for epoch in tqdm(range(50)): # loop over the dataset multiple times\n",
+ " epoch_loss = 0.0\n",
+ " running_loss = 0.0\n",
+ " for i, (inputs, labels) in enumerate(trainloader, 0):\n",
+ " # get the inputs; data is a list of [inputs, labels]\n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " # print(labels)\n",
+ " # zero the parameter gradients\n",
+ " optimizer.zero_grad()\n",
+ "\n",
+ " # forward + backward + optimize\n",
+ " outputs = net_1D_conv(inputs)\n",
+ " # print(outputs)\n",
+ " loss = criterion(outputs, labels)\n",
+ " loss.backward()\n",
+ " optimizer.step()\n",
+ "\n",
+ " # print statistics\n",
+ "\n",
+ " running_loss += loss.item()\n",
+ " epoch_loss += loss.item()\n",
+ " if i % 200 == 199: # print every 200 mini-batches\n",
+ " print('[%d, %5d] loss: %.3f' %\n",
+ " (epoch + 1, i + 1, running_loss / 200))\n",
+ " running_loss = 0.0\n",
+ " losses_train.append(epoch_loss)\n",
+ "print('Finished Training')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "a1ee52b11ea94aee991a15afba908231",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/50 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:33: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 200] loss: 1.587\n",
+ "[2, 200] loss: 1.518\n",
+ "[3, 200] loss: 1.496\n",
+ "[4, 200] loss: 1.468\n",
+ "[5, 200] loss: 1.453\n",
+ "[6, 200] loss: 1.434\n",
+ "[7, 200] loss: 1.418\n",
+ "[8, 200] loss: 1.401\n",
+ "[9, 200] loss: 1.383\n",
+ "[10, 200] loss: 1.380\n",
+ "[11, 200] loss: 1.363\n",
+ "[12, 200] loss: 1.351\n",
+ "[13, 200] loss: 1.331\n",
+ "[14, 200] loss: 1.326\n",
+ "[15, 200] loss: 1.323\n",
+ "[16, 200] loss: 1.315\n",
+ "[17, 200] loss: 1.304\n",
+ "[18, 200] loss: 1.294\n",
+ "[19, 200] loss: 1.298\n",
+ "[20, 200] loss: 1.290\n",
+ "[21, 200] loss: 1.282\n",
+ "[22, 200] loss: 1.281\n",
+ "[23, 200] loss: 1.270\n",
+ "[24, 200] loss: 1.255\n",
+ "[25, 200] loss: 1.265\n",
+ "[26, 200] loss: 1.251\n",
+ "[27, 200] loss: 1.243\n",
+ "[28, 200] loss: 1.241\n",
+ "[29, 200] loss: 1.243\n",
+ "[30, 200] loss: 1.238\n",
+ "[31, 200] loss: 1.229\n",
+ "[32, 200] loss: 1.223\n",
+ "[33, 200] loss: 1.231\n",
+ "[34, 200] loss: 1.227\n",
+ "[35, 200] loss: 1.221\n",
+ "[36, 200] loss: 1.225\n",
+ "[37, 200] loss: 1.226\n",
+ "[38, 200] loss: 1.220\n",
+ "[39, 200] loss: 1.210\n",
+ "[40, 200] loss: 1.206\n",
+ "[41, 200] loss: 1.199\n",
+ "[42, 200] loss: 1.207\n",
+ "[43, 200] loss: 1.193\n",
+ "[44, 200] loss: 1.204\n",
+ "[45, 200] loss: 1.191\n",
+ "[46, 200] loss: 1.202\n",
+ "[47, 200] loss: 1.183\n",
+ "[48, 200] loss: 1.189\n",
+ "[49, 200] loss: 1.188\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Exception ignored in: \n",
+ "Traceback (most recent call last):\n",
+ "Exception ignored in: \n",
+ " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1328, in __del__\n",
+ "Traceback (most recent call last):\n",
+ " self._shutdown_workers()\n",
+ " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1320, in _shutdown_workers\n",
+ " if w.is_alive():\n",
+ " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1328, in __del__\n",
+ " File \"/usr/lib/python3.7/multiprocessing/process.py\", line 151, in is_alive\n",
+ " self._shutdown_workers()\n",
+ " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1320, in _shutdown_workers\n",
+ " assert self._parent_pid == os.getpid(), 'can only test a child process'\n",
+ " if w.is_alive():\n",
+ "AssertionError: can only test a child process\n",
+ " File \"/usr/lib/python3.7/multiprocessing/process.py\", line 151, in is_alive\n",
+ " assert self._parent_pid == os.getpid(), 'can only test a child process'\n",
+ "AssertionError: can only test a child process\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[50, 200] loss: 1.191\n",
+ "Finished Training\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "BPPyO3DxvYQf"
+ },
+ "source": [
+ "### Лосс падает нереально"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 497
+ },
+ "id": "97ug6w63vE_n",
+ "outputId": "9365c8db-7868-4935-fcbd-cb598bd6817b"
+ },
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.xlabel('Number of epoch')\n",
+ "plt.ylabel('Loss')\n",
+ "plt.plot(range(1, 51), np.array(losses_train) / (X_train.shape[0] // 16), color='green')\n",
+ "plt.grid()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAt0AAAHgCAYAAAB5O9EcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeZyP9f7/8edrZhjLIKFhRrYspQYxg47KcBAqS/altKCSFs5ROXVSWk/fihY5iSJhLCFKqBjaLBOyJDtlS7bs23j//piPfnM0FWauuT4zn8f9drtuzed9LZ/ndXvfOud5u7qu62POOQEAAADwTpjfAQAAAIDcjtINAAAAeIzSDQAAAHiM0g0AAAB4jNINAAAAeIzSDQAAAHgswu8A2aF48eKuXLlymT7O4cOHVbBgwcwHQo7AfIcW5jv0MOehhfkOLX7N97fffrvbOVcio3UhUbrLlSunlJSUTB8nOTlZiYmJmQ+EHIH5Di3Md+hhzkML8x1a/JpvM9vyR+u4vQQAAADwGKUbAAAA8BilGwAAAPAYpRsAAADwGKUbAAAA8BilGwAAAPAYpRsAAADwGKUbAAAA8BilGwAAAPAYpRsAAADwGKUbAAAA8BilGwAAAPAYpRsAAADwGKUbAAAA8BilGwAAAPAYpRsAAADwGKXbI845bT+43e8YAAAACAKUbo88PudxVXi1gk6knvA7CgAAAHxG6fZItehqOp56XCt3rfQ7CgAAAHxG6fZIQmyCJGnxtsU+JwEAAIDfKN0eKX9ReV2c/2KlbE/xOwoAAAB8Run2iJkpPiZei7dzpRsAACDUUbo9lBCToJW7VurIySN+RwEAAICPKN0eSohJUKpL1bKdy/yOAgAAAB9Ruj3Ew5QAAACQKN2eiikUo5hCMdzXDQAAEOIo3R5LiEmgdAMAAIQ4SrfHEmIStHbPWu0/tt/vKAAAAPAJpdtj8THxkqQlO5b4nAQAAAB+oXR77Ezp5mFKAACA0EXp9lixAsVUoWgF7usGAAAIYZTubMDDlAAAAKGN0p0NEmIS9OOvP2rX4V1+RwEAAIAPKN3ZgB/JAQAACG2U7mxQs1RNmYxbTAAAAEIUpTsbROWN0hUlrlDK9hS/owAAAMAHlO5scuZhSuec31EAAACQzSjd2SQhJkG7Du/STwd+8jsKAAAAshmlO5vwMCUAAEDoonRnk+rR1ZUnLA8PUwIAAIQgSnc2iYyIVLXoapRuAACAEORp6Tazpma2xszWm9mjGawfZGbLAstaM9sfGG+QbnyZmR0zs1aBdSPNbFO6dTW8PIeslBCToJTtKTrtTvsdBQAAANnIs9JtZuGShkhqJqmqpE5mVjX9Ns65Ps65Gs65GpJelzQ5MD433XhDSUckzU63a78z651zy7w6h6wWHxOvA8cPaN2edX5HAQAAQDby8kp3bUnrnXMbnXMnJCVJavkn23eSNC6D8baSPnHOHfEgY7Y68zAl7+sGAAAILREeHjtWUvr3422VVCejDc2srKTykuZksLqjpFfOGnvWzJ6Q9LmkR51zxzM4Zk9JPSUpOjpaycnJ55v/dw4dOpSp46S6VEWGRWrKoimK3Rub6TzwVmbnGzkL8x16mPPQwnyHlmCcby9L9/noKGmScy41/aCZlZIUJ2lWuuH+knZKyitpmKRHJA08+4DOuWGB9YqPj3eJiYmZDpmcnKzMHid+U7x2aEemjwPvZcV8I+dgvkMPcx5amO/QEozz7eXtJdskXZruc+nAWEY6KuNbS9pLmuKcO3lmwDm3w6U5Luldpd3GkmMkxCRo6Y6lOnX6lN9RAAAAkE28LN2LJVUys/JmlldpxXra2RuZ2eWSikr6JoNj/O4+78DVb5mZSWolaWUW5/ZUQmyCjp46qlW7VvkdBQAAANnEs9LtnDslqbfSbg1ZLWmCc26VmQ00sxbpNu0oKck559Lvb2bllHalfN5Zhx5jZiskrZBUXNIz3pyBNxJiAr9Myfu6AQAAQoan93Q752ZImnHW2BNnfX7yD/bdrLSHMc8eb5h1CbNfxYsrqkhkES3etljda3b3Ow4AAACyAb9Imc3MTPEx8UrZwWsDAQAAQgWl2wcJMQla/vNyHTt1zO8oAAAAyAaUbh8kxCbo1OlT+m7nd35HAQAAQDagdPuAhykBAABCC6XbB6ULl1Z0wWhKNwAAQIigdPvAzJQQm6DF2yjdAAAAoYDS7ZOEmAT9sPsHHTx+0O8oAAAA8Bil2yfxMfFycvp2x7d+RwEAAIDHKN0+OfMwZcp23tcNAACQ21G6fVKiYAmVLVKWhykBAABCAKXbRzxMCQAAEBoo3T5KiEnQpv2btPvIbr+jAAAAwEOUbh9xXzcAAEBooHT7qFZMLUniFhMAAIBcjtLto8KRhVWlWBUepgQAAMjlKN0+S4hN4PYSAACAXI7S7bOEmATtOLRD2w5s8zsKAAAAPELp9tmZhym5xQQAACD3onT7rEbJGooIi+BhSgAAgFyM0u2z/Hny66pLruJKNwAAQC5G6Q4CCTFpD1M65/yOAgAAAA9QuoNAfEy89h3bpw37NvgdBQAAAB6gdAcBfpkSAAAgd6N0B4GrLrlK+SLy8TAlAABALkXpDgJ5wvOoRskaPEwJAACQS1G6g0RCTIKW7Fii1NOpfkcBAABAFqN0B4mEmAQdPnlYq3ev9jsKAAAAshilO0gkxKY9TDl/y3yfkwAAACCrUbqDRJViVVSzVE09/+XzOnzisN9xAAAAkIUo3UHCzDT4hsHaemCr/u/r//M7DgAAALIQpTuIXFf2OrW/sr1e/OpF/fTrT37HAQAAQBahdAeZFxu9KCenRz57xO8oAAAAyCKU7iBT9qKy6ve3fhq3cpy++vErv+MAAAAgC1C6g9Aj9R5RbKFYPTjzQZ12p/2OAwAAgEyidAehgnkL6oVGL+jbHd/qve/e8zsOAAAAMonSHaQ6x3VWndg66v95fx08ftDvOAAAAMgESneQCrMwvdr0Ve08tFPPffGc33EAAACQCZTuIFandB3dWu1WvbLgFW3ct9HvOAAAALhAlO4g9/zfn1dEWIT6fdrP7ygAAAC4QJTuIBdbOFb9r+2vyasnK3lzst9xAAAAcAEo3TnAP675h8oWKasHZz6o1NOpfscBAADAefK0dJtZUzNbY2brzezRDNYPMrNlgWWtme1Pty413bpp6cbLm9nCwDHHm1leL88hGOTPk18vNn5Ry39eruFLhvsdBwAAAOfJs9JtZuGShkhqJqmqpE5mVjX9Ns65Ps65Gs65GpJelzQ53eqjZ9Y551qkG/+PpEHOuYqS9km6y6tzCCbtqrbTdWWu0+NzH9f+Y/v/egcAAAAEDS+vdNeWtN45t9E5d0JSkqSWf7J9J0nj/uyAZmaSGkqaFBgaJalVFmQNemamV5u+qj1H9ujpeU/7HQcAAADnwcvSHSvpp3SftwbGfsfMykoqL2lOuuF8ZpZiZgvM7EyxLiZpv3Pu1F8dMze6utTVuvPqO/Xaote0Zvcav+MAAADgHEX4HSCgo6RJzrn0TwmWdc5tM7MKkuaY2QpJv57rAc2sp6SekhQdHa3k5ORMhzx06FCWHCczmudrrnE2TrePu13Pxz3va5bcLhjmG9mH+Q49zHloYb5DSzDOt5ele5ukS9N9Lh0Yy0hHSfelH3DObQv8c6OZJUu6WtIHki4ys4jA1e4/PKZzbpikYZIUHx/vEhMTL/hEzkhOTlZWHCez1hdcr0c+e0THSx/XDRVv8DtOrhUs843swXyHHuY8tDDfoSUY59vL20sWS6oUeNtIXqUV62lnb2Rml0sqKumbdGNFzSwy8HdxSfUkfe+cc5LmSmob2LSbpA89PIeg9GCdB3VZ0cvUZ1YfnUw96XccAAAA/AXPSnfgSnRvSbMkrZY0wTm3yswGmln6t5F0lJQUKNRnXCEpxcy+U1rJfsE5931g3SOS+prZeqXd4z3Cq3MIVpERkXq5yctavXu1/pvyX7/jAAAA4C94ek+3c26GpBlnjT1x1ucnM9jva0lxf3DMjUp7M0pIa1GlhRqWb6hnv3hW9ybcq4iwYLk9HwAAAGfjFylzKDPTfQn36efDP2vOpjl/vQMAAAB8Q+nOwZpXaq4ikUU0ZsUYv6MAAADgT1C6c7B8EfnU5oo2mrx6so6ePOp3HAAAAPwBSncO1zmusw6dOKTpa6f7HQUAAAB/gNKdwyWWS1SpqFIau2Ks31EAAADwByjdOVx4WLg6XtVRM9bN0N6je/2OAwAAgAxQunOBLnFddPL0SX3w/Qd+RwEAAEAGKN25QM1SNVW5WGXeYgIAABCkKN25gJmpS1wXzd8yXz/9+pPfcQAAAHAWSncu0Tmus5ycklYm+R0FAAAAZ6F05xIVL66o2rG1NXYlbzEBAAAINpTuXKTzVZ21bOcyff/L935HAQAAQDqU7lykw1UdFGZhvLMbAAAgyFC6c5GSUSXVqEIjjV0xVs45v+MAAAAggNKdy3S+qrM27d+kBVsX+B0FAAAAAZTuXKb1Fa2VLyIf7+wGAAAIIpTuXKZwZGHdXPlmTVg1QSdTT/odBwAAAKJ050pd4rrolyO/6LONn/kdBQAAAKJ050pNKzbVRfku4p3dAAAAQYLSnQtFRkSqXdV2mrJ6ig6fOOx3HAAAgJBH6c6lOsd11uGThzV97XS/owAAAIQ8SncudX3Z6xVbKJa3mAAAAAQBSncuFWZh6nRVJ81cP1N7juzxOw4AAEBIo3TnYl2qddGp06c08fuJfkcBAAAIaZTuXKx6dHVdUfwKjV3BW0wAAAD8ROnOxcxMXeK66Isfv9CW/Vv8jgMAABCyKN25XKe4TpKkpJVJPicBAAAIXZTuXK5C0Qq6pvQ1vMUEAADAR5TuENA5rrNW7FqhFT+v8DsKAABASKJ0h4D2V7ZXuIVr3MpxfkcBAAAISZTuEHBJwUvU+LLGGrtirE67037HAQAACDmU7hDRJa6Ltvy6Rd/89I3fUQAAAEIOpTtEtKzSUvkj8vNAJQAAgA8o3SGiUGQhtby8pSasmqCTqSf9jgMAABBSKN0hpEtcF+05ukcPfPIAxRsAACAbUbpDyI2VblS/v/XTf7/9r5qNaaZ9R/f5HQkAACAkULpDiJnpxcYv6t2W72r+lvmqM7yO1uxe43csAACAXI/SHYJur3G75nSbo33H9qnuiLr6dMOnfkcCAADI1SjdIeraMtdqcY/FKl24tJqNaaYhi4b4HQkAACDXonSHsHIXldPXd36t5pWaq/cnvdXr4148YAkAAOABSneIKxRZSFM6TNHDf3tYQ1OGqumYptp7dK/fsQAAAHIVSjcUHhau/zT+j0a2HKkvf/xSdYbX0Q+7f/A7FgAAQK7haek2s6ZmtsbM1pvZoxmsH2RmywLLWjPbHxivYWbfmNkqM1tuZh3S7TPSzDal26+Gl+cQSrrV6KY5t83Rr8d+Vd3hdTV7w2y/IwEAAOQKnpVuMwuXNERSM0lVJXUys6rpt3HO9XHO1XDO1ZD0uqTJgVVHJN3mnLtSUlNJg83sonS79juzn3NumVfnEIrqlamnxT0Wq0yRMmo2ppleX/i6nHN+xwIAAMjRvLzSXVvSeufcRufcCUlJklr+yfadJI2TJOfcWufcusDf2yXtklTCw6xIp+xFZfXVnV/ppso36YGZD+iJuU/4HQkAACBH87J0x0r6Kd3nrYGx3zGzspLKS5qTwbrakvJK2pBu+NnAbSeDzCwy6yLjjDMPWN5W/TY99+VzWraT/6AAAABwocyrWwfMrK2kps657oHPt0qq45zrncG2j0gq7Zy7/6zxUpKSJXVzzi1IN7ZTaUV8mKQNzrmBGRyzp6SekhQdHV0rKSkp0+d06NAhRUVFZfo4OcnBkwd12+LbFJs/Vq/VeE1hFjrP3obifIcy5jv0MOehhfkOLX7Nd4MGDb51zsVntC7Cw+/dJunSdJ9LB8Yy0lHSfekHzKywpI8lPXamcEuSc25H4M/jZvaupH9mdEDn3DCllXLFx8e7xMTECziF/5WcnKysOE5OM6jEIN3x4R3actEW3XH1HX7HyTahOt+hivkOPcx5aGG+Q0swzreXly0XS6pkZuXNLK/SivW0szcys8slFZX0TbqxvJKmSHrPOTfprO1LBf5pklpJWunZGUCSdFv121Tv0np6+LOHeYc3AADABfCsdDvnTknqLWmWpNWSJjjnVpnZQDNrkW7TjpKS3P/e59Je0vWSbs/g1YBjzGyFpBWSikt6xqtzQJowC9OQ5kO09+hePT7ncb/jAAAA5Dhe3l4i59wMSTPOGnvirM9PZrDf+5Le/4NjNszCiDhH1UtW1/2179drC1/TnVffqfiYDG9XAgAAQAZC56k4ZNpTiU8pOipavT7updTTqX7HAQAAyDEo3ThnRfIV0UuNX9Li7Ys1YukIv+MAAADkGJRunJfOcZ2VWC5R/T/vr91HdvsdBwAAIEegdOO8mJneaPaGDhw/oEc/e9TvOAAAADkCpRvn7cpLrtRDdR7SiKUjtGDrgr/eAQAAIMRRunFBBiQOUGyhWB6qBAAAOAeUblyQqLxRGnTDIC3duVRDU4b6HQcAACCoUbpxwdpWbatGFRrp8TmP6+dDP/sdBwAAIGhRunHBzjxUeeTkET382cN+xwEAAAhalG5kSpXiVdTvb/303nfv6YstX/gdBwAAIChRupFp/7ruXypTpIx6zeilk6kn/Y4DAAAQdCjdyLSCeQvq1aavauWulXpj0Rt+xwEAAAg6lG5kiZZVWqp5peYakDxA2w9u9zsOAABAUKF0I0uYmV5r+ppOpJ7QP2f/0+84AAAAQYXSjSxz2cWX6dFrH9W4leM0+rvRfscBAAAIGpRuZKnHrntMDco1UPfp3fXVj1/5HQcAACAoULqRpfKE59Gk9pNUtkhZtR7fWpv3b/Y7EgAAgO8o3chyF+e/WB91/kgnT5/UTWNv0oHjB/yOBAAA4CtKNzxRuVhlTWo3ST/s/kGdPuik1NOpfkcCAADwDaUbnvl7hb9rSPMhmrFuBm80AQAAIS3C7wDI3e6Ov1urd6/W4IWDdUWJK9SzVk+/IwEAAGQ7rnTDcy83eVnNKjbTfTPu05xNc/yOAwAAkO0o3fBceFi4ktomqUqxKmozoY3W7lnrdyQAAIBsRelGtigcWVjTO01XRFiEbhp7k/Ye3et3JAAAgGxD6Ua2KV+0vKZ2mKotv25Ru4ntdDL1pN+RAAAAsgWlG9mqXpl6Gn7zcM3ZNEe9Z/SWc87vSAAAAJ7j7SXIdrdWv1Wrd6/W818+rytKXKGH6j7kdyQAAABPUbrhi2caPqM1e9boH7P/ocrFKqt5peZ+RwIAAPAMt5fAF2EWpvdavacaJWuo46SOWrlrpd+RAAAAPEPphm8K5i2oaR2nKSpvlFqPb61fj/3qdyQAAABPULrhq9jCsRrfdrw27dukO6fdyYOVAAAgV6J0w3fXlb1O/2n0H01ePVmDFwz2Ow4AAECWo3QjKPS9pq9aX95aD3/2sL768Su/4wAAAGQpSjeCgpnp3ZbvqmyRsmo/qb12Hd7ldyQAAIAsQ+lG0CiSr4g+aP+B9h7dq84fdFbq6VS/IwEAAGQJSjeCSvWS1fVm8zf1+abP9WTyk37HAQAAyBKUbgSdO66+Q3fWuFPPfPGMZqyb4XccAACATKN0Iyi90fwNVY+urq6Tu2rz/s1+xwEAAMgUSjeCUv48+TWp/SSlulS1m9hOx08d9zsSAADABaN0I2hVvLiiRrUapZTtKeozq4/fcQAAAC4YpRtBrdXlrfTPa/6poSlDNWb5GL/jAAAAXBBKN4Lec39/TteVuU49P+qpVbtW+R0HAADgvHlaus2sqZmtMbP1ZvZoBusHmdmywLLWzPanW9fNzNYFlm7pxmuZ2YrAMV8zM/PyHOC/POF5lNQ2SYXyFlKbCW108PhBvyMBAACcF89Kt5mFSxoiqZmkqpI6mVnV9Ns45/o452o452pIel3S5MC+F0saIKmOpNqSBphZ0cBuQyX1kFQpsDT16hwQPGIKxWhcm3Fat3edekzvIeec35EAAADOmZdXumtLWu+c2+icOyEpSVLLP9m+k6Rxgb9vkPSpc26vc26fpE8lNTWzUpIKO+cWuLTW9Z6kVt6dAoJJg/IN9EyDZzR+1XgNWTzE7zgAAADnzMvSHSvpp3SftwbGfsfMykoqL2nOX+wbG/j7L4+J3OmRax/RTZVvUt9ZfbVo2yK/4wAAAJyTCL8DBHSUNMk5l5pVBzSznpJ6SlJ0dLSSk5MzfcxDhw5lyXGQOT2K99DiLYvVYnQLvV3rbRXKU8iT72G+QwvzHXqY89DCfIeWYJxvL0v3NkmXpvtcOjCWkY6S7jtr38Sz9k0OjJc+l2M654ZJGiZJ8fHxLjExMaPNzktycrKy4jjIvEuuuETXvXudRuwZoSkdpsiL52mZ79DCfIce5jy0MN+hJRjn28vbSxZLqmRm5c0sr9KK9bSzNzKzyyUVlfRNuuFZkpqYWdHAA5RNJM1yzu2QdMDM6gbeWnKbpA89PAcEqbql6+rFRi/qwzUfavCCwX7HAQAA+FOelW7n3ClJvZVWoFdLmuCcW2VmA82sRbpNO0pKculeR+Gc2yvpaaUV98WSBgbGJKmXpOGS1kvaIOkTr84Bwe2hug+p1eWt9PBnD2vB1gV+xwEAAPhDnt7T7ZybIWnGWWNPnPX5yT/Y9x1J72QwniLpqqxLiZzKzPROi3dUc1hNdZjUQUvvXqqL81/sdywAAIDf4RcpkaMVzV9UE9pO0I6DO3T71Nt5fzcAAAhKlG7keAmxCXqpyUuavna6Xv7mZb/jAAAA/A6lG7nC/bXv1y1X3KJHP3tUX//0td9xAAAA/gelG7mCmWlEixEqU6SMOk7qqD1H9vgdCQAA4DeUbuQaF+W7SBPbTdTPh39Wt6nddNqd9jsSAACApHMs3WZW0MzCAn9XNrMWZpbH22jA+asVU0uvNHlFH6/7WC99/ZLfcQAAACSd+5Xu+ZLymVmspNmSbpU00qtQQGb0SuildlXb6V+f/0tf/vil33EAAADOuXSbc+6IpFskvemcayfpSu9iARfOzPT2zW+r3EXl1HFSR+0+stvvSAAAIMSdc+k2s2skdZH0cWAs3JtIQOYVyVdEE9tN1C9HftGtU27l/m4AAOCrcy3dD0nqL2lK4KfcK0ia610sIPOuLnW1Bt8wWDPXz9R/vvyP33EAAEAIO6efgXfOzZM0T5ICD1Tuds494GUwICvcE3+P5m2Zp8fnPq6IsAjdm3CvovJG+R0LAACEmHN9e8lYMytsZgUlrZT0vZn18zYakHlmpmE3D1OjCo308GcPq8ygMhowdwDv8QYAANnqXG8vqeqcOyCplaRPJJVX2htMgKBXOLKwZnWdpQV3LdD1Za/XwPkDVXZwWfWd1VfbDmzzOx4AAAgB51q68wTey91K0jTn3ElJzrtYQNarU7qOpnacqhX3rlDrK1rrtYWvqfyr5dV9Wnet27PO73gAACAXO9fS/ZakzZIKSppvZmUlHfAqFOClqy65SqNbj9a6+9epR80een/5+6ryRhV1mNRBS3cs9TseAADIhc6pdDvnXnPOxTrnmrs0WyQ18Dgb4KnyRctryI1DtPmhzXq43sP6ZN0nqjmsppqNaaYvtnzhdzwAAJCLnOuDlEXM7BUzSwksLyvtqjeQ45WMKqkXGr2gH/v8qGcaPKOU7Sm6fuT1GrBqgFJPp/odDwAA5ALnenvJO5IOSmofWA5IeterUIAfLsp3kR67/jFteWiLBtQfoPm75+uZ+c/4HQsAAOQC51q6L3PODXDObQwsT0mq4GUwwC8F8hTQgPoD1CS6iZ6a95Q+3fCp35EAAEAOd66l+6iZXXvmg5nVk3TUm0iA/8xMD1V6SFVLVFXnyZ219cBWvyMBAIAc7FxL9z2ShpjZZjPbLOkNSXd7lgoIAvnD82tS+0k6duqYOkzqoJOpJ/2OBAAAcqhzfXvJd8656pKqSarmnLtaUkNPkwFB4PLil+vtm9/W1z99rf6f9/c7DgAAyKHO9Uq3JMk5dyDwy5SS1NeDPEDQ6XhVR92XcJ9e/uZlTVk9xe84AAAgBzqv0n0Wy7IUQJB7ucnLSohJ0O0f3q4Nezf4HQcAAOQwmSnd/Aw8QkZkRKQmtpuocAtX24ltdfQkzxEDAIBz96el28wOmtmBDJaDkmKyKSMQFMpeVFajW4/Wsp3L9ODMB/2OAwAAcpA/Ld3OuULOucIZLIWccxHZFRIIFjdWvlH9r+2vt5e8rfe+e8/vOAAAIIfIzO0lQEga2GCg6petr3s+ukcrd630Ow4AAMgBKN3AeYoIi1BS2yQVyVdEbSe01cHjB/2OBAAAghylG7gAJaNKalybcVq3d516TO8h53iuGAAA/DFKN3CBEssl6tmGz2r8qvF6c/GbfscBAABBjNINZMLD9R7WTZVvUp9ZfbRo2yK/4wAAgCBF6QYyIczCNKrVKMUUilG7ie20Zf8WvyMBAIAgROkGMuni/BdrYruJ2nd0n2q8VUMffP+B35EAAECQoXQDWSAhNkHL7lmmysUqq+3Etrp7+t06cvKI37EAAECQoHQDWaRC0Qr68o4v9Ui9RzRsyTDVfrs27/EGAACSKN1AlsoTnkcvNHpBs7vO1u4ju5XwdoKGLh7KKwUBAAhxlG7AA40va6zv7vlO9cvWV68ZvdRmQhvtPbrX71gAAMAnlG7AI9FR0ZrRZYZeavySPlr7kWr8t4a+2PKF37EAAIAPKN2Ah8IsTP/42z/09V1fKzIiUomjEjVw3kClnk71OxoAAMhGlG4gG8THxGtJzyXqHNdZA5IHqOF7DbX1wFa/YwEAgGxC6QaySaHIQhrderTea/Wevt3+rar/t7pmb5jtdywAAJANPC3dZtbUzNaY2Xoze/QPtmlvZt+b2SozGxsYa2Bmy9Itx8ysVWDdSDPblG5dDS/PAchqt1a/VUvvXqrYQrFqM6GNVv+y2u9IAADAY56VbjMLlzREUjNJVSV1MrOqZ21TSVJ/SfWcc1dKekiSnHNznXM1nHM1JDWUdERS+kuC/c6sd84t84YPxYYAACAASURBVOocAK9UKlZJn3T5RAXyFFDr8a114PgBvyMBAAAPeXmlu7ak9c65jc65E5KSJLU8a5sekoY45/ZJknNuVwbHaSvpE+ccP++HXCW2cKwmtJ2g9XvX6/apt/MubwAAcjHz6v/ozaytpKbOue6Bz7dKquOc651um6mS1kqqJylc0pPOuZlnHWeOpFeccx8FPo+UdI2k45I+l/Soc+54Bt/fU1JPSYqOjq6VlJSU6XM6dOiQoqKiMn0c5AzZNd+Ttk7SkA1D1KN8D3Uu09nz70PG+Pc79DDnoYX5Di1+zXeDBg2+dc7FZ7QuIrvDZPD9lSQlSiotab6ZxTnn9kuSmZWSFCdpVrp9+kvaKSmvpGGSHpE08OwDO+eGBdYrPj7eJSYmZjpscnKysuI4yBmya77ru/raM3mPRqwaobb12qrJZU08/078Hv9+hx7mPLQw36ElGOfby9tLtkm6NN3n0oGx9LZKmuacO+mc26S0q96V0q1vL2mKc+7kmQHn3A6X5rikd5V2GwuQY5mZht88XFVLVFWnDzpp8/7NfkcCAABZzMvSvVhSJTMrb2Z5JXWUNO2sbaYq7Sq3zKy4pMqSNqZb30nSuPQ7BK5+y8xMUitJK70ID2SngnkLakqHKUo9napbxt+ioyeP+h0JAABkIc9Kt3PulKTeSrs1ZLWkCc65VWY20MxaBDabJWmPmX0vaa7S3kqyR5LMrJzSrpTPO+vQY8xshaQVkopLesarcwCyU8WLK2rMLWO0dOdS3fvxvTxYCQBALuLpPd3OuRmSZpw19kS6v52kvoHl7H03S4rNYLxhlgcFgsSNlW/UgPoD9NS8p1Qnto7uTbjX70gAACAL8IuUQJB5ov4Tal6puR6c+aC+/ulrv+MAAIAsQOkGgkyYhen91u+rTJEyajuhrXYe2ul3JAAAkEmUbiAIFc1fVJM7TNavx39V+4ntdTL15F/vBAAAghalGwhS1aKrafjNw/XFj1+o36f9/I4DAAAywe8fxwHwJzrFddKibYs0eOFgJcQkqEu1Ln5HAgAAF4Ar3UCQe7Hxi7q+7PXqMb2Hvtv5nd9xAADABaB0A0EuT3geTWg7QUXzF1Xr8a21Zf8WvyMBAIDzROkGcoDoqGhN6TBF+47tU90RdZWyPcXvSAAA4DxQuoEconZsbX1151eKDI9U/ZH1NX3NdL8jAQCAc0TpBnKQqiWqakH3BapaoqpajW+lNxa94XckAABwDijdQA5TMqqkkrsl6+bKN+v+T+5X31l9lXo61e9YAADgT1C6gRyoYN6C+qD9B3qwzoMatGCQ2k1spyMnj/gdCwAA/AFKN5BDhYeFa3DTwRp8w2BN/WGqGoxqoJ8P/ex3LAAAkAFKN5DDPVj3QU3pMEUrfl6ha0Zcox92/+B3JAAAcBZKN5ALtLy8pebdPk+HTx7WNSOu0bzN8/yOBAAA0qF0A7lEQmyCFty1QKWiSqnx6MYas3yM35EAAEAApRvIRcoXLa+v7vxK9crUU9cpXfXM/GfknPM7FgAAIY/SDeQyRfMX1ayus3RrtVv177n/VoNRDfTZxs8o3wAA+IjSDeRCecPzalSrUXqj2Rtau2etGo9urLoj6mr6mumUbwAAfEDpBnIpM9N9te/Txgc3auiNQ7Xr8C61SGqhGm/V0PiV4/lBHQAAshGlG8jl8kXk0z3x92ht77Ua1WqUTqSeUMcPOqrqm1X17tJ3dTL1pN8RAQDI9SjdQIjIE55Ht1W/TSvvXamJ7SaqQJ4CunPanar4ekUNWTRER08e9TsiAAC5FqUbCDHhYeFqW7WtlvRcoo87f6zYQrHq/UlvlX+1vP7vq//TweMH/Y4IAECuQ+kGQpSZqXml5vrqzq8057Y5uuqSq/TwZw+r7OCyeir5Ke09utfviAAA5BqUbiDEmZkalG+gz277TAvuWqDryl6nJ+c9qbKDy6rf7H7acXCH3xEBAMjxKN0AflOndB192PFDLb9nuVpUaaFXFryi8q+WV6+Pe2nTvk1+xwMAIMeidAP4nbjoOI25ZYzW9F6j26rfpuFLhqvS65V025TbtPqX1X7HAwAgx6F0A/hDFS+uqGE3D9PGBzfqgToP6IPVH+jKN69Umwlt9O32b/2OBwBAjkHpBvCXShcurVdueEWbH9ysx657TJ9v/Fzxb8er6ftNNX/LfL/jAQAQ9CjdAM5ZiYIl9HTDp/Vjnx/1/N+f15IdS1R/ZH21mdCGBy4BAPgTlG4A561wZGE9eu2j2vzQZj3X8Dl9vPZjVX2zqt5Z+o6cc37HAwAg6FC6AVywAnkKqP91/bX83uWKuyROd027S03eb6KN+zb6HQ0AgKBC6QaQaZWLVVby7ckaeuNQLdy6UHFD4zTom0FKPZ3qdzQAAIICpRtAlgizMN0Tf49W9VqlBuUaqO/svqr3Tj2t3LXS72gAAPiO0g0gS11a5FJN7zRdY24Zow37NqjmWzX1VPJTOpF6wu9oAAD4htINIMuZmTrHddb3vb5Xuyvb6cl5T6rmWzW1cOtCv6MBAOALSjcAz5QoWEJjbhmjjzp9pF+P/6prRlyjvrP66vCJw35HAwAgW1G6AXjuxso3alWvVbon/h4NWjBIlw+5XO8sfUenTp/yOxoAANmC0g0gWxSOLKw3b3xTX9zxhWIKxeiuaXep2tBqmrJ6Cu/2BgDkepRuANnq2jLXasFdC/RB+w902p3WLRNu0d/e+ZvmbZ7ndzQAADxD6QaQ7cxMt1xxi1b2Wqm3b35bP/36kxJHJar5mOb6bud3fscDACDLeVq6zaypma0xs/Vm9ugfbNPezL43s1VmNjbdeKqZLQss09KNlzezhYFjjjezvF6eAwDvRIRFqHvN7lp3/zq92OhFLdi6QFe/dbW6Tu6qTfs2+R0PAIAs41npNrNwSUMkNZNUVVInM6t61jaVJPWXVM85d6Wkh9KtPuqcqxFYWqQb/4+kQc65ipL2SbrLq3MAkD3y58mvfvX6acMDG/RIvUc0efVkVXmjih745AHtOrzL73gAAGSal1e6a0ta75zb6Jw7ISlJUsuztukhaYhzbp8kOef+9P9dzcwkNZQ0KTA0SlKrLE0NwDdF8xfV842e1/oH1uuOGnfozcVvqsKrFTRg7gAdOH7A73gAAFwwL0t3rKSf0n3eGhhLr7Kkymb2lZktMLOm6dblM7OUwPiZYl1M0n7n3Jn3jGV0TAA5XEyhGL1181ta1WuVmlVqpoHzB6rCqxX0yjev6NipY37HAwDgvJlXr+oys7aSmjrnugc+3yqpjnOud7ptPpJ0UlJ7SaUlzZcU55zbb2axzrltZlZB0hxJf5f0q6QFgVtLZGaXSvrEOXdVBt/fU1JPSYqOjq6VlJSU6XM6dOiQoqKiMn0c5AzMd/BYc3CNhm8arpR9KSoRWULdynZT05JNFW7hWfYdzHfoYc5DC/MdWvya7wYNGnzrnIvPaF2Eh9+7TdKl6T6XDoylt1XSQufcSUmbzGytpEqSFjvntkmSc26jmSVLulrSB5IuMrOIwNXujI6pwH7DJA2TpPj4eJeYmJjpE0pOTlZWHAc5A/MdPBKVqLt1t+Zumqv+n/fXS2tf0rQ90/R0g6fVtmpbhVnm/6Md8x16mPPQwnyHlmCcby9vL1ksqVLgbSN5JXWUNO2sbaZKSpQkMyuutNtNNppZUTOLTDdeT9L3Lu2y/FxJbQP7d5P0oYfnACCINCjfQN/c9Y0+7Pih8obnVYdJHRQ/LF6frPuEH9gBAAQ1z0p34Ep0b0mzJK2WNME5t8rMBprZmbeRzJK0x8y+V1qZ7uec2yPpCkkpZvZdYPwF59z3gX0ekdTXzNYr7R7vEV6dA4DgY2ZqUaWFlt29TKNbj9b+Y/vVfGxz1R9ZX1/9+NUFHdM5p1SXmsVJAQD4/7y8vUTOuRmSZpw19kS6v52kvoEl/TZfS4r7g2NuVNqbUQCEsPCwcHWt1lXtr2yv4UuG6+n5T+vad6/VjZVu1LMNn1X1ktV15OQR/XzoZ+04tEM7D+38nyX92M+HflaB8AKaWWmm6pau6/epAQByIU9LNwB4LW94XvVK6KVu1bvp9UWv6z9f/UdXv3W1CkUWyvA1g2EWpksKXqKSUSVVKqqU4i6JU8mokhqVMko3vH+DZnWdRfEGAGQ5SjeAXKFg3oJ69NpHdXetuzVk8RDtPrJbJaNK/raUiiqlklElVbxAcYWH/f6tJ1efulr91/SneAMAPEHpBpCrFM1fVI9f//h571cisoSSb09W4shE3fD+DZrddbbqlK7jQUIAQCjy8u0lAJCjlC5cWsm3J6tEgRJq8n4TLdy60O9IAIBcgtINAOmULlxac7vNpXgDALIUpRsAznJpkUsp3gCALEXpBoAMnCnexQsUV5P3m2jRtkV+RwIA5GCUbgD4A5cWuVTJ3ZJVvEBxNR7dmOINALhglG4A+BMUbwBAVqB0A8BfSF+8m4zmVhMAwPmjdAPAOThzj3exAsUo3gCA80bpBoBzVKZImf8p3k/Pe1rT1kzT5v2b5ZzzOx4AIIjxi5QAcB7OFO82E9roieQnfhsvHFlYcZfEqVp0td+WuEviVCiykI9pAQDBgtINAOepTJEyWtxjsQ6dOKSVu1Zq+c/Lf1vGrhiroSlDf9u2QtEKaSX8kmpqclkT1StTz8fkAAC/ULoB4AJF5Y1S3dJ1Vbd03d/GnHP66cBPWv7zcn238zst35VWxqetmaaB8wfq2YbPqv+1/WVmPiYHAGQ3SjcAZCEzU5kiZVSmSBndVPmm38YPnTikez66R4/NeUwrd63UiBYjlD9Pfh+TAgCyEw9SAkA2iMobpdGtR+v5vz+vpJVJun7k9dp2YJvfsQAA2YTSDQDZxMz06LWPakqHKVr9y2olvJ2gxdsW+x0LAJANKN0AkM1aXt5S39z1jSIjInX9yOs1bsU4vyMBADxG6QYAH8RFx2lR90VKiElQ58md9djnj+m0O+13LACARyjdAOCTEgVL6LPbPlP3q7vruS+f0y3jb9HB4wf9jgUA8AClGwB8lDc8r4bdPEyvNn1V09dOV7136mnz/s1+xwIAZDFKNwD4zMz0QJ0H9EmXT/Tjrz8q4e0EfbHlC79jAQCyEKUbAIJEk8uaaGH3hbo4/8X6+3t/14glI/yOBADIIpRuAAgiVYpX0YK7FiixXKK6T++uZ+c/63ckAEAWoHQDQJApmr+oZnSZoa7VuurxuY/rhS9f8DsSACCT+Bl4AAhCEWERGtlypFJPp6r/5/0VERahf/7tn37HAgBcIEo3AASp8LBwvdf6PaW6VPX7tJ/CLVx9runjdywAwAWgdANAEIsIi9D7rd9X6ulU9Z3dV+Fh4XqgzgN+xwIAnCfu6QaAIJcnPI/GtRmn1pe31oMzH9SQRUP8jgQAOE+UbgDIAfKE51FS2yS1rNJSvT/prf+m/NfvSACA80DpBoAcIm94Xk1oN0E3Vb5J9358r97+9m2/IwEAzhGlGwBykLzheTWp3SQ1q9hMPT/qqXeWvuN3JADAOaB0A0AOExkRqckdJuuGy25Q92ndNWrZqHPe97Q7rcXbFuuZ+c/o2neuVamXS2nwgsFKPZ3qYWIAAG8vAYAcKF9EPk3pMEUtk1rqjg/vUHhYuLpW65rhtjsP7dTsDbM1c/1MfbrxU+0+sluSFB8Tr8uLX64+s/po7IqxGt5iuKpFV8vO0wCAkEHpBoAcKn+e/JracapuHnezuk3tpjALU+e4zjqRekJf//S1Zq6fqVkbZmnZzmWSpOiC0WpWsZmaVmyqxhUaq0TBEnLOKWllkh6c+aBqDaulh//2sP5d/9/KF5HP57MDgNyF0g0AOViBPAU0reM03TTuJt065VaN+m6Uvv7pax06cUgRYRGqd2k9Pf/353XDZTeoesnqCrP/vavQzNQprpOaXNZE/5j9Dz335XOa+P1EvX3z26pfrr5PZwUAuQ+lGwByuIJ5C+qjTh+p8+TOWrVrlW6tdqtuuOwGNSzfUIUiC53TMYoVKKaRrUaqS1wX3f3R3UoclageNXvoxcYv6qJ8F3l8BgCQ+1G6ASAXKJi3oD7s+GGmj9P4ssZa2Wulnkx+Ui9/87Kmr52uN5q9oVuuuEVmlgVJASA08fYSAMD/KJCngF5s/KIW91isUlGl1HZiW7Ue31rbDmzzOxoA5FiUbgBAhmqWqqlFPRbpxUYvataGWar6ZlUNXTxUp91pv6MBQI5D6QYA/KGIsAj1q9dPK+9dqYSYBPWa0UuVXq+kf8/5t37Y/YPf8QAgx/C0dJtZUzNbY2brzezRP9imvZl9b2arzGxsYKyGmX0TGFtuZh3SbT/SzDaZ2bLAUsPLcwAASJddfJk+vfVTJbVJUoWiFfTcl8/piiFXqNawWnrlm1e0/eB2vyMCQFDzrHSbWbikIZKaSaoqqZOZVT1rm0qS+kuq55y7UtJDgVVHJN0WGGsqabCZpX98vp9zrkZgWebVOQAA/j8zU4erOujTWz/V1j5b9UqTV2Qy/WP2P3TpoEvV6L1Genfpu/r12K9+RwWAoOPlle7aktY75zY6505ISpLU8qxtekga4pzbJ0nOuV2Bf651zq0L/L1d0i5JJTzMCgA4D6UKlVKfa/oopWeKfrjvBz123WPavH+z7px2p6Jfila7ie009YepOn7quN9RASAoeFm6YyX9lO7z1sBYepUlVTazr8xsgZk1PfsgZlZbUl5JG9INPxu47WSQmUVmdXAAwLmrUryKBjYYqHX3r9OCuxaoZ62emrd5nlqPb61SL5fS3dPv1qJti+Sc8zsqAPjGvPofQTNrK6mpc6574POtkuo453qn2+YjSScltZdUWtJ8SXHOuf2B9aUkJUvq5pxbkG5sp9KK+DBJG5xzAzP4/p6SekpSdHR0raSkpEyf06FDhxQVFZXp4yBnYL5DC/OdtVJdqr7d960++/kzfbH7Cx07fUwVClbQjaVuVKNLGqlwnsJ+R2TOQwzzHVr8mu8GDRp865yLz2idl6X7GklPOuduCHzuL0nOuefTbfNfSQudc+8GPn8u6VHn3GIzK6y0wv2cc27SH3xHoqR/Oudu+rMs8fHxLiUlJdPnlJycrMTExEwfBzkD8x1amG/vHDh+QONWjNPwpcOVsj1FkeGRalO1jbpf3V31y9X/3U/TZxfmPLQw36HFr/k2sz8s3V7+L91iSZXMrLyZ5ZXUUdK0s7aZKikxELK40m432RjYfoqk984u3IEr3bK0n0ZrJWmlh+cAAMikwpGFdXf83VrcY7GW3r1UPWr20Ix1M9TwvYaq/HplvfDlC9pxcIffMQHAU56VbufcKUm9Jc2StFrSBOfcKjMbaGYtApvNkrTHzL6XNFdpbyXZo7TbTa6XdHsGrwYcY2YrJK2QVFzSM16dAwAga9UoWUOvN39d2/tu1+jWo1W6cGn1/7y/Lh10qVoltdJHaz/SqdOn/I4JAFkuwsuDO+dmSJpx1tgT6f52kvoGlvTbvC/p/T84ZsOsTwoAyE758+RX12pd1bVaV63ds1bvLH1HI5eN1IdrPlRMoRjVia2jcheVU/mLyqt80fK//V0wb0G/owPABfG0dAMA8FcqF6usFxq9oKcbPK2P132s0ctHa/UvqzVz/UwdPXX0f7YtUaDE/5Tw8hel/V29ZHWVjCrp0xkAwF+jdAMAgkKe8DxqdXkrtbq8lSTJOaddh3dp0/5N2rRvkzbv35z29/5NWrJjiaasnqKTp09KksItXG2rttUDdR7QNaWvUdpjPwAQPCjdAICgZGaKjopWdFS06pau+7v1qadTtf3gdm3av0nT1kzT8CXDNX7VeNUqVUsP1HlAHa7soMgIfsoBQHDw5z1NAABkUnhYuC4tcqmuL3u9Xmrykrb23ao3m7+pwycPq9vUbiozuIwGzB3Am1EABAVKNwAgV4jKG6V7E+7V972+1+yus1U7traenv+0ygwuoy6Tu2jh1oV+RwQQwijdAIBcxczU+LLGmt5putbev1b3Jdyn6Wumq+6Iuqo7vK7GrhirE6kn/I4JIMRQugEAuVbFiytqcNPB2tZ3m15v9rr2HdunLpO7qMygMnp69dN6beFrWrRtUVCU8KMnj8qrX4kG4D8epAQA5HqFIgupd+3e6pXQS7M3zNY7S9/R3PVzNWfmHElSZHikapaqqbql6/62XFr40mx5C4pzTiOWjlCfWX2UWC5RE9tNVL6IfJ5/L4DsRekGAISMMAtT04pN1bRiUyUnJ6tizYpasHXBb8vQlKEatGCQJKlUVKn/KeG1Y2tneRnefnC7uk/rrk/Wf6Lq0dX10dqP1GJcC03tOFUF8hTI0u8C4C9KNwAgZJUuXFptq7ZV26ptJUknU09q+c/L00r4trQiPuWHKZLSSvhj1z2mHrV6KG943kx9r3NO41aOU+8ZvXXs1DG91vQ13Vf7Po1aNkp3TbtLN429SdM7TecXOIFchHu6AQAIyBOeR7Viaum+2vdpdOvRWnf/Ov3S7xdN7TBVFS+uqN6f9FaVN6po5LKROnX61AV9xy+Hf1G7ie3UZXIXVSleRcvuWab769yvMAvTHVffodGtR2velnlqOqapDhw/kMVnCMAvlG4AAP5E8QLF1fLylpp3+zzN7DJTxfIX0x0f3qGr3rxKE1ZN0Gl3+pyP9eEPH+qqoVdp+trpeuHvL+jLO75U5WKV/2ebLtW6KKlNkr756Rs1Gd1E+4/tz+pTAuADSjcAAOfAzHRDxRu0uMdiTW4/WeFh4eowqYNqDaulj9d+/KdvHtl/bL+6Te2mVuNbKaZQjFJ6pOiRax9ReFh4htu3u7KdJrWfpCU7lqjRe4209+her04LQDahdAMAcB7MTK2vaK3l9yzX6NajdeD4Ad007ibVe6ee5m6a+7vtP93wqeKGxmnM8jH69/X/1sLuCxUXHfeX39Pq8laa0mGKVu5aqYajGuqXw794cToAsgmlGwCACxAeFq6u1brqh/t+0Fs3vaUff/1RDd9rqEbvNdLCrQt16MQh9fq4l5q830RReaP0zV3faGCDgef1EOaNlW/UtE7TtGbPGjUY1UA7D+28oKwp21PUY1oPFXuxmBJHJmr4kuHctgJkM0o3AACZkCc8j3rW6ql196/TK01e0Xc/f6e6I+qq7OCy+m/Kf9W3bl8t6blECbEJF3T8Jpc10cedP9am/ZuUODJR2w5sO6f9Dh4/qLdS3lKtYbWU8HaCxq4cq8YVGmvHoR3qMb2Hol+K1i3jb9EH33+gY6eOXVA2AOeOVwYCAJAF8ufJrz7X9FH3mt316sJX9eWPX+pf1/1L15e9PtPHbli+oWZ2manmY5ur/sj6mtNtjsoUKZPhtkt2LNFbKW9p7MqxOnTikKpFV9OQ5kPUJa6LiuQrIuecvt3xrcYsH6OkVUma8sMUFYksojZXtFHXav+vvfuOj6rK+zj++aUQSADpEDpi6G0hICxKe+hEyYoQEQQLdYEFZG3PithYdFEfV1AUWIq7IKB0EBEURJcmUpa2NJVFyqIEgYDUnOePuWJEMAnMZFK+79drXnPvufee+5ucVyZfLmfmdqdp+aaEmK7JifibQreIiIgf5YvIx5NNnvR7v7eXu51l9y2jzT/a+IJ3j4+pULACAEnnk3hn6zuM3zieDYc2kCcsDwk1Euhbry+3lrr1Z3fWNDNiS8YSWzKW0a1Hs+KrFfxj6z+YtWMWkzZPolS+UnSt0ZVutbpRu3jtDLkrp0hOoNAtIiKSRTQs3ZCPenxE67+3psmUJrzZ4U0W7V7EtK3TOHX+FDWK1WBMuzF0r9WdArkLpNpfWEgYrSq2olXFVozrMI6FuxYybes0Xl33Ki+teYlqRavR+ubWFIksQqE8hSgcWdj3nKfw5fWo8CgFc5E0UOgWERHJQmJLxvJxz49p9fdWxL0TR+6w3HSp3oW+9frSqHSj6w7AkeGRJNRIIKFGAsfOHOPdHe8ybes0JmycwOkLp695XK7QXBTKU+hyGI/OF83QhkNpWLrh9b5EkWxJoVtERCSLqVOiDp898Bmr9q+iU7VOFMpTyK/9F44sTL/YfvSL7QfAuYvnSPwhkcQfEjn2wzHf85ljP1tOPOt7XvHVCmZtn0XP2j0Z9T+jiM4X7dfaRLIqhW4REZEsqHKRylQuUjlDzhURFkF0vug0BehT507x50//zCtrX2HOzjkMbzKcwQ0Hp+urEkWyI308WURERPwmX0Q+RrUcxbb+22havimPLn+UmuNqsmTPkmCXJhJUCt0iIiLidzGFY1jYdSHv3/s+AO2ntyduehx7ju0JcmUiwaHQLSIiIgHTLqYdW/tv5aVWL7Fq/yqqv1Gdx5c/zqlzp4JdmkiGUugWERGRgMoVmothvx3G7kG76V6rOy/+80Uqj63M37f8nWSXHOzyRDKEQreIiIhkiBJ5SzCp4yTW9VpH2ZvK0mNeDxpPaswnX3+Ccy7Y5YkElEK3iIiIZKgGpRqw+qHVTOk4ha+//5pmU5tR/Y3qvLr2VRJ/SAx2eSIBodAtIiIiGS7EQuhZpyf7/rCPyR0nkz8iP0OXDqXUK6XoOa8nqw+s1tVvyVYUukVERCRoIsMjub/O/azttZbNfTfzQJ0HmLtzLo0nNabWm7UYu34sJ86eCHaZIjdMoVtEREQyhdolavNGhzc4NOwQ4+PGExEawaAlg4h+OZoH5z/Ium/W6eq3ZFkK3SIiIpKp5M2Vl971erOhzwY29N5A91rdmbV9Fg3/1pC64+vy+vrX2Ze4TwFcshTdBl5EREQyrXol6zG+5Hheav0S0/41jbe+eIuBSwYCUPamsjQv35wWFVrQokILSucvHeRqRa5NoVtEREQyvfwR+elfvz/9Yvux69guPv7qY1Z8vYJFuxcxdctUAGIKxVwO4c0rNKdYVLEgVy3yE4VuERERyTLMjCpFqlClSBV+X//3WUknGQAAEzlJREFUJLtktv536+UQPmP7DMZvHA9AjWI1LofwqOSoIFcuOZ1Ct4iIiGRZIRZC7RK1qV2iNkMbDeVi8kU2Ht54OYRP3DiRMevHULdAXW5vcju5w3IHpI5vT39LkcgimFlA+pesTx+kFBERkWwjLCSMBqUa8Phtj7O0+1KOP3acNzu8ycbvN9Ll3S5cuHTB7+d8ff3rFHupGMNXDPd735J9KHSLiIhIthURFkHf2L4MiRnCwt0LuW/ufVxKvuS3/l9Z8woDlwykRN4SjPx0JDO3zfRb35K9KHSLiIhIttexZEf+0vIvzNw+kz4L+5Dskm+4z5GrRjLsw2F0rtaZvYP2clvZ23hg/gN8cegLP1Qs2Y1Ct4iIiOQIjzR+hKeaPMWkzZMY+sHQ6/6eb+ccwz8ezpMrnqR7re5M7zSdqFxRzO4ymyKRRYifGc+RpCN+rl6yOoVuERERyTGebvY0QxsO5bX1r13XHGznHI8tf4znP32eXr/pxZSOUwgL8X0vRbGoYizouoBjZ47RaVYnzl085+/yJQtT6BYREZEcw8x4ufXL9Knbh5GfjuSFz15I87HJLpnBHwxm9OrRDKg/gLfueIvQkNCf7VOnRB2mxk9l9YHV9F/cX3fNlMsCGrrNrK2Z7TKzvWb2+DX26WJmO8xsu5lNT9He08z2eI+eKdrrmdlWr8/XTN/NIyIiIulgZrzR4Q3urXkvT3z0BGPXj031mGSXTL9F/RizfgzDGg1jTLsxhNjVY1Tn6p0Z3mQ4kzdP5rV1r/m7fMmiAha6zSwUeB1oB1QDuppZtSv2iQGeABo756oDQ7z2QsAI4FagATDCzAp6h40DegMx3qNtoF6DiIiIZE+hIaFM6TiF+CrxDFoyiMmbJl9z34vJF3lg/gNM2DiBP93+J0a3Gp3q93E/3exp4qvE8/CHD7Ns37IbqvX8pfOMXDWSymMrM3jJYPYc23ND/UlwBPJKdwNgr3PuS+fceWAG0PGKfXoDrzvnjgM454567W2AZc65RG/bMqCtmUUD+Z1za53v/2veBuID+BpEREQkmwoPDWdGpxm0rtiaXgt7MWv7rF/sc+HSBbrP6c7bW97muebP8XyL59N0A5wQC+Ht+LepVrQaCe8lXHdQXvfNOmLHx/Lkiie5KeImxm0YR6WxlWg/rT1L9izxy7ewnL90nsW7F9Njbg9aTG3B0dNHUz9I0i2QobsUcCDF+jdeW0qVgEpm9k8zW2tmbVM5tpS3/Gt9ioiIiKRJRFgEcxPm0rhMY7rN6cai3Ysubzt38Rxd3uvCzO0zGd1qNE82eTJdfeeLyMeCexYQYiF0nNGRk+dOpvnYpPNJDPlgCI3+1ojjZ4+z4J4FrO+9nv1D9vN006fZdGQT7ae3p8rYKvx17V85cfZEumq7cOkCS/cu5cH5D1L8peLEvRPHwt0LWfPNGu545w5Onz+drv4kdRaoCf5mdjfQ1jnXy1u/D7jVOTcwxT6LgAtAF6A0sAqoCfQCcjvnnvf2Gw78AKwEXnDOtfTabwcec87FXeX8fYA+AMWLF683Y8aMG35NSUlJ5M2b94b7kaxB452zaLxzHo15zpLaeJ++eJph/xrGl0lfMqrmKGrkr8GIHSNYl7iOP9zyB35X6nfXfe5Nxzfxx3/9kQaFGvB8jecJtdBf3X/tsbW8uudVjp47SseSHelVoRdRYVE/2+dC8gVWfbeKuQfnsv3kdnKH5KZNiTb8ruTvKBdV7qr9XnKX2Pz9ZlZ8u4JPv/2UkxdPEhkaSeMijWletDmxBWNZl7iOEdtH0LBwQ56t/myqtWZWwfr9bt68+RfOudirbQsL4HkPAmVSrJf22lL6BljnnLsAfGVmu/HN0z4INLvi2JVee+lU+gTAOTceGA8QGxvrmjVrdrXd0mXlypX4ox/JGjTeOYvGO+fRmOcsaRnvhr9tSLOpzRixcwS1itdifeJ6xseNp3e93jd07mY0I6J0BAPeH8DyS8sZ1XLUVfc7evooQz4Ywjvb3qFa0WrMuWMOvy3z22v224pWPMdzbDi0gTHrxzBj2wzmH5pPy5tbMqjBIDrEdADgs/98xsztM5m9czZHTx8lKjyKO6vcSUL1BNrc0obcYbl/1mfBsgUZuGQgc87MYWz7sWmaTpPZZMbf70CG7s+BGDOrgC8Y3wPce8U+84CuwGQzK4JvusmXwD7gzyk+PNkaeMI5l2hmJ82sIbAO6AGMCeBrEBERkRyicGRhlt23jNsn3866g+uYEj+FHrV7+KXv/rH92XJkCy/88wVqFq/JvTV/ikTOOd7e8jYPf/gwSeeTeKbZMzzW+DEiwiLS1HdsyVimxk9ldKvRTPhiAuM2jKPjjI6UL1CecxfPcTjpMHnC8hBXKY6E6gm0i2lHZHjkNfsb0GAA+0/sZ/Tq0ZQrUI5HGz96w69fAhi6nXMXzWwgsBQIBSY557ab2bPABufcAm9bazPbAVwCHnHOHQMws+fwBXeAZ51zid7y74EpQB5gifcQERERuWEl8pZg7UNrOXDyAHVK1PFbv2bGmPZj2PndTh5a8BCVClcitmQs+xL30W9xP5Z/uZzGZRoz4Y4JVC1a9brOUSyqGH9q8icebfwo8/49j4mbJhIVHkWX6l2IqxRH3lxpn27xQssXOHDyAI8tf4wy+cvQtWbX66pJfhLIK904594H3r+i7akUyw542HtceewkYNJV2jcANfxerIiIiAi+K96FIwv7vd9cobmY3WU29SfUJ35GPH3r9WXUZ6MICwljXIdx9KnX55rf/Z0e4aHhdK7emc7VO193HyEWwpSOUzh06hD3z7+fkvlK0rR80xuuLSfTHSlFREREMkjRqKLMv2c+x88e56mVT9G6Ymt2DthJv9h+fgnc/hQRFsG8hHlULFiR+Jnx7Ph2R7BLytIy1+iKiIiIZHO1S9Rm+X3LWXzvYuYmzKVU/sz77ccF8xRkSbcl5A7LTbtp7Th06lCwS8qyFLpFREREMlijMo1oH9M+S3wzSLkC5Vh872KOnTlGh+kdOHXuVLBLuqYzF86w7eg29ibtDXYpvxDQOd0iIiIikvXVja7Le13eI256HJ3f7czCrgsJDw1P8/GXki+x5ps1zNk5h33H91EiqgTR+aKJzhtNibw/LRfPW5xcobl+ta/EHxLZl7iPvYl72Xd8n+/hrR9OOgzAbwr8hl70uqHX7G8K3SIiIiKSqra3tOWtuLfotbAX/Rb1Y+KdE3/1Sv2FSxf4ZP8nzN4xm3m75nEk6Qi5QnMRUyiGNQfW8N2Z73D88iaNRSKL+IJ43mii80VTOE9hDp06dDlkf3/2+5/tXzJfSSoWrEibW9pQsWBFKhasyOn9me+OmgrdIiIiIpImD9V9iP0n9vPcqucoV6AcTzV96mfbz148y7J9y5jz7zks2LWAxB8SiQyPpH1MezpV7UT7mPbkj8gP+EL50dNHOZx0mMOnDnMk6cjl5cNJvseuY7v47sx3ROeN5pZCt3BrqVupWMgXrCsWqsjNBW++6neOrzy2MiN+HOmi0C0iIiIiafZMs2f4z4n/MGLlCMreVJa7q93Nkj1LmL1zNov3LCbpfBI3RdzEnZXv5K6qd9GmYhvyhOf5RT/hoeGUyl8qU3+Q1J8UukVEREQkzcyM8XeM5+Cpg/Ra0Iv+i/tz9uJZikYWpWuNrnSq2onmFZqnOjc7p1HoFhEREZF0+fFGP70W9CI6bzR3Vb2L28reRmhIaLBLy7QUukVEREQk3fJH5GdW51nBLiPL0Pd0i4iIiIgEmEK3iIiIiEiAKXSLiIiIiASYQreIiIiISIApdIuIiIiIBJhCt4iIiIhIgCl0i4iIiIgEmEK3iIiIiEiAKXSLiIiIiASYQreIiIiISIApdIuIiIiIBJhCt4iIiIhIgCl0i4iIiIgEmEK3iIiIiEiAKXSLiIiIiASYQreIiIiISIApdIuIiIiIBJhCt4iIiIhIgJlzLtg1BJyZfQvs90NXRYDv/NCPZA0a75xF453zaMxzFo13zhKs8S7nnCt6tQ05InT7i5ltcM7FBrsOyRga75xF453zaMxzFo13zpIZx1vTS0REREREAkyhW0REREQkwBS602d8sAuQDKXxzlk03jmPxjxn0XjnLJluvDWnW0REREQkwHSlW0REREQkwBS608DM2prZLjPba2aPB7se8T8zm2RmR81sW4q2Qma2zMz2eM8Fg1mj+I+ZlTGzFWa2w8y2m9lgr11jng2ZWW4zW29mW7zxfsZrr2Bm67z39plmlivYtYr/mFmomW0ys0XeusY7mzKzr81sq5ltNrMNXlumez9X6E6FmYUCrwPtgGpAVzOrFtyqJACmAG2vaHsc+Mg5FwN85K1L9nARGOacqwY0BAZ4v9ca8+zpHNDCOVcbqAO0NbOGwIvA/znnbgGOAw8FsUbxv8HAzhTrGu/srblzrk6KrwnMdO/nCt2pawDsdc596Zw7D8wAOga5JvEz59wqIPGK5o7AVG95KhCfoUVJwDjnDjvnNnrLp/D9YS6Fxjxbcj5J3mq493BAC+A9r13jnY2YWWmgAzDRWzc03jlNpns/V+hOXSngQIr1b7w2yf6KO+cOe8tHgOLBLEYCw8zKA78B1qExz7a8qQabgaPAMmAf8L1z7qK3i97bs5dXgUeBZG+9MBrv7MwBH5rZF2bWx2vLdO/nYcEuQCQrcM45M9NX/WQzZpYXmA0Mcc6d9F0M89GYZy/OuUtAHTMrAMwFqgS5JAkQM4sDjjrnvjCzZsGuRzLEbc65g2ZWDFhmZv9OuTGzvJ/rSnfqDgJlUqyX9tok+/uvmUUDeM9Hg1yP+JGZheML3NOcc3O8Zo15Nuec+x5YATQCCpjZjxef9N6efTQG7jSzr/FNCW0B/BWNd7blnDvoPR/F94/qBmTC93OF7tR9DsR4n3rOBdwDLAhyTZIxFgA9veWewPwg1iJ+5M3v/Buw0zn3SopNGvNsyMyKele4MbM8QCt88/hXAHd7u2m8swnn3BPOudLOufL4/mZ/7JzrhsY7WzKzKDPL9+My0BrYRiZ8P9fNcdLAzNrjmx8WCkxyzo0MckniZ2b2DtAMKAL8FxgBzANmAWWB/UAX59yVH7aULMjMbgM+Bbby05zP/8U3r1tjns2YWS18H6QKxXexaZZz7lkzuxnfldBCwCagu3PuXPAqFX/zppf80TkXp/HOnrxxneuthgHTnXMjzawwmez9XKFbRERERCTANL1ERERERCTAFLpFRERERAJMoVtEREREJMAUukVEREREAkyhW0REREQkwBS6RUQymJk5M3s5xfofzexpP/U9xczuTn3PGz5PZzPbaWYrAn2uK857v5mNzchzioj4g0K3iEjGOwfcZWZFgl1ISinu1pcWDwG9nXPNA1WPiEh2otAtIpLxLgLjgaFXbrjySrWZJXnPzczsEzObb2ZfmtkLZtbNzNab2VYzq5iim5ZmtsHMdptZnHd8qJmNNrPPzexfZtY3Rb+fmtkCYMdV6unq9b/NzF702p4CbgP+Zmajr3LMIynO84zXVt7M/m1m07wr5O+ZWaS37X/MbJN3nklmFuG11zez1Wa2xXud+bxTlDSzD8xsj5n9Jd0/fRGRIFDoFhEJjteBbmZ2UzqOqQ30A6oC9wGVnHMNgInAoBT7lQcaAB2AN80sN74r0yecc/WB+kBvM6vg7V8XGOycq5TyZGZWEngRaAHUAeqbWbxz7llgA9DNOffIFce0BmK889cB6plZE29zZeAN51xV4CTwe6+2KUCCc64mvjvK9TezXMBMr67aQEvgB6+fOkACUBNIMLMy6fgZiogEhUK3iEgQOOdOAm8Df0jHYZ875w57t67eB3zotW/FF7R/NMs5l+yc2wN8CVQBWgM9zGwzvtvdF8YXjgHWO+e+usr56gMrnXPfOucuAtOAJlfZL6XW3mMTsNE794/nOeCc+6e3/A98V8srA18553Z77VO9c1QGDjvnPgffz8urAeAj59wJ59xZfFfny6VSk4hI0KVn/p6IiPjXq/iC6eQUbRfxLoiYWQiQK8W2cymWk1OsJ/Pz93N3xXkcYMAg59zSlBvMrBlw+vrKvyoDRjnn3rriPOWvUdf1SPlzuIT+lolIFqAr3SIiQeKcSwRm4Zv68aOvgXre8p1A+HV03dnMQrx53jcDu4Cl+KZthAOYWSUzi0qln/VAUzMrYmahQFfgk1SOWQo8aGZ5vfOUMrNi3rayZtbIW74X+MyrrbyZ3eK13+edYxcQbWb1vX7ypfODniIimYrewEREgutlYGCK9QnAfDPbAnzA9V2F/g++wJwf6OecO2tmE/FNQdloZgZ8C8T/WifOucNm9jiwAt8V7MXOufmpHPOhmVUF1vhOQxLQHd8V6V3AADObhG9ayDivtgeAd71Q/TnwpnPuvJklAGPMLA+++dwtr+NnISKSKZhz1/u/eyIiImnjTS9Z5JyrEeRSRESCQtNLREREREQCTFe6RUREREQCTFe6RUREREQCTKFbRERERCTAFLpFRERERAJMoVtEREREJMAUukVEREREAkyhW0REREQkwP4fO4ohYiqbwJ0AAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "LF2ux-UCmD0V",
+ "outputId": "dfb9f092-0680-40aa-f318-4d8c8df19ca8"
+ },
+ "source": [
+ "correct_test = 0\n",
+ "total_test = 0\n",
+ "\n",
+ "with torch.no_grad():\n",
+ "\n",
+ " for inputs, labels in testloader:\n",
+ " \n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " \n",
+ " outputs = net_1D_conv(inputs)\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ "\n",
+ " \n",
+ " total_test += labels.size(0)\n",
+ " correct_test += (predicted == labels).sum().item()\n",
+ " # print(f'Correct = {correct}, total = {total}, percent = {correct / total}')\n",
+ "print(f'Accuracy of the network on the {X_test.shape[0]} test inputs = {round(100 * correct_test / total_test, 2)}%')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:33: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Accuracy of the network on the 2959 test inputs = 54.65%\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sUQ3aqH4FvXo"
+ },
+ "source": [
+ "### Если вдруг пропадут output-ы:\n",
+ "Accuracy of the network net_2D_conv on the 2959 test inputs = 54.65%"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "vCUnOhYbuzaZ"
+ },
+ "source": [
+ "### Считаю, что норм качество (не 20%)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "UK8VVWc-mcoU"
+ },
+ "source": [
+ "## Попробуем 2D свертки, посмотрим что из этого выйдет"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "xzRJg-I3xN6U"
+ },
+ "source": [
+ "X_tr = X_train[:, None, :, :]\n",
+ "X_te = X_test[:, None, :, :]"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "zlOuWvR7w9n4"
+ },
+ "source": [
+ "batch_size = 16\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_tr)\n",
+ "tensor_y = torch.LongTensor(y_train)\n",
+ "\n",
+ "train_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_te) # transform to torch tensor\n",
+ "tensor_y = torch.LongTensor(y_test)\n",
+ "\n",
+ "test_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "\n",
+ "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n",
+ " shuffle=True, num_workers=2, drop_last=True)\n",
+ "testloader = DataLoader(test_dataset, batch_size=batch_size,\n",
+ " shuffle=False, num_workers=2, drop_last=True)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "mkSsAMp6mbwu"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "\n",
+ "class Net_Conv2D(nn.Module):\n",
+ " def __init__(self, n_input=1, n_output=5, stride=5, n_channel=32):\n",
+ " super().__init__()\n",
+ " # TODO: define your layers here\n",
+ " self.conv1 = nn.Conv2d(n_input, n_channel, kernel_size=5)\n",
+ " nn.init.xavier_normal_(self.conv1.weight) # проинициализируем веса (так лучше учится)\n",
+ " self.bn1 = nn.BatchNorm2d(n_channel)\n",
+ " self.pool1 = nn.MaxPool2d(2)\n",
+ " self.conv2 = nn.Conv2d(n_channel, n_channel, kernel_size=5)\n",
+ " nn.init.xavier_normal_(self.conv2.weight)\n",
+ " self.bn2 = nn.BatchNorm2d(n_channel)\n",
+ " self.pool2 = nn.MaxPool2d(2)\n",
+ " self.conv3 = nn.Conv2d(n_channel, 2 * n_channel, kernel_size=3)\n",
+ " nn.init.xavier_normal_(self.conv3.weight)\n",
+ " self.bn3 = nn.BatchNorm2d(2 * n_channel)\n",
+ " self.conv4 = nn.Conv2d(2 * n_channel, 2 * n_channel, kernel_size=3)\n",
+ " nn.init.xavier_normal_(self.conv4.weight)\n",
+ " self.bn4 = nn.BatchNorm2d(2 * n_channel)\n",
+ " self.pool4 = nn.MaxPool2d(2)\n",
+ " self.conv5 = nn.Conv2d(2 * n_channel, 2 * n_channel, kernel_size=3)\n",
+ " nn.init.xavier_normal_(self.conv5.weight)\n",
+ " self.bn5 = nn.BatchNorm2d(2 * n_channel)\n",
+ " self.pool5 = nn.MaxPool2d(4)\n",
+ " self.flatten = nn.Flatten()\n",
+ " self.fc1 = nn.Linear(384, 128)\n",
+ " nn.init.xavier_normal_(self.fc1.weight)\n",
+ " self.fc2 = nn.Linear(128, n_output)\n",
+ " nn.init.xavier_normal_(self.fc2.weight)\n",
+ "\n",
+ " def forward(self, x):\n",
+ " # TODO: apply your layers here\n",
+ " x = F.relu(self.pool1(self.bn1(self.conv1(x))))\n",
+ " x = F.relu(self.pool2(self.bn2(self.conv2(x))))\n",
+ " x = F.relu(self.bn3(self.conv3(x)))\n",
+ " x = F.relu(self.pool4(self.bn4(self.conv4(x))))\n",
+ " x = F.relu(self.pool5(self.bn5(self.conv5(x))))\n",
+ " x = self.flatten(x)\n",
+ " # print(x.shape)\n",
+ " x = F.relu(self.fc1(x))\n",
+ " x = self.fc2(x)\n",
+ " return F.softmax(x)\n",
+ "\n",
+ "# net on 2D conv layers with 1 input channels\n",
+ "net_2D_conv = Net_Conv2D(n_input=1, n_output=5).to(device)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "oeMqFHSkmb0O"
+ },
+ "source": [
+ "import torch.optim as optim\n",
+ "\n",
+ "criterion_2D = nn.CrossEntropyLoss()\n",
+ "optimizer_2D = optim.Adam(net_2D_conv.parameters(), lr=0.01)\n",
+ "scheduler = optim.lr_scheduler.StepLR(optimizer_2D, step_size=10, gamma=0.4)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "a19f44b643f4454b98daca4e42b10b7c",
+ "a93352ea51c94fc99d7c5d5fe023aee6",
+ "c6c0731a16a24781afd7faf17a3bff6c",
+ "6c55603e66da4785a30280960a72a20a",
+ "4a313d8bc4e94b75952f528389045170",
+ "4ff688d03c6048d7a19310fb40d21ca8",
+ "0cad72e2ac37421baa14b1ef3f7b58d4",
+ "6090a61df15e4ec0b1de4971cd807560",
+ "078a2e7bcdd54661b16547c296804b63",
+ "e7a135a45cd84ab3b1a19aaeca6a205b",
+ "4470a2c5172049f08761dac43282b8c5"
+ ]
+ },
+ "id": "241tqwSEmb40",
+ "outputId": "1a67e9e2-9f89-4fe1-c4da-11c55526ab55"
+ },
+ "source": [
+ "from tqdm.notebook import tqdm\n",
+ "\n",
+ "losses_train = []\n",
+ "\n",
+ "for epoch in tqdm(range(30)): # loop over the dataset multiple times\n",
+ " epoch_loss = 0.0\n",
+ " running_loss = 0.0\n",
+ " for i, (inputs, labels) in enumerate(trainloader, 0):\n",
+ " # get the inputs; data is a list of [inputs, labels]\n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " # print(inputs.shape)\n",
+ " # zero the parameter gradients\n",
+ " optimizer_2D.zero_grad()\n",
+ "\n",
+ " # forward + backward + optimize\n",
+ " outputs = net_2D_conv(inputs)\n",
+ " # print(outputs)\n",
+ " loss = criterion_2D(outputs, labels)\n",
+ " loss.backward()\n",
+ " optimizer_2D.step()\n",
+ "\n",
+ " # print statistics\n",
+ "\n",
+ " running_loss += loss.item()\n",
+ " epoch_loss += loss.item()\n",
+ " if i % 200 == 199: # print every 200 mini-batches\n",
+ " print('[%d, %5d] loss: %.3f' %\n",
+ " (epoch + 1, i + 1, running_loss / 200))\n",
+ " running_loss = 0.0\n",
+ " losses_train.append(epoch_loss)\n",
+ " scheduler.step()\n",
+ "print('Finished Training')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "a19f44b643f4454b98daca4e42b10b7c",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/30 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:44: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 200] loss: 1.635\n",
+ "[1, 400] loss: 1.582\n",
+ "[2, 200] loss: 1.577\n",
+ "[2, 400] loss: 1.517\n",
+ "[3, 200] loss: 1.461\n",
+ "[3, 400] loss: 1.410\n",
+ "[4, 200] loss: 1.366\n",
+ "[4, 400] loss: 1.317\n",
+ "[5, 200] loss: 1.247\n",
+ "[5, 400] loss: 1.229\n",
+ "[6, 200] loss: 1.217\n",
+ "[6, 400] loss: 1.179\n",
+ "[7, 200] loss: 1.219\n",
+ "[7, 400] loss: 1.166\n",
+ "[8, 200] loss: 1.128\n",
+ "[8, 400] loss: 1.139\n",
+ "[9, 200] loss: 1.130\n",
+ "[9, 400] loss: 1.109\n",
+ "[10, 200] loss: 1.111\n",
+ "[10, 400] loss: 1.110\n",
+ "[11, 200] loss: 1.071\n",
+ "[11, 400] loss: 1.072\n",
+ "[12, 200] loss: 1.061\n",
+ "[12, 400] loss: 1.060\n",
+ "[13, 200] loss: 1.047\n",
+ "[13, 400] loss: 1.031\n",
+ "[14, 200] loss: 1.031\n",
+ "[14, 400] loss: 1.062\n",
+ "[15, 200] loss: 1.032\n",
+ "[15, 400] loss: 1.057\n",
+ "[16, 200] loss: 1.040\n",
+ "[16, 400] loss: 1.053\n",
+ "[17, 200] loss: 1.036\n",
+ "[17, 400] loss: 1.060\n",
+ "[18, 200] loss: 1.037\n",
+ "[18, 400] loss: 1.026\n",
+ "[19, 200] loss: 1.034\n",
+ "[19, 400] loss: 1.041\n",
+ "[20, 200] loss: 1.022\n",
+ "[20, 400] loss: 1.035\n",
+ "[21, 200] loss: 1.022\n",
+ "[21, 400] loss: 1.023\n",
+ "[22, 200] loss: 1.011\n",
+ "[22, 400] loss: 1.003\n",
+ "[23, 200] loss: 1.004\n",
+ "[23, 400] loss: 1.006\n",
+ "[24, 200] loss: 1.013\n",
+ "[24, 400] loss: 0.997\n",
+ "[25, 200] loss: 1.001\n",
+ "[25, 400] loss: 1.011\n",
+ "[26, 200] loss: 1.006\n",
+ "[26, 400] loss: 0.999\n",
+ "[27, 200] loss: 1.000\n",
+ "[27, 400] loss: 1.004\n",
+ "[28, 200] loss: 0.993\n",
+ "[28, 400] loss: 1.004\n",
+ "[29, 200] loss: 0.992\n",
+ "[29, 400] loss: 0.997\n",
+ "[30, 200] loss: 0.994\n",
+ "[30, 400] loss: 1.001\n",
+ "Finished Training\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dGYncaUy3JTi"
+ },
+ "source": [
+ "### Лосс падает еще нереальнее"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 513
+ },
+ "id": "vytIKpye2Svd",
+ "outputId": "5aa8226d-f1f8-4d9c-a75c-7b09846cf226"
+ },
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.xlabel('Number of epoch')\n",
+ "plt.ylabel('Loss')\n",
+ "plt.title('Loss of net_2D_conv')\n",
+ "plt.plot(range(1, 31), np.array(losses_train) / (X_train.shape[0] // batch_size), color='green')\n",
+ "plt.grid()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "W10HVF5A2hmc",
+ "outputId": "142c0d09-2cb1-4351-95ca-9ce7f0f18526"
+ },
+ "source": [
+ "correct_test = 0\n",
+ "total_test = 0\n",
+ "\n",
+ "with torch.no_grad():\n",
+ "\n",
+ " for inputs, labels in testloader:\n",
+ " \n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " \n",
+ " outputs = net_2D_conv(inputs)\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ "\n",
+ " # print(f'Predicted = {predicted}\\nLabels = {labels}\\n')\n",
+ " total_test += labels.size(0)\n",
+ " correct_test += (predicted == labels).sum().item()\n",
+ " # print(f'Correct = {correct}, total = {total}, percent = {correct / total}')\n",
+ "print(f'Accuracy of the network net_2D_conv on the {X_test.shape[0]} test inputs = {round(100 * correct_test / total_test, 2)}%')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:44: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Accuracy of the network net_2D_conv on the 2959 test inputs = 88.42%\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mbMdgnkCFi3l"
+ },
+ "source": [
+ "### Если вдруг пропадут output-ы:\n",
+ "Accuracy of the network net_2D_conv on the 2959 test inputs = 88.42%"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nfmZhQjM3PSq"
+ },
+ "source": [
+ "### Тут и говорить не о чем, далеко не 20%, качество - огонь! (менял параметры, лучше не получил)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4vN9YvRgDMbE"
+ },
+ "source": [
+ "## Попробуем VGG16"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "CJI8WLCvGBdS"
+ },
+ "source": [
+ "X_tr = X_train[:, None, :, :]\n",
+ "X_te = X_test[:, None, :, :]"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "gaBvSjO2DSWN"
+ },
+ "source": [
+ "batch_size = 128\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_tr)\n",
+ "tensor_y = torch.LongTensor(y_train)\n",
+ "\n",
+ "train_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_te) # transform to torch tensor\n",
+ "tensor_y = torch.LongTensor(y_test)\n",
+ "\n",
+ "test_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "\n",
+ "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n",
+ " shuffle=True, num_workers=2, drop_last=True)\n",
+ "testloader = DataLoader(test_dataset, batch_size=batch_size,\n",
+ " shuffle=False, num_workers=2, drop_last=True)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Q-7YiyAdDC5E"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "\n",
+ "class VGG16(nn.Module):\n",
+ " def __init__(self):\n",
+ " super(VGG16, self).__init__()\n",
+ " self.conv1_1 = nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv1_1.weight)\n",
+ " self.conv1_2 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv1_2.weight)\n",
+ "\n",
+ " self.conv2_1 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv2_1.weight)\n",
+ " self.conv2_2 = nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv2_2.weight)\n",
+ "\n",
+ " self.conv3_1 = nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv3_1.weight)\n",
+ " self.conv3_2 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv3_2.weight)\n",
+ " self.conv3_3 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv3_3.weight)\n",
+ "\n",
+ " self.conv4_1 = nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv4_1.weight)\n",
+ " self.conv4_2 = nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv4_2.weight)\n",
+ " self.conv4_3 = nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv4_3.weight)\n",
+ "\n",
+ " self.conv5_1 = nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv5_1.weight)\n",
+ " self.conv5_2 = nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv5_2.weight)\n",
+ " self.conv5_3 = nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1)\n",
+ " nn.init.xavier_normal_(self.conv5_3.weight)\n",
+ "\n",
+ " self.maxpool = nn.MaxPool2d(kernel_size=5, stride=2)\n",
+ "\n",
+ " self.fc1 = nn.Linear(512, 256)\n",
+ " nn.init.xavier_normal_(self.fc1.weight)\n",
+ " self.fc2 = nn.Linear(256, 128)\n",
+ " nn.init.xavier_normal_(self.fc2.weight)\n",
+ " self.fc3 = nn.Linear(128, 5)\n",
+ " nn.init.xavier_normal_(self.fc3.weight)\n",
+ "\n",
+ " def forward(self, x):\n",
+ " x = F.relu(self.conv1_1(x))\n",
+ " x = F.relu(self.conv1_2(x))\n",
+ " x = self.maxpool(x)\n",
+ " x = F.relu(self.conv2_1(x))\n",
+ " x = F.relu(self.conv2_2(x))\n",
+ " x = self.maxpool(x)\n",
+ " x = F.relu(self.conv3_1(x))\n",
+ " x = F.relu(self.conv3_2(x))\n",
+ " x = F.relu(self.conv3_3(x))\n",
+ " x = self.maxpool(x)\n",
+ " x = F.relu(self.conv4_1(x))\n",
+ " x = F.relu(self.conv4_2(x))\n",
+ " x = F.relu(self.conv4_3(x))\n",
+ " x = self.maxpool(x)\n",
+ " x = F.relu(self.conv5_1(x))\n",
+ " x = F.relu(self.conv5_2(x))\n",
+ " x = F.relu(self.conv5_3(x))\n",
+ " x = self.maxpool(x)\n",
+ " x = x.reshape(x.shape[0], -1)\n",
+ " x = F.relu(self.fc1(x))\n",
+ " x = F.dropout(x, 0.5)\n",
+ " x = F.relu(self.fc2(x))\n",
+ " x = F.dropout(x, 0.5)\n",
+ " x = self.fc3(x)\n",
+ " return x\n",
+ "\n",
+ "net_vgg = VGG16().to(device)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "YKBLShu_DZMO"
+ },
+ "source": [
+ "import torch.optim as optim\n",
+ "\n",
+ "criterion_vgg = nn.CrossEntropyLoss()\n",
+ "optimizer_vgg = optim.Adam(net_vgg.parameters(), lr=0.0001)\n",
+ "scheduler_vgg = optim.lr_scheduler.StepLR(optimizer_vgg, step_size=1, gamma=0.9)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "d28e8506bc59439787c25b97321a0df0",
+ "8b1886d6e6414261b0371af50d244439",
+ "6a3b6b91968c450c81ace2a09f451ffe",
+ "6b38964b8f944e7695ecdcee0c99d154",
+ "a32360353170435ba7e6b2767d56030e",
+ "79d48fca8d5342748d473916a37b2dbc",
+ "cbef124fabce4e73a6c04b5a2db59e27",
+ "557f128b4b224ce39250bca72132576a",
+ "ea2364e82e0d4e4a8bb42a8fcc1c5e3b",
+ "a09a3bac2f5d42f1bcce54750215b7f5",
+ "9d450cb2265141929d7aafff252ceec9"
+ ]
+ },
+ "id": "PdVu1RVWDvib",
+ "outputId": "4389fbde-0e49-4653-ff35-c98185ff37e6"
+ },
+ "source": [
+ "from tqdm.notebook import tqdm\n",
+ "\n",
+ "losses_train_vgg = []\n",
+ "\n",
+ "for epoch in tqdm(range(15)): # loop over the dataset multiple times\n",
+ " epoch_loss = 0.0\n",
+ " running_loss = 0.0\n",
+ " for i, (inputs, labels) in enumerate(trainloader, 0):\n",
+ " # get the inputs; data is a list of [inputs, labels]\n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " # print(inputs.shape)\n",
+ " # zero the parameter gradients\n",
+ " optimizer_vgg.zero_grad()\n",
+ "\n",
+ " # forward + backward + optimize\n",
+ " outputs = net_vgg(inputs)\n",
+ " # print(outputs)\n",
+ " loss = criterion_vgg(outputs, labels)\n",
+ " loss.backward()\n",
+ " optimizer_vgg.step()\n",
+ "\n",
+ " # print statistics\n",
+ "\n",
+ " running_loss += loss.item()\n",
+ " epoch_loss += loss.item()\n",
+ " if i % 10 == 9: # print every 10 mini-batches\n",
+ " print('[%d, %5d] loss: %.3f' %\n",
+ " (epoch + 1, i + 1, running_loss / 10))\n",
+ " running_loss = 0.0\n",
+ " losses_train_vgg.append(epoch_loss)\n",
+ " scheduler_vgg.step()\n",
+ "print('Finished Training')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "d28e8506bc59439787c25b97321a0df0",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/15 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 10] loss: 1.684\n",
+ "[1, 20] loss: 1.612\n",
+ "[1, 30] loss: 1.610\n",
+ "[1, 40] loss: 1.610\n",
+ "[1, 50] loss: 1.603\n",
+ "[1, 60] loss: 1.608\n",
+ "[2, 10] loss: 1.613\n",
+ "[2, 20] loss: 1.609\n",
+ "[2, 30] loss: 1.605\n",
+ "[2, 40] loss: 1.608\n",
+ "[2, 50] loss: 1.604\n",
+ "[2, 60] loss: 1.607\n",
+ "[3, 10] loss: 1.602\n",
+ "[3, 20] loss: 1.601\n",
+ "[3, 30] loss: 1.598\n",
+ "[3, 40] loss: 1.587\n",
+ "[3, 50] loss: 1.589\n",
+ "[3, 60] loss: 1.587\n",
+ "[4, 10] loss: 1.568\n",
+ "[4, 20] loss: 1.597\n",
+ "[4, 30] loss: 1.584\n",
+ "[4, 40] loss: 1.550\n",
+ "[4, 50] loss: 1.552\n",
+ "[4, 60] loss: 1.533\n",
+ "[5, 10] loss: 1.520\n",
+ "[5, 20] loss: 1.476\n",
+ "[5, 30] loss: 1.486\n",
+ "[5, 40] loss: 1.447\n",
+ "[5, 50] loss: 1.388\n",
+ "[5, 60] loss: 1.356\n",
+ "[6, 10] loss: 1.291\n",
+ "[6, 20] loss: 1.237\n",
+ "[6, 30] loss: 1.255\n",
+ "[6, 40] loss: 1.230\n",
+ "[6, 50] loss: 1.153\n",
+ "[6, 60] loss: 1.119\n",
+ "[7, 10] loss: 1.031\n",
+ "[7, 20] loss: 0.937\n",
+ "[7, 30] loss: 0.925\n",
+ "[7, 40] loss: 0.915\n",
+ "[7, 50] loss: 0.894\n",
+ "[7, 60] loss: 0.951\n",
+ "[8, 10] loss: 0.787\n",
+ "[8, 20] loss: 0.770\n",
+ "[8, 30] loss: 0.814\n",
+ "[8, 40] loss: 0.795\n",
+ "[8, 50] loss: 0.755\n",
+ "[8, 60] loss: 0.691\n",
+ "[9, 10] loss: 0.592\n",
+ "[9, 20] loss: 0.589\n",
+ "[9, 30] loss: 0.556\n",
+ "[9, 40] loss: 0.598\n",
+ "[9, 50] loss: 0.652\n",
+ "[9, 60] loss: 0.642\n",
+ "[10, 10] loss: 0.459\n",
+ "[10, 20] loss: 0.461\n",
+ "[10, 30] loss: 0.464\n",
+ "[10, 40] loss: 0.605\n",
+ "[10, 50] loss: 0.524\n",
+ "[10, 60] loss: 0.463\n",
+ "[11, 10] loss: 0.371\n",
+ "[11, 20] loss: 0.429\n",
+ "[11, 30] loss: 0.414\n",
+ "[11, 40] loss: 0.403\n",
+ "[11, 50] loss: 0.421\n",
+ "[11, 60] loss: 0.378\n",
+ "[12, 10] loss: 0.366\n",
+ "[12, 20] loss: 0.354\n",
+ "[12, 30] loss: 0.343\n",
+ "[12, 40] loss: 0.355\n",
+ "[12, 50] loss: 0.416\n",
+ "[12, 60] loss: 0.383\n",
+ "[13, 10] loss: 0.366\n",
+ "[13, 20] loss: 0.318\n",
+ "[13, 30] loss: 0.313\n",
+ "[13, 40] loss: 0.306\n",
+ "[13, 50] loss: 0.326\n",
+ "[13, 60] loss: 0.300\n",
+ "[14, 10] loss: 0.305\n",
+ "[14, 20] loss: 0.268\n",
+ "[14, 30] loss: 0.217\n",
+ "[14, 40] loss: 0.227\n",
+ "[14, 50] loss: 0.301\n",
+ "[14, 60] loss: 0.252\n",
+ "[15, 10] loss: 0.219\n",
+ "[15, 20] loss: 0.235\n",
+ "[15, 30] loss: 0.208\n",
+ "[15, 40] loss: 0.239\n",
+ "[15, 50] loss: 0.237\n",
+ "[15, 60] loss: 0.237\n",
+ "Finished Training\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 513
+ },
+ "id": "BXDAzRsuDvgb",
+ "outputId": "e5e4d670-7fc9-4b2d-ff33-e1699f7db838"
+ },
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.xlabel('Number of epoch')\n",
+ "plt.ylabel('Loss')\n",
+ "plt.title('Loss of net_vgg')\n",
+ "plt.plot(range(1, 16), np.array(losses_train_vgg) / (X_train.shape[0] // batch_size), color='green')\n",
+ "plt.grid()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "xLecb5muP8Ye",
+ "outputId": "03feab89-72d9-4657-b990-1f727cd4ac2a"
+ },
+ "source": [
+ "correct_test = 0\n",
+ "total_test = 0\n",
+ "\n",
+ "with torch.no_grad():\n",
+ "\n",
+ " for inputs, labels in testloader:\n",
+ " \n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " \n",
+ " outputs = net_vgg(inputs)\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ "\n",
+ " \n",
+ " total_test += labels.size(0)\n",
+ " correct_test += (predicted == labels).sum().item()\n",
+ " # print(f'Correct = {correct}, total = {total}, percent = {correct / total}')\n",
+ "print(f'Accuracy of the VGG network on the {X_test.shape[0]} test inputs = {round(100 * correct_test / total_test, 2)}%')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Accuracy of the VGG network on the 2959 test inputs = 87.94%\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "cg8coC7hcbsI"
+ },
+ "source": [
+ "Accuracy of the VGG network on the 2959 test inputs = 87.94%\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8JfkQdE9cGvH"
+ },
+ "source": [
+ "### Ну норм, почти как моя (чуть похуже), можно было еще поучить, но лимит на GPU на колабе не бесконечный\n",
+ "### Ну и учится долговато, поэтому batch_size не получится особо уменьшить, короче, моя бесспорно лучше"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "t0_xx9pKmm3X"
+ },
+ "source": [
+ "## Попробуем ResNet"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ZlpSaqiRmmv4"
+ },
+ "source": [
+ "X_tr = X_train[:, None, :, :]\n",
+ "X_te = X_test[:, None, :, :]"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aOihCnLDqoRF"
+ },
+ "source": [
+ "### Долго учится, но батч 128 не влезает в оперативу"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "bEJs1fjRmmsg"
+ },
+ "source": [
+ "batch_size = 64\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_tr)\n",
+ "tensor_y = torch.LongTensor(y_train)\n",
+ "\n",
+ "train_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_te) # transform to torch tensor\n",
+ "tensor_y = torch.LongTensor(y_test)\n",
+ "\n",
+ "test_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "\n",
+ "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n",
+ " shuffle=True, num_workers=2, drop_last=True)\n",
+ "testloader = DataLoader(test_dataset, batch_size=batch_size,\n",
+ " shuffle=False, num_workers=2, drop_last=True)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "G_007iy_mmpm"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "import torchvision.models as models\n",
+ "\n",
+ "model = models.resnet50(pretrained=False)\n",
+ "model.conv1 = nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1, bias=False)\n",
+ "model = model.to(device)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "9pnILjWfn7hJ"
+ },
+ "source": [
+ "import torch.optim as optim\n",
+ "\n",
+ "criterion_resnet = nn.CrossEntropyLoss()\n",
+ "optimizer_resnet = optim.Adam(model.parameters(), lr=0.0001)\n",
+ "scheduler_resnet = optim.lr_scheduler.StepLR(optimizer_resnet, step_size=1, gamma=0.9)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "873b4d4a07234ff5ad29864bd925e0c3",
+ "c1deb5815a0447248582e3484cb04635",
+ "01d76f7002b24bb3acf8f0081e65cb48",
+ "7b7da43ad0554ef5b15d676c21ad866e",
+ "b8ad378df36e4125b05ded99fbe54f9d",
+ "334c9aa8095e4edd9a1afb872ed526c8",
+ "3eb2668641394af9bc9e0f7d2c04958b",
+ "8d49371624784b4295f85051b509c9e2",
+ "ae733cb1f8d84633a31b1c61af5f2bf8",
+ "ddfde2e76bfb419fb01e53c7ecb5fc04",
+ "3ea1b903cf3949df93be35d33b550046"
+ ]
+ },
+ "id": "DTHwzk-Fn7j2",
+ "outputId": "3a6df6b8-245f-426a-83da-b7c047e3e75a"
+ },
+ "source": [
+ "from tqdm.notebook import tqdm\n",
+ "\n",
+ "losses_train_resnet = []\n",
+ "\n",
+ "for epoch in tqdm(range(5)): # loop over the dataset multiple times\n",
+ " epoch_loss = 0.0\n",
+ " running_loss = 0.0\n",
+ " for i, (inputs, labels) in enumerate(trainloader, 0):\n",
+ " # get the inputs; data is a list of [inputs, labels]\n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " # print(inputs.shape)\n",
+ " # zero the parameter gradients\n",
+ " optimizer_resnet.zero_grad()\n",
+ "\n",
+ " # forward + backward + optimize\n",
+ " outputs = model(inputs)\n",
+ " # print(outputs)\n",
+ " loss = criterion_resnet(outputs, labels)\n",
+ " loss.backward()\n",
+ " optimizer_resnet.step()\n",
+ "\n",
+ " # print statistics\n",
+ "\n",
+ " running_loss += loss.item()\n",
+ " epoch_loss += loss.item()\n",
+ " if i % 10 == 9: # print every 10 mini-batches\n",
+ " print('[%d, %5d] loss: %.3f' %\n",
+ " (epoch + 1, i + 1, running_loss / 10))\n",
+ " running_loss = 0.0\n",
+ " losses_train_resnet.append(epoch_loss)\n",
+ " scheduler_resnet.step()\n",
+ "print('Finished Training')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "873b4d4a07234ff5ad29864bd925e0c3",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/5 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 10] loss: 5.891\n",
+ "[1, 20] loss: 3.562\n",
+ "[1, 30] loss: 1.771\n",
+ "[1, 40] loss: 1.603\n",
+ "[1, 50] loss: 1.600\n",
+ "[1, 60] loss: 1.583\n",
+ "[1, 70] loss: 1.519\n",
+ "[1, 80] loss: 1.505\n",
+ "[1, 90] loss: 1.448\n",
+ "[1, 100] loss: 1.423\n",
+ "[1, 110] loss: 1.387\n",
+ "[1, 120] loss: 1.298\n",
+ "[1, 130] loss: 1.140\n",
+ "[2, 10] loss: 0.985\n",
+ "[2, 20] loss: 0.923\n",
+ "[2, 30] loss: 0.849\n",
+ "[2, 40] loss: 0.825\n",
+ "[2, 50] loss: 0.752\n",
+ "[2, 60] loss: 0.684\n",
+ "[2, 70] loss: 0.718\n",
+ "[2, 80] loss: 0.787\n",
+ "[2, 90] loss: 0.732\n",
+ "[2, 100] loss: 0.650\n",
+ "[2, 110] loss: 0.630\n",
+ "[2, 120] loss: 0.556\n",
+ "[2, 130] loss: 0.527\n",
+ "[3, 10] loss: 0.502\n",
+ "[3, 20] loss: 0.449\n",
+ "[3, 30] loss: 0.522\n",
+ "[3, 40] loss: 0.490\n",
+ "[3, 50] loss: 0.408\n",
+ "[3, 60] loss: 0.489\n",
+ "[3, 70] loss: 0.398\n",
+ "[3, 80] loss: 0.427\n",
+ "[3, 90] loss: 0.440\n",
+ "[3, 100] loss: 0.407\n",
+ "[3, 110] loss: 0.341\n",
+ "[3, 120] loss: 0.382\n",
+ "[3, 130] loss: 0.431\n",
+ "[4, 10] loss: 0.259\n",
+ "[4, 20] loss: 0.290\n",
+ "[4, 30] loss: 0.247\n",
+ "[4, 40] loss: 0.264\n",
+ "[4, 50] loss: 0.269\n",
+ "[4, 60] loss: 0.244\n",
+ "[4, 70] loss: 0.245\n",
+ "[4, 80] loss: 0.273\n",
+ "[4, 90] loss: 0.271\n",
+ "[4, 100] loss: 0.323\n",
+ "[4, 110] loss: 0.308\n",
+ "[4, 120] loss: 0.239\n",
+ "[4, 130] loss: 0.298\n",
+ "[5, 10] loss: 0.213\n",
+ "[5, 20] loss: 0.190\n",
+ "[5, 30] loss: 0.198\n",
+ "[5, 40] loss: 0.190\n",
+ "[5, 50] loss: 0.180\n",
+ "[5, 60] loss: 0.218\n",
+ "[5, 70] loss: 0.235\n",
+ "[5, 80] loss: 0.223\n",
+ "[5, 90] loss: 0.221\n",
+ "[5, 100] loss: 0.184\n",
+ "[5, 110] loss: 0.221\n",
+ "[5, 120] loss: 0.220\n",
+ "[5, 130] loss: 0.248\n",
+ "Finished Training\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 513
+ },
+ "id": "iH9HydpCn7my",
+ "outputId": "e1c3f5a0-bcc9-4bfc-cbb2-87fee267aa59"
+ },
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.xlabel('Number of epoch')\n",
+ "plt.ylabel('Loss')\n",
+ "plt.title('Loss of ResNet')\n",
+ "plt.plot(range(1, 6), np.array(losses_train_resnet) / (X_train.shape[0] // batch_size), color='green')\n",
+ "plt.grid()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "CXj9cS_qp8Lk",
+ "outputId": "600769ce-1ff3-4e56-d45e-67555ae22e08"
+ },
+ "source": [
+ "correct_test = 0\n",
+ "total_test = 0\n",
+ "\n",
+ "with torch.no_grad():\n",
+ "\n",
+ " for inputs, labels in testloader:\n",
+ " \n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " \n",
+ " outputs = model(inputs)\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ "\n",
+ " \n",
+ " total_test += labels.size(0)\n",
+ " correct_test += (predicted == labels).sum().item()\n",
+ " # print(f'Correct = {correct}, total = {total}, percent = {correct / total}')\n",
+ "print(f'Accuracy of the ResNet50 network on the {X_test.shape[0]} test inputs = {round(100 * correct_test / total_test, 2)}%')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Accuracy of the ResNet50 network on the 2959 test inputs = 90.46%\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "B71ZxxjBw1fI"
+ },
+ "source": [
+ "Accuracy of the ResNet50 network on the 2959 test inputs = 90.46%"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9RdiSXH_w4B3"
+ },
+ "source": [
+ "### Топчик!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ojEuXjx5DlDW"
+ },
+ "source": [
+ "Train a model: finally, lets' build and train a classifier neural network. You can use any library you like. If in doubt, consult the model & training tips below."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "hwgnOrZy1E8p"
+ },
+ "source": [
+ "__Training tips:__ here's what you can try:\n",
+ "* __Layers:__ 1d or 2d convolutions, perhaps with some batch normalization in between;\n",
+ "* __Architecture:__ VGG-like, residual, highway, densely-connected, MatchboxNet, Dilated convs - you name it :)\n",
+ "* __Batch size matters:__ smaller batches usually train slower but better. Try to find the one that suits you best.\n",
+ "* __Data augmentation:__ add background noise, faster/slower, change pitch;\n",
+ "* __Average checkpoints:__ you can make model more stable with [this simple technique (arxiv)](https://arxiv.org/abs/1803.05407)\n",
+ "* __For full scale stage:__ make sure you're not losing too much data due to max_length in the pre-processing stage!\n",
+ "\n",
+ "These are just recommendations. As long as your model works, you're not required to follow them."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Fvf8UCsPDvj2"
+ },
+ "source": [
+ "## Full scale commands recognition (3+ points)\n",
+ "\n",
+ "Your final task is to train a full-scale voice command spotter and apply it to a video:\n",
+ "1. Build the dataset with all 30+ classes (directions, digits, names, etc.)\n",
+ " * __Optional:__ include a special \"noise\" class that contains random unrelated sounds\n",
+ " * You can download youtube videos with [`youtube-dl`](https://ytdl-org.github.io/youtube-dl/index.html) library.\n",
+ "2. Train a model on this full dataset. Kudos for tuning its accuracy :)\n",
+ "3. Apply it to a audio/video of your choice to spot the occurences of each keyword\n",
+ " * Here's one [video about primes](https://www.youtube.com/watch?v=EK32jo7i5LQ) that you can try. It should be full of numbers :)\n",
+ " * There are multiple ways you can analyze the performance of your network, e.g. plot probabilities predicted for every time-step. Chances are you'll discover something useful about how to improve your model :)\n",
+ "\n",
+ "\n",
+ "Please briefly describe what you did in a short informal report."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "GOmUhfziHZt-"
+ },
+ "source": [
+ "### Соберем датасет со всеми классами"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TYa-EW9bHnCA",
+ "outputId": "093accba-4931-44af-c605-8dfb394c8dd4"
+ },
+ "source": [
+ "tuple(sorted(samples_by_target.keys()))[1:]"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "('bed',\n",
+ " 'bird',\n",
+ " 'cat',\n",
+ " 'dog',\n",
+ " 'down',\n",
+ " 'eight',\n",
+ " 'five',\n",
+ " 'four',\n",
+ " 'go',\n",
+ " 'happy',\n",
+ " 'house',\n",
+ " 'left',\n",
+ " 'marvin',\n",
+ " 'nine',\n",
+ " 'no',\n",
+ " 'off',\n",
+ " 'on',\n",
+ " 'one',\n",
+ " 'right',\n",
+ " 'seven',\n",
+ " 'sheila',\n",
+ " 'six',\n",
+ " 'stop',\n",
+ " 'three',\n",
+ " 'tree',\n",
+ " 'two',\n",
+ " 'up',\n",
+ " 'wow',\n",
+ " 'yes',\n",
+ " 'zero')"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "_cKmHlLT0U7I"
+ },
+ "source": [
+ "### Не хватает оперативы, пришлось батчами датасет собирать:(\n",
+ " (думаю, это заслуживает дополнительного балла)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "c5SSwTtwzEbj"
+ },
+ "source": [
+ "### Преобразованные батчи:\n",
+ "('left', 'right', 'up', 'down', 'stop') \\\n",
+ "('bed', 'bird', 'cat', 'dog', 'eight', 'five', 'four') \\\n",
+ "('go', 'happy', 'house', 'marvin', 'nine', 'no', 'off', 'on') \\\n",
+ "('one', 'seven', 'sheila', 'six', 'three', 'tree', 'two', 'wow', 'yes', 'zero')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "16Ux38uFD2g-",
+ "outputId": "dfaacdc7-1c21-426e-a9d1-452f868e0869"
+ },
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from itertools import chain\n",
+ "from tqdm import tqdm\n",
+ "import joblib as jl\n",
+ "\n",
+ "classes = ('one', 'seven', 'sheila', 'six', 'three', 'tree', 'two', 'wow', 'yes', 'zero')\n",
+ "\n",
+ "def preprocess_sample(filepath, max_length=150):\n",
+ " amplitudes, sr = librosa.core.load(filepath)\n",
+ " spectrogram = librosa.feature.melspectrogram(amplitudes, sr=sr)[:, :max_length]\n",
+ " spectrogram = np.pad(spectrogram, [[0, 0], [0, max(0, max_length - spectrogram.shape[1])]], mode='constant')\n",
+ " target = classes.index(filepath.split(os.sep)[-2])\n",
+ " return np.float32(spectrogram), np.int64(target)\n",
+ "\n",
+ "all_files = chain(*(samples_by_target[cls] for cls in classes))\n",
+ "spectrograms_and_targets = jl.Parallel(n_jobs=-1)(tqdm(list(map(jl.delayed(preprocess_sample), all_files))))\n",
+ "X, y = map(np.stack, zip(*spectrograms_and_targets))\n",
+ "X = X.transpose([0, 2, 1]) # to [batch, time, channels]\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 21810/21810 [13:33<00:00, 26.82it/s]\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "8UG1Bd7NVVUC",
+ "outputId": "dc33358c-f0b3-4354-8564-d5a99d1cbd8e"
+ },
+ "source": [
+ "%%time\n",
+ "with open('/content/drive/MyDrive/speech_technology/X_train_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle', 'wb') as f:\n",
+ " pickle.dump(X_train, f)\n",
+ "\n",
+ "with open('/content/drive/MyDrive/speech_technology/X_test_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle', 'wb') as f:\n",
+ " pickle.dump(X_test, f)\n",
+ "\n",
+ "with open('/content/drive/MyDrive/speech_technology/y_train_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle', 'wb') as f:\n",
+ " pickle.dump(y_train, f)\n",
+ "\n",
+ "with open('/content/drive/MyDrive/speech_technology/y_test_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle', 'wb') as f:\n",
+ " pickle.dump(y_test, f)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 2.82 s, sys: 1.89 s, total: 4.71 s\n",
+ "Wall time: 12.4 s\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "s3vLw9aQz0pn",
+ "outputId": "27ed2489-b092-43d4-c21a-0e5a3ef813dd"
+ },
+ "source": [
+ "!ls /content/drive/MyDrive/speech_technology/"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "X_test_bed_bird_cat_dog_eight_five_four.pickle\n",
+ "X_test_go_happy_house_marvin_nine_no_off_on.pickle\n",
+ "X_test_left_right_up_down_stop.pickle\n",
+ "X_test_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle\n",
+ "X_train_bed_bird_cat_dog_eight_five_four.pickle\n",
+ "X_train_go_happy_house_marvin_nine_no_off_on.pickle\n",
+ "X_train_left_right_up_down_stop.pickle\n",
+ "X_train_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle\n",
+ "y_test_bed_bird_cat_dog_eight_five_four.pickle\n",
+ "y_test_go_happy_house_marvin_nine_no_off_on.pickle\n",
+ "y_test_left_right_up_down_stop.pickle\n",
+ "y_test_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle\n",
+ "y_train_bed_bird_cat_dog_eight_five_four.pickle\n",
+ "y_train_go_happy_house_marvin_nine_no_off_on.pickle\n",
+ "y_train_left_right_up_down_stop.pickle\n",
+ "y_train_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "j64Njr27hxk6"
+ },
+ "source": [
+ "### Собираем батчи в единые массивы"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 49,
+ "referenced_widgets": [
+ "9ca77079e21346c6b67efd7c84244218",
+ "648c62ce35b54057aff012d9fa8c8868",
+ "1fe1217084e14cf7a056b722c50cec6a",
+ "291237b93b884081b714ef85608074c1",
+ "7a14d91659c44bfab2865743269b7707",
+ "f35289fc008a47d2b368260637a090dc",
+ "f28b750b796b4165ab9901f0fdec9aad",
+ "21a69f5d253c465a9194dc1c95e6b0ea",
+ "b69ba20d45f5430f9d2dc9a1405f4d7b",
+ "cddcae93ef954edca7ffb0e828a7415d",
+ "5c7fa3bc82fd4cce8dae0eb56752c39d"
+ ]
+ },
+ "id": "G7uEgt2dac6G",
+ "outputId": "68e6ef47-38fe-4112-eccd-58be661909c9"
+ },
+ "source": [
+ "empty = True\n",
+ "for file in tqdm(['X_train_bed_bird_cat_dog_eight_five_four.pickle', 'X_train_go_happy_house_marvin_nine_no_off_on.pickle', \n",
+ " 'X_train_left_right_up_down_stop.pickle', 'X_train_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle']):\n",
+ " with open(f'/content/drive/MyDrive/speech_technology/{file}', 'rb') as f:\n",
+ " if empty:\n",
+ " X_train = pickle.load(f)\n",
+ " empty = False\n",
+ " else:\n",
+ " X_train = np.concatenate((X_train, pickle.load(f)))"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9ca77079e21346c6b67efd7c84244218",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/4 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "etzP1NKdc8o9"
+ },
+ "source": [
+ "empty = True\n",
+ "for file in ['X_test_bed_bird_cat_dog_eight_five_four.pickle', 'X_test_go_happy_house_marvin_nine_no_off_on.pickle', \n",
+ " 'X_test_left_right_up_down_stop.pickle', 'X_test_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle']:\n",
+ " with open(f'/content/drive/MyDrive/speech_technology/{file}', 'rb') as f:\n",
+ " if empty:\n",
+ " X_test = pickle.load(f)\n",
+ " empty = False\n",
+ " else:\n",
+ " X_test = np.concatenate((X_test, pickle.load(f)))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ldAtGp4xdN_F"
+ },
+ "source": [
+ "empty = True\n",
+ "shift = 0\n",
+ "for file in ['y_train_bed_bird_cat_dog_eight_five_four.pickle', 'y_train_go_happy_house_marvin_nine_no_off_on.pickle', \n",
+ " 'y_train_left_right_up_down_stop.pickle', 'y_train_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle']:\n",
+ " with open(f'/content/drive/MyDrive/speech_technology/{file}', 'rb') as f:\n",
+ " if empty:\n",
+ " y_train = pickle.load(f)\n",
+ " empty = False\n",
+ " else:\n",
+ " y_train_new = pickle.load(f)\n",
+ " shift = y_train.max() + 1\n",
+ " y_train = np.concatenate((y_train, y_train_new + shift))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ey_q28oedRFE"
+ },
+ "source": [
+ "empty = True\n",
+ "shift = 0\n",
+ "for file in ['y_test_bed_bird_cat_dog_eight_five_four.pickle', 'y_test_go_happy_house_marvin_nine_no_off_on.pickle', \n",
+ " 'y_test_left_right_up_down_stop.pickle', 'y_test_one_seven_sheila_six_three_tree_two_wow_yes_zero.pickle']:\n",
+ " with open(f'/content/drive/MyDrive/speech_technology/{file}', 'rb') as f:\n",
+ " if empty:\n",
+ " y_test = pickle.load(f)\n",
+ " empty = False\n",
+ " else:\n",
+ " y_test_new = pickle.load(f)\n",
+ " shift = y_test.max() + 1\n",
+ " y_test = np.concatenate((y_test, y_test_new + shift))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "V6X7gZPEh7zB"
+ },
+ "source": [
+ "### Пишем все файлы на диск, чтобы миллион раз не ждать обработку"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "QTbhMopNdtLc",
+ "outputId": "0274f5c3-35e6-480f-c46d-53734191de06"
+ },
+ "source": [
+ "%%time\n",
+ "with open('/content/drive/MyDrive/speech_technology/X_train.pickle', 'wb') as f:\n",
+ " pickle.dump(X_train, f)\n",
+ "\n",
+ "with open('/content/drive/MyDrive/speech_technology/X_test.pickle', 'wb') as f:\n",
+ " pickle.dump(X_test, f)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 1.64 s, sys: 6.06 s, total: 7.7 s\n",
+ "Wall time: 1min 30s\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "YsTo-Mof6DAG"
+ },
+ "source": [
+ "with open('/content/drive/MyDrive/speech_technology/y_train.pickle', 'wb') as f:\n",
+ " pickle.dump(y_train, f)\n",
+ "\n",
+ "with open('/content/drive/MyDrive/speech_technology/y_test.pickle', 'wb') as f:\n",
+ " pickle.dump(y_test, f)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8ZU9Mz9VvmNe"
+ },
+ "source": [
+ "### Читаем данные с диска"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "MIHK5d75e6Iv",
+ "outputId": "a7c78c71-8273-498c-a949-f5a2fd595c1c"
+ },
+ "source": [
+ "print('reading X_train...')\n",
+ "with open('/content/drive/MyDrive/speech_technology/X_train.pickle', 'rb') as f:\n",
+ " X_train = pickle.load(f)\n",
+ "print('reading X_test...')\n",
+ "with open('/content/drive/MyDrive/speech_technology/X_test.pickle', 'rb') as f:\n",
+ " X_test = pickle.load(f)\n",
+ "print('reading y_train...')\n",
+ "with open('/content/drive/MyDrive/speech_technology/y_train.pickle', 'rb') as f:\n",
+ " y_train = pickle.load(f)\n",
+ "print('reading y_test...')\n",
+ "with open('/content/drive/MyDrive/speech_technology/y_test.pickle', 'rb') as f:\n",
+ " y_test = pickle.load(f)"
+ ],
+ "execution_count": 6,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "reading X_train...\n",
+ "reading X_test...\n",
+ "reading y_train...\n",
+ "reading y_test...\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "t0XZiYpbduB9",
+ "outputId": "3ead33fd-6d62-4424-9a6f-e1115039f8b2"
+ },
+ "source": [
+ "X_train.shape, X_test.shape, y_train.shape, y_test.shape"
+ ],
+ "execution_count": 7,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "((48539, 150, 128), (16182, 150, 128), (48539,), (16182,))"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 7
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "g11t5keF6c52",
+ "outputId": "27a10c11-9ae1-45d8-c490-0f91c99420e8"
+ },
+ "source": [
+ "y_train.max(), y_train.min(), y_test.max(), y_test.min()"
+ ],
+ "execution_count": 8,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(29, 0, 29, 0)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 8
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "G3chcv9OIUY9"
+ },
+ "source": [
+ "### Буду учить ResNet - добавил чекпоинты для модели, потому что колаб очень неприятно слетает в самый подходящий момент"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "hJ9qUtqGITK1"
+ },
+ "source": [
+ "X_train = X_train[:, None, :, :]\n",
+ "X_test = X_test[:, None, :, :]"
+ ],
+ "execution_count": 9,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "dsYqDN8pH3u9"
+ },
+ "source": [
+ "batch_size = 64\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_train)\n",
+ "tensor_y = torch.LongTensor(y_train)\n",
+ "\n",
+ "train_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "tensor_x = torch.Tensor(X_test) # transform to torch tensor\n",
+ "tensor_y = torch.LongTensor(y_test)\n",
+ "\n",
+ "test_dataset = TensorDataset(tensor_x, tensor_y)\n",
+ "\n",
+ "\n",
+ "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n",
+ " shuffle=True, num_workers=2, drop_last=True)\n",
+ "testloader = DataLoader(test_dataset, batch_size=batch_size,\n",
+ " shuffle=False, num_workers=2, drop_last=True)"
+ ],
+ "execution_count": 10,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "C1Zh5JK-hsBb"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "import torchvision.models as models"
+ ],
+ "execution_count": 11,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "accItmsAIt8X"
+ },
+ "source": [
+ "model = models.resnet50(pretrained=False)\n",
+ "model.conv1 = nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1, bias=False)\n",
+ "model = model.to(device)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "xagBTpD-It-7"
+ },
+ "source": [
+ "import torch.optim as optim\n",
+ "\n",
+ "criterion_resnet = nn.CrossEntropyLoss()\n",
+ "optimizer_resnet = optim.Adam(model.parameters(), lr=0.0001)\n",
+ "scheduler_resnet = optim.lr_scheduler.StepLR(optimizer_resnet, step_size=1, gamma=0.9)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 762,
+ "referenced_widgets": [
+ "abb35c94c74940ec82e12ba8c3243b91",
+ "ca3a930bb33543fd893baec27ec81a5f",
+ "4aead5752d21457787e2f7b0b861a57e",
+ "316c57f018b1410dae3cf71c789e971e",
+ "64bdf8f26e8a49ec80091b0001ba7a99",
+ "8670185e627f48d3b13e9b9a1ca03cda",
+ "e92f972d1a9b4d26a9d2c2d18febab64",
+ "a31fcbe28d754d759196ad3b7ed0632b",
+ "b65568fdd9464cb68140941f57dd44ce",
+ "37800daf604d4f64bbb4e479a7ac2188",
+ "ce8169bedbd840129e31f02f685daef4"
+ ]
+ },
+ "id": "QsIsn8_bIuB1",
+ "outputId": "8cc6405f-de78-4735-95ef-4b34f0e68cf6"
+ },
+ "source": [
+ "from tqdm.notebook import tqdm\n",
+ "\n",
+ "losses_train_resnet = []\n",
+ "\n",
+ "for epoch in tqdm(range(2)): # loop over the dataset multiple times\n",
+ " epoch_loss = 0.0\n",
+ " running_loss = 0.0\n",
+ " for i, (inputs, labels) in enumerate(trainloader, 0):\n",
+ " # get the inputs; data is a list of [inputs, labels]\n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " # print(inputs.shape)\n",
+ " # zero the parameter gradients\n",
+ " optimizer_resnet.zero_grad()\n",
+ "\n",
+ " # forward + backward + optimize\n",
+ " outputs = model(inputs)\n",
+ " # print(outputs)\n",
+ " loss = criterion_resnet(outputs, labels)\n",
+ " loss.backward()\n",
+ " optimizer_resnet.step()\n",
+ "\n",
+ " # print statistics\n",
+ "\n",
+ " running_loss += loss.item()\n",
+ " epoch_loss += loss.item()\n",
+ " if i % 50 == 49: # print every 50 mini-batches\n",
+ " print('[%d, %5d] loss: %.3f' %\n",
+ " (epoch + 1, i + 1, running_loss / 10))\n",
+ " running_loss = 0.0\n",
+ " if i % 200 == 199: # model checkpoints\n",
+ " torch.save(model, f'/content/drive/MyDrive/speech_technology/ResNet50_full_dataset_epoch_{epoch}_stage_{i}')\n",
+ " print(f'Saved model ResNet50_full_dataset_epoch_{epoch}_stage_{i}')\n",
+ " losses_train_resnet.append(epoch_loss)\n",
+ " scheduler_resnet.step()\n",
+ "print('Finished Training')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "abb35c94c74940ec82e12ba8c3243b91",
+ "version_minor": 0,
+ "version_major": 2
+ },
+ "text/plain": [
+ " 0%| | 0/2 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n",
+ " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[1, 50] loss: 21.973\n",
+ "[1, 100] loss: 16.892\n",
+ "[1, 150] loss: 16.088\n",
+ "[1, 200] loss: 14.136\n",
+ "Saved model ResNet50_full_dataset_epoch_0_stage_199\n",
+ "[1, 250] loss: 12.016\n",
+ "[1, 300] loss: 10.419\n",
+ "[1, 350] loss: 8.925\n",
+ "[1, 400] loss: 7.628\n",
+ "Saved model ResNet50_full_dataset_epoch_0_stage_399\n",
+ "[1, 450] loss: 6.816\n",
+ "[1, 500] loss: 5.738\n",
+ "[1, 550] loss: 5.185\n",
+ "[1, 600] loss: 4.999\n",
+ "Saved model ResNet50_full_dataset_epoch_0_stage_599\n",
+ "[1, 650] loss: 4.319\n",
+ "[1, 700] loss: 4.071\n",
+ "[1, 750] loss: 3.788\n",
+ "[2, 50] loss: 3.209\n",
+ "[2, 100] loss: 3.318\n",
+ "[2, 150] loss: 3.015\n",
+ "[2, 200] loss: 2.857\n",
+ "Saved model ResNet50_full_dataset_epoch_1_stage_199\n",
+ "[2, 250] loss: 2.804\n",
+ "[2, 300] loss: 2.596\n",
+ "[2, 350] loss: 2.573\n",
+ "[2, 400] loss: 2.628\n",
+ "Saved model ResNet50_full_dataset_epoch_1_stage_399\n",
+ "[2, 450] loss: 2.312\n",
+ "[2, 500] loss: 2.238\n",
+ "[2, 550] loss: 2.356\n",
+ "[2, 600] loss: 2.177\n",
+ "Saved model ResNet50_full_dataset_epoch_1_stage_599\n",
+ "[2, 650] loss: 2.286\n",
+ "[2, 700] loss: 2.230\n",
+ "[2, 750] loss: 2.107\n",
+ "Finished Training\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "5oI5O6gZIuE5",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 513
+ },
+ "outputId": "37ce9e17-1967-47d3-b51a-d968ce5dd8fd"
+ },
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.xlabel('Number of epoch')\n",
+ "plt.ylabel('Loss')\n",
+ "plt.title('Loss of ResNet50')\n",
+ "plt.plot(range(1, 3), np.array(losses_train_resnet) / (X_train.shape[0] // batch_size), color='green')\n",
+ "plt.grid()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtAAAAHwCAYAAACPE1g3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3AVVePG8eckoRdBRFBUEFTkJiGU0EEIIL1JkyIg0kKwYy/Yey+EXgSkF5EiCEgA6aGEFKyIiqggvZfk/P7Ifd/hx0tJJDcnyf1+Zu6Qu7vZfciZzDw5c+6usdYKAAAAQNoEuA4AAAAAZCcUaAAAACAdKNAAAABAOlCgAQAAgHSgQAMAAADpQIEGAAAA0oECDQDZjDHmVWPMP8aYv1xnAQB/RIEGgIswxuw0xjR2neNcxpibJA2W5LHWlrzA/gbGmBRjzFFjzBFjzPfGmN4ZcN0YY8xJY8yN52xrbIzZmcbvf9EYM+m8beONMae9Wf/zCjxnfyNjzHfGmOPGmOXGmNJX+v8AgIxAgQaA7OUmSfustXsuccxua21BSYUlPSJplDGmfAZc+5ik5zPgPOd621pb8JxXsiQZY66RNNt7vaslxUqalsHXBoB/hQINAOlkjMljjPnQGLPb+/rQGJPHu+8aY8x8Y8xBY8x+Y8wqY0yAd9+Txpg/zpkZbnSR819ljJlgjNlrjPnVGPOcMSbAOxu+RNL13tna8ZfKaVMtlLRfUkXvuQOMMU8ZY342xuwzxkw3xlzt3ZfXGDPJu/2gMWajMabEOaf8WFJXY0y5i+S+3hgzy5v7F2PMg97tzSQ9I+lub+64NPyY20tKtNbOsNaelPSipDBjzO1p+F4A8CkKNACk37OSakqqJClMUnVJz3n3DZa0S1JxSSWUWhytdwb4fknVrLWFJDWVtPMi5/9E0lWSykqqL6mnpN7W2qWSmss7w2ytvfdSIb1luY2kayT95N38gKR23vNeL+mApKHefb28171RUjFJkZJOnHPKPySNkvTSha4laZ6kOEmlJDWS9LAxpqm1dpGk1yVN8+YOO+dbo7x/aGwyxnQ4Z3uw91ySJGvtMUk/e7cDgFMUaABIv+6SXrbW7rHW7lVqoezh3XdG0nWSSltrz1hrV1lrraRkSXkkeYwxuay1O621P59/Yu8a4C6SnrbWHrHW7pT03jnnT4vrjTEHlVp+50h61Fq7xbsvUtKz1tpd1tpTSp3Z7WiMCfJmLybpFmttsrV2k7X28HnnfkNSa2PM+UW2mqTi1tqXrbWnrbU7lFq2u1wi58eSbpV0rVKXaow3xtTx7iso6dB5xx+SVCgtPwAA8CUKNACk3/WSfj3n/a/ebZL0jlJne782xuwwxjwlSdbanyQ9rNTCuscYM9UYc73+1zWScl3g/KXSkW+3tbaIUtdAfyyp4Tn7Skua412icVDSdqWW+xKSJkpaLGmqd2nK28aYXOee2PsHw6eSXj7vmqXlLe7nnPsZ73kvyFq72Vq7z1p71rvU5HOlLt2QpKPe/OcqLOlIGn8GAOAzFGgASL/dSi2M/3GTd5u8s8aDrbVlJbWR9Oh/1jpbaydba+t6v9dKeusC5/5HqTPB55//j/SG9M4wPykp1BjTzrv5d0nNrbVFznnltdb+4Z0xf8la65FUW1IrpS4fOd87kiIkVT1n2++SfjnvvIWstS3+EyctkSUZ79eJSl0eI0kyxhSQVM67HQCcokADwKXl8n647j+vIElTJD1njCnuvVvEEEmTJMkY08oYc4sxxih1yUGypBRjTHljTEPvhw1PKnV5Rcr5F/PehWK6pNeMMYW8t2579D/nTy9r7WmlLgEZ4t003Hvu0t68xY0xbb1fRxhjQr3LSA4rtchfKONB7zmfOGfzBklHvB+UzGeMCTTGhBhjqnn3/y2pzH8+UOm9XkdjTEHvWu0mku6R9KV39xxJIcaYDsaYvN7826y13/2bnwMAZCQKNABc2kKllt3/vF6U9KpSb6u2TVK8pM3ebVLqmt6lSl2CsFZStLV2uVLXP7+p1Bnmv5S67vfpi1zzAaXeMm6HpG8lTZY09gr+D2Ml3WSMaS3pI6WW1K+NMUckrZNUw3tcSUkzlVqet0taodRlHRfykVL/OJD03+LfSqkfrPxFqf/P0Ur9UKIkzfD+u88Ys9n79UNKnVk/qNRZ7X7W2hjv+fZK6iDpNaV+0LGGLr2eGgAyjUn9bAsAAACAtGAGGgAAAEgHCjQAAACQDhRoAAAAIB0o0AAAAEA6UKABAACAdAhyHSC9rrnmGlumTBkn1z527JgKFCjg5NrIHIyxf2Cc/QPj7B8Y55zP5Rhv2rTpH2tt8fO3Z7sCXaZMGcXGxjq5dkxMjBo0aODk2sgcjLF/YJz9A+PsHxjnnM/lGBtjfr3QdpZwAAAAAOlAgQYAAADSgQINAAAApAMFGgAAAEgHCjQAAACQDhRoAAAAIB0o0AAAAEA6UKABAACAdKBAAwAAAOlAgQYAAADSgQINAAAApAMFGgAAAEgHCjQAAACQDhRoAAAAIB0o0AAAAEA6UKABAACAdKBAp9HP+392HQEAAABZQJDrANnB9r3bFTY8TPWuqafgasEqXqC460gAAABwhBnoNCh3dTk9d8dzWrl3pTzRHk2JnyJrretYAAAAcIACnQa5A3NrSP0hGll1pMoVLadus7upzdQ22nV4l+toAAAAyGQU6HS4ucDNWn3far3f5H0t27FMnqEejYgdoRSb4joaAAAAMgkFOp0CAwL1SK1HlBCVoGqlqilyQaQaTWikn/b/5DoaAAAAMgEF+l8qW7SslvZYqlGtR2nzn5sVOixU7655V2dTzrqOBgAAAB+iQF8BY4z6VumrpKgkNSnXRI8veVy1x9RW/N/xrqMBAADARyjQGaBU4VL64u4vNK3jNO08uFNVRlbRC8tf0Kmzp1xHAwAAQAajQGcQY4w6B3fW9kHb1SWki15e+bKqjqyq9bvWu44GAACADESBzmDF8hfTxLsmakG3BTp06pBqjamlRxc/qmOnj7mOBgAAgAxAgfaRFre2UGJUoiLDI/XBug8UOixUy3Yscx0LAAAAV4gC7UOF8xRWdMtorbh3hYICgtR4YmP1+7KfDp486DoaAAAA/iUKdCa4o/QdiouM05N1ntS4rePkGerR3O/muo4FAACAf4ECnUny5cqnNxu/qfV91+vaAteq3bR26jKzi/Yc2+M6GgAAANKBAp3Jql5fVRv7bdSrEa9qzndzVGFoBU3aNknWWtfRAAAAkAYUaAdyBebSs3c8q60Dtqp8sfLqMaeHWk5uqd8O/eY6GgAAAC6DAu1QheIVtKr3Kn3U7COt+HWFgqODNWzjMKXYFNfRAAAAcBEUaMcCAwL1YI0HlTAwQTVvqKmohVFqML6Bftj3g+toAAAAuAAKdBZxc9Gb9fU9X2tsm7GK3xOvsOFhenv12zqbctZ1NAAAAJyDAp2FGGPUu3JvJUUlqfktzfXk0idVY3QNxf0V5zoaAAAAvCjQWdB1ha7T7Ltna2anmfrj8B8KHxWu5755TifPnnQdDQAAwO9RoLOwDp4OShqUpO6h3fXaqtdUeURlrfl9jetYAAAAfo0CncVdne9qjW83Xou6L9LxM8dVd2xdPfTVQzp6+qjraAAAAH6JAp1NNL2lqRIGJmhQtUH6eMPHCh0WqiU/L3EdCwAAwO/4rEAbY8YaY/YYYxIusv8qY8w8Y0ycMSbRGNPbV1lyikJ5CumTFp9oVe9VyhOYR00mNdF9c+/TgRMHXEcDAADwG76cgR4vqdkl9g+SlGStDZPUQNJ7xpjcPsyTY9S9qa62Rm7V03Wf1oS4CfJEezR7+2zXsQAAAPyCzwq0tXalpP2XOkRSIWOMkVTQeyw3PU6jvEF59Xqj17Wx30aVLFhSHaZ3UMfpHfXX0b9cRwMAAMjRXK6B/lRSBUm7JcVLeshanmGdXpWvq6wNfTfo9Yava/4P8+UZ6tFnWz+TtdZ1NAAAgBzJ+LJoGWPKSJpvrQ25wL6OkupIelRSOUlLJIVZaw9f4Nj+kvpLUokSJapOnTrVZ5kv5ejRoypYsKCTa6fFb8d/0zvfv6OEwwmqVrSaHr3tUZXMW9J1rGwlq48xMgbj7B8YZ//AOOd8Lsc4IiJik7U2/PztLgv0AklvWmtXed9/I+kpa+2GS50zPDzcxsbG+iDt5cXExKhBgwZOrp1WKTZF0Ruj9dTSpyRJbzZ+U1HVohRguOFKWmSHMcaVY5z9A+PsHxjnnM/lGBtjLligXbaq3yQ1kiRjTAlJ5SXtcJgnRwgwAbq/+v1KjEpU3Zvq6oGvHtAd4+7Q9/987zoaAABAjuDL29hNkbRWUnljzC5jTB9jTKQxJtJ7yCuSahtj4iUtk/SktfYfX+XxN6WLlNZX3b/SZ+0+U9LeJIUND9Mbq97QmeQzrqMBAABka0G+OrG1tutl9u+W1MRX14dkjFHPsJ5qWq6p7v/qfj3zzTOanjRdY9uMVeXrKruOBwAAkC2xMNYPlChYQjM6zdCszrP019G/VG1UNT299GmdPHvSdTQAAIBshwLtR9pXaK+kqCT1DOupN1e/qbDhYfr2t29dxwIAAMhWKNB+pmi+ohrbdqy+vudrnU4+rXrj6un+hffryKkjrqMBAABkCxRoP3VnuTsVPzBeD9V4SNEboxUyLESLf1rsOhYAAECWR4H2YwVzF9SHzT7U6vtWq0CuAmr2eTP1+qKX9h3f5zoaAABAlkWBhmrdWEtbBmzRc/We0+T4yfJEezQzaSaPAwcAALgACjQkSXmC8uiVhq8otl+sbix8ozrN6KQO0zvozyN/uo4GAACQpVCg8f+ElQzTur7r9Fbjt/TVT1/JE+3RuC3jmI0GAADwokDjfwQFBOmJOk8oLjJOFUtU1H1f3qcmk5rolwO/uI4GAADgHAUaF3Vbsdu0vNdyDWs5TOt3rVfIsBB9vP5jJacku44GAADgDAUalxRgAhQZHqnEqETVL11fDy16SPXG1VPS3iTX0QAAAJygQCNNbrzqRi3otkCT7pqkH/b9oMojKuvVla/qTPIZ19EAAAAyFQUaaWaMUfeK3ZU0KEl33X6Xnl/+vMJHhWvT7k2uowEAAGQaCjTS7doC12pqx6n64u4vtPfYXlUfXV1PLnlSJ86ccB0NAADA5yjQ+Nfa3t5WSYOS1KdyH7295m2FDQ/Tyl9Xuo4FAADgUxRoXJEieYtoZOuRWtZzmZJtsuqPr6+oBVE6fOqw62gAAAA+QYFGhmh4c0Nti9ymR2s+qhGbRig4OlgLf1zoOhYAAECGo0AjwxTIXUDvNX1Pa+5bo8J5Cqvl5Ja6Z/Y9+uf4P66jAQAAZBgKNDJcjRtqaHP/zXqh/gualjhNnqEeTUuYxuPAAQBAjkCBhk/kCcqjFxu8qM39N6t0kdLqMquL2k1rp91HdruOBgAAcEUo0PCp0BKhWttnrd69810t+XmJPEM9Gr15NLPRAAAg26JAw+eCAoI0uPZgbRu4TZWvq6x+8/qp8cTG+nn/z66jAQAApBsFGpnmlqtv0bKeyzSi1QjF7o5V6LBQvb/2fSWnJLuOBgAAkGYUaGSqABOg/lX7KzEqUY3KNtLgrwer9tjaStiT4DoaAABAmlCg4cQNhW/Ql12+1OT2k7XjwA5VGVFFL8W8pNPJp11HAwAAuCQKNJwxxqhraFclRSWpU3AnvbjiRVUdWVUb/9joOhoAAMBFUaDhXPECxfV5+881r+s8HThxQDXH1NRjXz+m42eOu44GAADwPyjQyDJa3dZKiVGJ6leln95b+54qDquo5b8sdx0LAADg/6FAI0u5Ku9VGt5quJb3Si3ODSc01IB5A3To5CHHyQAAAFJRoJElNSjTQNsGbtNjtR7T6C2j5Yn2aN7381zHAgAAoEAj68qfK7/eafKO1vVZp2L5iqnN1DbqNqub9h7b6zoaAADwYxRoZHnVSlVTbP9YvdTgJc1MmqkKQytocvxkHgcOAACcoEAjW8gdmFtD6g/RlgFbdMvVt6j77O5qM7WNdh3e5ToaAADwMxRoZCvB1wZr9X2r9UHTD/TNL9/IM9SjEbEjlGJTXEcDAAB+ggKNbCcwIFAP13xY8QPjVb1UdUUuiFTDzxrqx30/uo4GAAD8AAUa2VbZomW1pMcSjW49Wlv/2qqKwyvq3TXv6mzKWdfRAABADkaBRrZmjFGfKn2UNChJTcs11eNLHletMbW07e9trqMBAIAcigKNHOH6Qtdrzt1zNK3jNP168FdVHVlVLyx/QafOnnIdDQAA5DAUaOQYxhh1Du6s7YO2q2tIV7288mVVGVlF63atcx0NAADkIBRo5DjF8hfThLsmaGG3hTpy6ohqj6mtRxY9omOnj7mOBgAAcgAKNHKs5rc2V0JUggaGD9SH6z9U6LBQLduxzHUsAACQzVGgkaMVzlNYQ1sO1Yp7VygoIEiNJzZW3y/76uDJg66jAQCAbIoCDb9wR+k7FBcZpyfrPKnxW8fLM9Sjud/NdR0LAABkQxRo+I18ufLpzcZvan3f9bq2wLVqN62d7p55t/4++rfraAAAIBuhQMPvVL2+qjb226jXGr6mL777Qp5ojybGTZS11nU0AACQDVCg4ZdyBebSM/We0dYBW1W+WHn1/KKnWk5uqb9PMhsNAAAujQINv1aheAWt6r1KHzf7WCt/Xanesb0VvTFaKTbFdTQAAJBFUaDh9wIDAvVAjQeUEJWg4MLBGrRwkBqMb6Af9v3gOhoAAMiCfFagjTFjjTF7jDEJlzimgTFmqzEm0RizwldZgLQoU6SM3g59W+PajlP8nnhVHFZRb337ls6mnHUdDQAAZCG+nIEeL6nZxXYaY4pIipbUxlobLKmTD7MAaWKM0b2V7lVSVJJa3tZSTy17SjVG11DcX3GuowEAgCzCZwXaWrtS0v5LHNJN0mxr7W/e4/f4KguQXtcVuk6zOs/SzE4z9cfhPxQ+KlzPffOcTp496ToaAABwzOUa6NskFTXGxBhjNhljejrMAlxQB08HJQ1KUvfQ7npt1WuqPKKy1vy+xnUsAADgkPHlvW+NMWUkzbfWhlxg36eSwiU1kpRP0lpJLa21//PJLWNMf0n9JalEiRJVp06d6rPMl3L06FEVLFjQybWROS41xhv2b9D7P7yvPaf2qF2pdup3cz/lC8yXyQmREfhd9g+Ms39gnHM+l2McERGxyVobfv52lwX6KUn5rLUveN+PkbTIWjvjUucMDw+3sbGxPkh7eTExMWrQoIGTayNzXG6Mj5w6omeWPaOhG4fqpqtu0sjWI9WkXJPMC4gMwe+yf2Cc/QPjnPO5HGNjzAULtMslHHMl1TXGBBlj8kuqIWm7wzzAZRXKU0iftPhEK3uvVN6gvGo6qal6z+2tAycOuI4GAAAyiS9vYzdFqcsyyhtjdhlj+hhjIo0xkZJkrd0uaZGkbZI2SBptrb3oLe+ArKTuTXW1NXKrnqn7jCbGTZQn2qPZ22e7jgUAADJBkK9ObK3tmoZj3pH0jq8yAL6UNyivXmv0mjoFd9J9c+9Th+kd1KFCB33a4lOVLFjSdTwAAOAjPIkQuEKVSlbS+r7r9UajNzT/h/nyDPVo/Nbx8uXnCwAAgDsUaCAD5ArMpafqPqW4yDgFXxus3nN7q9nnzbTz4E7X0QAAQAajQAMZqPw15bXi3hX6tPmnWvP7GoVEh+iT9Z8oxaa4jgYAADIIBRrIYAEmQIOqD1LCwATVK11PDy56UHeMu0Pf/fOd62gAACADUKABHyldpLQWdluoCe0maPs/2xU2PEyvr3pdZ5LPuI4GAACuAAUa8CFjjHqE9VBSVJLalm+rZ795VtVHV9fmPze7jgYAAP4lCjSQCUoULKHpnaZrdufZ+uvoX6o+qrqeXvq0Tpw54ToaAABIJwo0kInuqnCXkqKS1Cusl95c/aYqjaikb3/71nUsAACQDhRoIJMVzVdUY9qO0ZIeS3Q6+bTqjaun+xferyOnjriOBgAA0oACDTjSuGxjxQ+M18M1Hlb0xmiFDAvRop8WuY4FAAAugwINOFQwd0F90OwDrb5vtQrkKqDmnzdXry96ad/xfa6jAQCAi6BAA1lArRtracuALXr+juc1OX6yPNEezUicwePAAQDIgijQQBaRJyiPXo54WbH9YnVj4RvVeWZntZ/eXn8e+dN1NAAAcA4KNJDFhJUM07q+6/R247e16KdFqjC0gsZuGctsNAAAWQQFGsiCggKC9HidxxUXGaewkmHq82UfNZnURL8c+MV1NAAA/B4FGsjCbit2m5b3Wq5hLYdp/a71ChkWoo/WfaTklGTX0QAA8FsUaCCLCzABigyPVGJUohqUaaCHFz+suuPqKmlvkutoAAD4JQo0kE3ceNWNmt91vibdNUk/7vtRlUdU1isrXtHp5NOuowEA4Fco0EA2YoxR94rdlTQoSe0rtNeQmCGqNqqaYnfHuo4GAIDfoEAD2dC1Ba7VlA5TNLfLXP1z/B/VGF1DTyx5QifOnHAdDQCAHI8CDWRjbcq3UWJUovpU7qN31ryjisMrasXOFa5jAQCQo1GggWyuSN4iGtl6pJb1XKYUm6IGnzXQwPkDdfjUYdfRAADIkSjQQA7R8OaGih8Yr0drPqqRm0cqODpYC35Y4DoWAAA5DgUayEHy58qv95q+pzX3rdFVea5SqymtdM/se/TP8X9cRwMAIMegQAM5UI0bamjzgM16of4Lmp44XRWGVtDUhKk8DhwAgAxAgQZyqNyBufVigxe1qf8m3VzkZnWd1VXtprXTH4f/cB0NAIBsjQIN5HChJUK1ts9avXvnu1ry8xJ5oj0atWkUs9EAAPxLFGjADwQGBGpw7cHaNnCbqlxXRf3n91ejCY308/6fXUcDACDboUADfuSWq2/RNz2/0chWI7Xpz00KHRaq99e+r+SUZNfRAADINijQgJ8xxqhf1X5KikpS47KNNfjrwao9trYS9iS4jgYAQLZAgQb8VKnCpTS3y1xN6TBFOw7sUJURVfRSzEs6nXzadTQAALI0CjTgx4wx6hLSRdsHbVen4E56ccWLqjqyqjb8scF1NAAAsiwKNABdk/8afd7+c83rOk8HThxQrTG19NjXj+n4meOuowEAkOVQoAH8V6vbWilpUJL6V+mv99a+p9BhoVr+y3LXsQAAyFIo0AD+n8J5CmtYq2GK6RWjABOghhMaasC8ATp08pDraAAAZAkUaAAXVL9MfcVFxunx2o9r9JbR8kR7NO/7ea5jAQDgHAUawEXlz5Vfb9/5ttb3Xa9i+YqpzdQ26jqrq/Ye2+s6GgAAzlCgAVxW+PXhiu0fq5cbvKxZSbNUYWgFTY6fzOPAAQB+iQINIE1yB+bW8/Wf15YBW3RrsVvVfXZ3tZ7SWr8f+t11NAAAMhUFGkC6BF8brG97f6sPm36o5TuXKzg6WMNjhyvFpriOBgBApqBAA0i3wIBAPVTzIcUPjFf1UtU1cMFANfysoX7c96PraAAA+BwFGsC/VrZoWS3psURj2ozR1r+2quLwinpn9Ts6m3LWdTQAAHyGAg3gihhjdF/l+5Q0KElNyzXVE0ufUK0xtbTt722uowEA4BMUaAAZ4vpC12vO3XM0veN0/XboN1UdWVVDlg/RqbOnXEcDACBDUaABZBhjjDoFd1JSVJK6hnTVKytfUZWRVbRu1zrX0QAAyDAUaAAZrlj+Yppw1wQt7LZQR04dUe0xtfXIokd07PQx19EAALhiFGgAPtP81uZKjEpUVLUofbj+Q4UMC9HSHUtdxwIA4IpQoAH4VKE8hfRpi0+18t6VyhWQS3dOvFN95vbRwZMHXUcDAOBfoUADyBT1StdTXGScnqrzlD6L+0yeoR598d0XrmMBAJBuPivQxpixxpg9xpiEyxxXzRhz1hjT0VdZAGQN+XLl0xuN39D6vut1bYFrdde0u9R5Rmf9ffRv19EAAEgzX85Aj5fU7FIHGGMCJb0l6Wsf5gCQxVS9vqo29tuo1xq+prnfz5Un2qOJcRNlrXUdDQCAy/JZgbbWrpS0/zKHPSBplqQ9vsoBIGvKFZhLz9R7RnGRcbr9mtvV84ueajG5hX479JvraAAAXJLx5YyPMaaMpPnW2pAL7CslabKkCEljvcfNvMh5+kvqL0klSpSoOnXqVF9FvqSjR4+qYMGCTq6NzMEYu5FiU/TF7i80ascoGWPU7+Z+ant9WwUY3/yNzzj7B8bZPzDOOZ/LMY6IiNhkrQ0/f7vLAj1D0nvW2nXGmPG6RIE+V3h4uI2Njc3oqGkSExOjBg0aOLk2Mgdj7NbOgzvVf15/LdmxRHVvqqvRrUer/DXlM/w6jLN/YJz9A+Oc87kcY2PMBQu0y7twhEuaaozZKamjpGhjTDuHeQA4VqZIGS2+Z7HGtR2nhD0JChsepje/fVNnU866jgYAwH85K9DW2puttWWstWUkzZQUZa3lnlaAnzPG6N5K92r7oO1qeVtLPb3sadUYXUNb/9rqOhoAAJJ8exu7KZLWSipvjNlljOljjIk0xkT66poAco6SBUtqVudZmtlppv44/IfCR4br2WXP6uTZk66jAQD8XJCvTmyt7ZqOY+/1VQ4A2VsHTwdF3ByhwV8P1uvfvq7Z383W6NajVeemOq6jAQD8FE8iBJDlXZ3vao1rO06L71msE2dOqN64enrwqwd19PRR19EAAH6IAg0g22hSrokSohJ0f/X79emGTxUSHaKvf+Y5TACAzEWBBpCtFMxdUB83/1ireq9S3qC8ajqpqXrP7a39Jy733CYAADIGBRpAtlTnpjraGrlVz9Z7VhPjJsoz1KNZSbNcxwIA+AEKNIBsK29QXr3a8FXF9o/V9YWuV8cZHdVxekf9dfQv19EAADkYBRpAtlepZCVt6LdBbzZ6U/N/mC/PUI/Gbx0vXz5pFQDgvyjQAHKEoIAgPVn3ScVFxin42mD1nttbTSc11c6DO11HAwDkMBRoADlK+WvKa8W9KzS0xVCt3bVWIdEh+mT9J0qxKa6jAQByCAo0gBwnwAQoqlqUEgYmqF7penpw0YOqN66etu/d7joaACAHoEADyLFKFymthd0WakK7Cfrun1HggAQAACAASURBVO9UaUQlvb7qdZ1NOes6GgAgG6NAA8jRjDHqEdZDSVFJand7Oz37zbOK3BypzX9udh0NAJBNUaAB+IUSBUtoWsdpmnP3HB04c0DVR1XXU0uf0okzJ1xHAwBkMxRoAH6l3e3tND58vO6tdK/eWv2WKo2opFW/rnIdCwCQjVCgAfidQrkKaXSb0VrSY4lOJ5/WHePv0KAFg3Tk1BHX0QAA2QAFGoDfaly2sRIGJujhGg9rWOwwBUcH66sfv3IdCwCQxVGgAfi1ArkL6INmH2j1fatVKE8htZjcQj3n9NS+4/tcRwMAZFEUaACQVOvGWtrcf7Oev+N5TUmYIk+0RzMSZ/A4cADA/6BAA4BXnqA8ejniZW3qv0k3Fr5RnWd2Vvvp7bX7yG7X0QAAWQgFGgDOU7FERa3ru05vN35bi35aJM9Qj8ZsHsNsNABAEgUaAC4oKCBIj9d5XNsitymsZJj6zuurOyfeqR0HdriOBgBwjAINAJdwa7FbtbzXcg1rOUwb/tig0GGh+nDdh0pOSXYdDQDgCAUaAC4jwAQoMjxSiVGJiigToUcWP6K64+oqaW+S62gAAAco0ACQRjdedaPmdZ2nz9t/rh/3/ajKIyrrlRWv6HTyadfRAACZiAINAOlgjFG30G7aPmi72ldoryExQxQ+Mlwb/9joOhoAIJNQoAHgXyheoLimdJiiuV3mat+Jfao5pqaeWPKEjp857joaAMDHKNAAcAXalG+jpKgk9ancR++seUdhw8O0YucK17EAAD5EgQaAK3RV3qs0svVILeu5TCk2RQ0+a6CB8wfq8KnDrqMBAHyAAg0AGaThzQ0VPzBeg2sN1sjNIxUcHawFPyxwHQsAkMEo0ACQgfLnyq93m7yrtX3WqkjeImo1pZW6z+6uvcf2uo4GAMggFGgA8IHqpaprU/9NerH+i5qROEOeaI+mJkzlceAAkANQoAHAR3IH5tYLDV7Q5gGbVbZoWXWd1VVtp7bVH4f/cB0NAHAFKNAA4GMh14ZozX1r9F6T97R0x1J5oj0atWkUs9EAkE1RoAEgEwQGBOrRWo8qfmC8ql5XVf3n91ejCY308/6fXUcDAKQTBRoAMlG5q8tpWc9lGtV6lDb9uUmhw0L1/tr3lZyS7DoaACCNKNAAkMmMMepbpa+SopLUuGxjDf56sGqPra2EPQmuowEA0oACDQCOlCpcSnO7zNXUDlP1y4FfVGVEFb0Y86JOJ592HQ0AcAkUaABwyBiju0PuVtKgJHUO7qyXVrykKiOqaMMfG1xHAwBcBAUaALKAa/Jfo0ntJ2l+1/k6dOqQao2ppcGLB+v4meOuowEAzkOBBoAspOVtLZUYlaj+Vfrr/XXvK3RYqJb/stx1LADAOSjQAJDFFM5TWMNaDVNMrxgFmAA1nNBQ/ef118GTB11HAwCIAg0AWVb9MvW1LXKbnqj9hMZsGaPg6GB9+f2XrmMBgN+jQANAFpYvVz69dedbWt93vYrlK6a2U9uqy8wu2nNsj+toAOC30lSgjTEFjDEB3q9vM8a0Mcbk8m00AMB/hF8frtj+sXol4hXN+W6OPEM9+nzb5zwOHAAcSOsM9EpJeY0xpSR9LamHpPG+CgUA+F+5A3PruTue05YBW3RrsVt1z5x71HpKa/1+6HfX0QDAr6S1QBtr7XFJ7SVFW2s7SQr2XSwAwMV4inv0be9v9WHTD7V853IFRwdreOxwpdgU19EAwC+kuUAbY2pJ6i5pgXdboG8iAQAuJzAgUA/VfEgJAxNU44YaGrhgoCI+i9CP+350HQ0Acry0FuiHJT0taY61NtEYU1YSNyYFAMduLnqzvr7na41pM0Zxf8Wp4vCKenv12zqbctZ1NADIsdJUoK21K6y1bay1b3k/TPiPtfZBH2cDAKSBMUb3Vb5PSYOS1OyWZnpy6ZOqObqm4v6Kcx0NAHKktN6FY7IxprAxpoCkBElJxpjHL/M9Y40xe4wxCRfZ390Ys80YE2+MWWOMCUt/fADAf1xf6HrN7jxb0ztO1++Hf1f4qHA9/83zOnX2lOtoAJCjpHUJh8dae1hSO0lfSbpZqXfiuJTxkppdYv8vkupba0MlvSJpZBqzAAAuwhijTsGdlBSVpG6h3fTqqldVeURlrf19retoAJBjpLVA5/Le97mdpC+ttWckXfLmo9balZL2X2L/GmvtAe/bdZJuSGMWAMBlFMtfTJ+1+0xfdf9Kx84cU52xdfTwood17PQx19EAINtLa4EeIWmnpAKSVhpjSks6nIE5+ih1ZhsAkIGa3dJMCQMTFFUtSh+t/0ghw0K0dMdS17EAIFsz//YpVsaYIGvtJT/mbYwpI2m+tTbkEsdESIqWVNdau+8ix/SX1F+SSpQoUXXq1Kn/KvOVOnr0qAoWLOjk2sgcjLF/8Ndx3nZwm9794V39fuJ3NS/ZXAPLDlShXIVcx/IZfx1nf8M453wuxzgiImKTtTb8/O1pKtDGmKskvSDpDu+mFZJettYeusz3ldElCrQxpqKkOZKaW2t/uGwQSeHh4TY2NjYth2a4mJgYNWjQwMm1kTkYY//gz+N88uxJvRTzkt5Z846KFyiu6BbRuqvCXa5j+YQ/j7M/YZxzPpdjbIy5YIFO6xKOsZKOSOrsfR2WNO4KA90kabakHmktzwCAK5M3KK/eaPyGNvTboJIFS6r99PbqPKOz/j76t+toAJBtpLVAl7PWvmCt3eF9vSSp7KW+wRgzRdJaSeWNMbuMMX2MMZHGmEjvIUMkFZMUbYzZaoxxM60MAH6oynVVtKHvBr3W8DXN/X6uKgytoAlxE/Rvl/UBgD9Ja4E+YYyp+583xpg6kk5c6hustV2ttddZa3NZa2+w1o6x1g631g737u9rrS1qra3kff3P9DgAwHdyBebSM/WeUVxknCoUr6BeX/RSi8kt9Nuh31xHA4AsLa0FOlLSUGPMTmPMTkmfShrgs1QAgExz+zW3a1XvVfqk+Sda9esqBUcHa+iGoUqxKa6jAUCWlNZHecdZa8MkVZRU0VpbWVJDnyYDAGSaABOg+6vfr4SoBNW+sbbu/+p+1R9fX9//873raACQ5aR1BlqSZK097H0ioSQ96oM8AACHyhQpo0XdF2l82/FK3JOosOFhevPbN3Um+YzraACQZaSrQJ/HZFgKAECWYYxRr0q9lDQoSa1ua6Wnlz2tGqNraMufW1xHA4As4UoKNB/VBoAcrGTBkprZeaZmdpqp3Ud2q9qoanp22bM6efak62gA4NQlC7Qx5ogx5vAFXkckXZ9JGQEADnXwdND2QdvVM6ynXv/2dVUaXkmrf1vtOhYAOHPJAm2tLWStLXyBVyFrbVBmhQQAuFU0X1GNbTtWi+9ZrJNnT6reuHp68KsHdfT0UdfRACDTXckSDgCAn2lSrokSohL0QPUH9OmGTxUcHazFPy12HQsAMhUFGgCQLgVzF9RHzT/Sqt6rlD9XfjX7vJnu/eJe7T+x33U0AMgUFGgAwL9S56Y62jJgi56t96wmbZskz1CPZiXNch0LAHyOAg0A+NfyBuXVqw1fVWz/WJUqXEodZ3RUh+kd9OeRP11HAwCfoUADAK5YpZKVtL7ver3Z6E0t+GGBPNEejd86XtZyx1MAOQ8FGgCQIYICgvRk3Se1beA2hV4bqt5ze6vppKbaeXCn62gAkKEo0ACADHVbsdsUc2+MhrYYqrW71iokOkQfr/9YySnJrqMBQIagQAMAMlyACVBUtSglRiWqXul6emjRQ7pj/B3avne762gAcMUo0AAAn7npqpu0sNtCTWg3Qd/9850qjaik11a+pjPJZ1xHA4B/jQINAPApY4x6hPVQUlSS2t3eTs8tf07VRlXT5j83u44GAP8KBRoAkClKFCyhaR2nac7dc7Tn2B5VH1VdTy19SifOnHAdDQDShQINAMhU7W5vp6RBSbq30r16a/VbChseppW/rnQdCwDSjAINAMh0RfIW0eg2o7W0x1KdTTmr+uPra9CCQTp86rDraABwWRRoAIAzjco2UvzAeD1c42ENix2mkOgQffXjV65jAcAlUaABAE4VyF1AHzT7QGv6rFGhPIXUYnIL9ZzTU/uO73MdDQAuiAINAMgSat5QU5v7b9aQO4ZoSsIUVRhaQdMTp/M4cABZDgUaAJBl5AnKo5ciXtKm/ptUukhp3T3zbt017S7tPrLbdTQA+C8KNAAgy6lYoqLW9lmrd+58R4t/XizPUI/GbB7DbDSALIECDQDIkoICgvRY7ccUPzBelUpWUt95fdV4YmPtOLDDdTQAfo4CDQDI0m65+hZ90+sbDW85XBv/2KjQYaH6cN2HSk5Jdh0NgJ+iQAMAsrwAE6AB4QOUNChJEWUi9MjiR1RnbB0l7kl0HQ2AH6JAAwCyjRsK36B5Xefp8/af66f9P6nyiMp6ZcUrOp182nU0AH6EAg0AyFaMMeoW2k3bB21XR09HDYkZovCR4dr4x0bX0QD4CQo0ACBbKl6guCZ3mKwvu3yp/Sf2q+aYmnr868d1/Mxx19EA5HAUaABAtta6fGslRiWqb+W+enftuwobHqaYnTGuYwHIwSjQAIBs76q8V2lE6xH6puc3stYq4rMIvf/D+zp08pDraAByIAo0ACDHiLg5QtsGbtPgWoO14M8FCo4O1oIfFriOBSCHoUADAHKU/Lny690m7+rTyp+qaL6iajWllbrP7q69x/a6jgYgh6BAAwBypAqFK2hT/016qcFLmpE4Q55oj6bET+Fx4ACuGAUaAJBj5Q7MrSH1h2jzgM0qW7Ssus3upjZT22jX4V2uowHIxijQAIAcL+TaEK25b43eb/K+lu1YpuDoYI3cNFIpNsV1NADZEAUaAOAXAgMC9UitRxQ/MF5Vr6uqAfMHqNGERvpp/0+uowHIZijQAAC/Uu7qclrWc5lGtR6lzX9uVsVhFfXemveUnJLsOhqAbIICDQDwO8YY9a3SV0lRSbqz3J16bMljqjWmluL/jncdDUA2QIEGAPitUoVL6Yu7v9DUDlO18+BOVRlZRS8sf0Gnzp5yHQ1AFkaBBgD4NWOM7g65W0mDktQlpIteXvmyqo6sqvW71ruOBiCLokADACDpmvzXaOJdEzW/63wdOnVItcbU0qOLH9Wx08dcRwOQxVCgAQA4R8vbWioxKlGR4ZH6YN0Hqji8or755RvXsQBkIRRoAADOUzhPYUW3jFZMrxgFmkA1mtBI/b7sp4MnD7qOBiALoEADAHAR9cvUV1xknJ6o/YTGbh2r4Ohgffn9l65jAXCMAg0AwCXky5VPb935ltb3Xa9r8l+jtlPbqsvMLtpzbI/raAAc8VmBNsaMNcbsMcYkXGS/McZ8bIz5yRizzRhTxVdZAAC4UuHXhyu2X6xeiXhFc76bowpDK2jStkmy1rqOBiCT+XIGerykZpfY31zSrd5Xf0nDfJgFAIArliswl5674zltGbBFtxW7TT3m9FCrKa30+6HfXUcDkIl8VqCttSsl7b/EIW0lTbCp1kkqYoy5zld5AADIKJ7iHn3b+1t92PRDxeyMUXB0sIZtHKYUm+I6GoBM4HINdClJ5/7Jvsu7DQCALC8wIFAP1XxICQMTVOOGGopaGKWIzyL0474fXUcD4GPGl2u3jDFlJM231oZcYN98SW9aa7/1vl8m6UlrbewFju2v1GUeKlGiRNWpU6f6LPOlHD16VAULFnRybWQOxtg/MM7+ITPH2VqrRX8vUvTP0Tqdclr3lr5XnW/srEATmCnX92f8Pud8Lsc4IiJik7U2/PztLgv0CEkx1top3vffS2pgrf3zUucMDw+3sbH/07EzRUxMjBo0aODk2sgcjLF/YJz9g4tx/vPInxq0cJDmfDdHVa6rorFtxiqsZFimZvA3/D7nfC7H2BhzwQLtcgnHl5J6eu/GUVPSocuVZwAAsrLrCl2nWZ1naUanGdp1eJfCR4Xr+W+e16mzp1xHA5CBfHkbuymS1koqb4zZZYzpY4yJNMZEeg9ZKGmHpJ8kjZIU5assAABkFmOMOno6KikqSd1Cu+nVVa+q8ojKWvv7WtfRAGQQX96Fo6u19jprbS5r7Q3W2jHW2uHW2uHe/dZaO8haW85aG3qhtc8AAGRXxfIX02ftPtNX3b/SsTPHVGdsHT286GEdPX3UdTQAV4gnEQIA4EPNbmmmhIEJGlRtkD5a/5FCh4Vqyc9LXMcCcAUo0AAA+FihPIX0SYtPtKr3KuUJzKMmk5qoz9w+OnDigOtoAP4FCjQAAJmk7k11tTVyq56u+7Q+i/tMnmiP5myf4zoWgHSiQAMAkInyBuXV641e14Z+G1SyYEm1n95enWZ00l9H/3IdDUAaUaABAHCgynVVtKHvBr3e8HXN+36ePEM9mhA3Qb58PgOAjEGBBgDAkVyBufR0vae1NXKrPMU96vVFLzX/vLl+Pfir62gALoECDQCAY7dfc7tW9l6pT5p/om9/+1Yhw0I0dMNQpdgU19EAXAAFGgCALCDABOj+6vcrMSpRdW6so/u/ul/1x9fX9/987zoagPNQoAEAyEJKFymtr7p/pfFtxytxT6LChofpjVVv6EzyGdfRAHhRoAEAyGKMMepVqZeSBiWpdfnWeuabZ1RjdA1t+XOL62gARIEGACDLKlmwpGZ0mqFZnWdp95Hdqjaqmp5Z9oxOnj3pOhrg1yjQAABkce0rtNf2QdvVM6yn3vj2DVUaXkmrf1vtOhbgtyjQAABkA0XzFdXYtmP19T1f61TyKdUbV08PLHxAR04dcR0N8DsUaAAAspE7y92p+IHxeqD6Axq6cahChoVo8U+LXccC/AoFGgCAbKZg7oL6qPlH+va+b5U/V341+7yZen3RS/tP7HcdDfALFGgAALKp2jfW1pYBW/RsvWc1OX6yKgytoJlJM13HAnI8CjQAANlY3qC8erXhq9rYb6NuKHyDOs3opA7TO+jPI3+6jgbkWBRoAABygEolK2l93/V6q/FbWvjjQnmiPRq3ZZysta6jATkOBRoAgBwiKCBIT9R5QnGRcQq9NlT3fXmfmk5qql8O/OI6GpCjUKABAMhhbit2m2LujVF0i2it3bVWIcNC9PH6j5Wckuw6GpAjUKABAMiBAkyABlYbqMSoRNUvXV8PLXpI9cbV0/a9211HA7I9CjQAADnYTVfdpAXdFmjiXRP1/b7vVWlEJb228jWdST7jOhqQbVGgAQDI4YwxuqfiPdo+aLva3d5Ozy1/TuGjwrVp9ybX0YBsiQINAICfuLbAtZrWcZrm3D1He4/tVY3RNfTU0qd04swJ19GAbIUCDQCAn2l3ezslDUpS70q99dbqtxQ2PEwrf13pOhaQbVCgAQDwQ0XyFtGoNqO0tMdSnU05q/rj6ytqQZQOnzrsOhqQ5VGgAQDwY43KNlL8wHg9UvMRDY8drpDoEC38caHrWECWRoEGAMDPFchdQO83fV9r+qxRoTyF1HJyS/WY00P/HP/HdTQgS6JAAwAASVLNG2pqc//NGnLHEE1NmCrPUI+mJ07nceDAeSjQAADgv/IE5dFLES9pU/9NKl2ktO6eebfumnaXdh/Z7ToakGVQoAEAwP+oWKKi1vZZq3fvfFeLf14sz1CPRm8ezWw0IAo0AAC4iKCAIA2uPVjxA+NVqWQl9ZvXT40nNtaOAztcRwOcokADAIBLuuXqW/RNr280otUIbfxjo0KiQ/TB2g+UnJLsOhrgBAUaAABcVoAJUP+q/ZU0KEkNb26oR79+VHXG1lHinkTX0YBMR4EGAABpdkPhGzSv6zxNbj9ZPx/4WZVHVNbLK17W6eTTrqMBmYYCDQAA0sUYo66hXZUUlaROwZ30QswLCh8Zro1/bHQdDcgUFGgAAPCvFC9QXJ+3/1xfdvlS+0/sV80xNfX414/r+JnjrqMBPkWBBgAAV6R1+dZKjEpUvyr99O7ad1VxWEXF7IxxHQvwGQo0AAC4YlflvUrDWw3XNz2/kSRFfBahAfMG6NDJQ46TARmPAg0AADJMxM0R2jZwmx6r9ZhGbxmt4Ohgzf9hvutYQIaiQAMAgAyVP1d+vdPkHa3rs05X57tarae0VrdZ3bT32F7X0YAMQYEGAAA+Ua1UNcX2j9VLDV7SzKSZ8kR7NCV+Co8DR7ZHgQYAAD6TOzC3htQfoi0Dtqhc0XLqNrub2kxto12Hd7mOBvxrFGgAAOBzwdcGa/V9q/V+k/e1bMcyeYZ6NCJ2hFJsiutoQLpRoAEAQKYIDAjUI7UeUUJUgqqVqqbIBZFqNKGRftr/k+toQLpQoAEAQKYqW7SslvZYqlGtR2nzn5sVOixU7655V2dTzrqOBqQJBRoAAGQ6Y4z6VumrpKgkNSnXRI8veVy1x9RW/N/xrqMBl0WBBgAAzpQqXEpf3P2FpnWcpp0Hd6rKyCp6YfkLOnX2lOtowEX5tEAbY5oZY743xvxkjHnqAvtvMsYsN8ZsMcZsM8a08GUeAACQ9Rhj1Dm4s7YP2q4uIV308sqXVWVkFa3btc51NOCCfFagjTGBkoZKai7JI6mrMcZz3mHPSZpura0sqYukaF/lAQAAWVux/MU08a6JWtBtgQ6fOqzaY2rr0cWP6tjpY66jAf+PL2egq0v6yVq7w1p7WtJUSW3PO8ZKKuz9+ipJu32YBwAAZAMtbm2hxKhERYZH6oN1Hyh0WKiW7VjmOhbwX74s0KUk/X7O+13ebed6UdI9xphdkhZKesCHeQAAQDZROE9hRbeM1op7VygoIEiNJzZWvy/76eDJg66jATK+epymMaajpGbW2r7e9z0k1bDW3n/OMY96M7xnjKklaYykEGv//13VjTH9JfWXpBIlSlSdOnWqTzJfztGjR1WwYEEn10bmYIz9A+PsHxjnnONU8il99utnmvb7NBXNXVQP3/qw6l5TVxLj7A9cjnFERMQma234+dt9WaBrSXrRWtvU+/5pSbLWvnHOMYlKLdm/e9/vkFTTWrvnYucNDw+3sbGxPsl8OTExMWrQoIGTayNzMMb+gXH2D4xzzrNp9yb1+bKP4v6O093Bd+vj5h8raWMS45zDufxdNsZcsED7cgnHRkm3GmNuNsbkVuqHBL8875jfJDXyBqwgKa+kvT7MBAAAsqmq11fVxn4b9WrEq5rz3RxVGFpBS/5eIl9NBgIX47MCba09K+l+SYslbVfq3TYSjTEvG2PaeA8bLKmfMSZO0hRJ91p+CwAAwEXkCsylZ+94VlsHbFX5YuX1+nevq+Xklvrt0G+uo8GP+PQ+0Nbahdba26y15ay1r3m3DbHWfun9OslaW8daG2atrWSt/dqXeQAAQM5QoXgFreq9SveX+7/27j1O6znv4/jr00FZIWdWyKKYSqKDQ5FYtNyJxBKtENU47eJ22JO1N4tde7tXTWXbjBxuh/SQQ5LbpiilaNI0kdM6LTfaHJJQ873/mGvvx5ilumpmfnN4PR+PHub6Xb/r+r7N5zF5+85v5nc+M96cQYeiDoyeN5ryb/4YlVQjvBOhJEmql5o2acqANgMoHV7KgW0OZMSUEfQu7s3SZUuzjqYGzgItSZLqtd232p1pp09jfL/xLPpgEZ3HdObGWTeyunx11tHUQFmgJUlSvRcRDOkyhLIRZfTdsy+X/8/l9BjXg4XvL8w6mhogC7QkSWowdtp8JyadMomJAyfy7qfv0vXPXfnFX3/BqtWrso6mBsQCLUmSGpwBBQMoKyxjUKdBXPv0tXQZ24XZb8/OOpYaCAu0JElqkLbedGuK+xczddBUVn69kp7je3LRYxex4qsVWUdTPWeBliRJDdrRex5N6fBSCrsVcstzt9BpdCeeeO2JrGOpHrNAS5KkBm/zFptzy49uYeaQmbRo2oKj7jyKsyafxfIvlmcdTfWQBVqSJDUaPXftScmwEq7seSUTFk6goKiASUsmZR1L9YwFWpIkNSotm7XkuiOuY97QeezYakcG3DeAk+47ifdXvJ91NNUTFmhJktQoddmpC8+d8xzX9bmOR5Y+QsGoAm4vuZ2UUtbRVMdZoCVJUqPVvGlzrux1JSXDSijYroAzJ59J37v68ubHb2YdTXWYBVqSJDV6e2+7NzOHzGRk35HMensWHYo6MPK5kZSn8qyjqQ6yQEuSJAFNogmF3QspHV5Kz117csFjF3DobYfy0kcvZR1NdYwFWpIkqZLdWu/GY4Me4/b+t1P2YRmdx3Tmuqev4+s1X2cdTXWEBVqSJKmKiGBw58EsKVxCv/b9+Plff073cd1Z8N6CrKOpDrBAS5IkfYcdWu3A/QPv54GTH+D9Fe/T7c/duPJ/rmTV6lVZR1OGLNCSJEnrcOI+J1I2oozBnQdz/azr6TymM8+89UzWsZQRC7QkSdJ62GrTrRh//HimnT6Nr9Z8Ra/benH+lPP57MvPso6mWmaBliRJysMP9/ghi4Yv4qIeF1E0r4iOozsy9dWpWcdSLbJAS5Ik5anVJq24+ZibmXXWLDZrvhl97+rLTx78CctWLss6mmqBBVqSJGkDHbTLQSw4bwG/6PUL7l50NwVFBUwsm+jtwBs4C7QkSdJGaNGsBb/t81vmD53PLlvswsD7BzLgvgG899l7WUdTDbFAS5IkVYPOO3ZmzjlzuOHIG3js1ccoKCrgtgW3uRvdAFmgJUmSqkmzJs3490P+nYXDFrLvDvty1kNncdSdR/HG8jeyjqZqZIGWJEmqZu22acf0n0xn9LGjmfvOXDqO7sh/zfkv1pSvyTqaqoEFWpIkqQY0iSYM6zqMxSMWc9huh3Hx4xfT67ZelH1YlnU0bSQLtCRJUg3aZctdePS0R7nzhDtZumwpXcZ24T9m/gdfr/k662jaQBZoSZKkGhYRDNp3EGWFZZyw9wn8cvov6frnrjz/9+ezjqYNYIGWJEmqJdtvtj33nHQPD57yIB+t/Iju47pz+ROX88XXX2QdTXmwQEuSJNWy4/c+nsUjnEZONQAAEENJREFUFnN2l7O5cfaNdB7TmZlvzsw6ltaTBVqSJCkDrVu25tZ/u5UnBz/JmrSGw4oPY8SjI/j0y0+zjqZ1sEBLkiRlqM/ufXhx2Iv87MCfMfb5sXQo6sCUV6ZkHUtrYYGWJEnK2GabbMZNR9/E7LNms0WLLTj27mM5fdLpfLTyo6yj6VtYoCVJkuqIHm168MK5L/Drw37NvYvvpWBUAfeW3uvtwOsYC7QkSVId0qJZC67ufTUvnPsCbVu35ccP/Jj+9/bn75/9PetoyrFAS5Ik1UGddujEs2c/yx9++AeeeO0JCkYVMO6Fce5G1wEWaEmSpDqqaZOmXHLwJbw4/EW67NSFoQ8P5YgJR/DaP17LOlqjZoGWJEmq4/bcek+eHPwkY48by/PvPU+n0Z3447N/ZE35mqyjNUoWaEmSpHqgSTTh3APOZfGIxRzxgyO4ZNolHDz+YEo/KM06WqNjgZYkSapH2mzRhod+/BB3n3g3ry9/nf3H7s9vnvoNX635KutojYYFWpIkqZ6JCE7tdCplI8oY2GEgV8+4mgNuPYB5787LOlqjYIGWJEmqp7bbbDvuOvEuHj71YZZ/sZwD/3Igl067lJVfr8w6WoNmgZYkSarnjmt3HItHLGbo/kO56dmb6DS6E9PfmJ51rAbLAi1JktQAbNlyS8YcN4bpP5lOEPSZ0IfzHj6PT1Z9knW0BscCLUmS1ID0btubF4e/yKUHXcq4BeMoKCrg4ZcfzjpWg2KBliRJamC+1/x7/P6o3zPn7Dlss+k29LunH6c9cBoffv5h1tEaBAu0JElSA9Vt527MP3c+1/S+hollE9ln1D7cvehubwe+kSzQkiRJDdgmTTfhl4f9kgXnLWDPrfdk0KRB9LunH+98+k7W0eqtGi3QEXFMRLwcEa9GxBXfcc7JEVEWEYsj4u6azCNJktRYddi+A7POmsV/Hv2f/PWNv1IwqoCx88dSnsqzjlbv1FiBjoimwCigL1AAnBoRBVXO2Qu4EjgkpdQBuLim8kiSJDV2TZs05eIDL2bR8EV037k7wx4dRp/b+/DKsleyjlav1OQOdHfg1ZTS6ymlr4B7gOOrnDMUGJVSWg6QUvqgBvNIkiQJ+MFWP+CJM55g3L+No+T9EvYdsy9/mP0HVpevzjpavRA1dRF5RJwEHJNSOif3+AygR0rp/ErnPAgsBQ4BmgJXp5Smfst7nQucC7DDDjsccM8999RI5nVZsWIFrVq1ymRt1Q5n3Dg458bBOTcOznnjffTlR9z8ys3MWjaL9pu357J2l7FHqz2yjvX/spzx4Ycf/nxKqWvV482yCFNl/b2A3kAbYGZEdEopfVz5pJTSrcCtAF27dk29e/eu5ZgVnnrqKbJaW7XDGTcOzrlxcM6Ng3OuHgOOGsD9Zfdz/pTzGbZgGFf1vIqrel1Fi2Ytso5WJ2dck5dwvAvsUulxm9yxyt4BHkopfZ1SeoOK3ei9ajCTJEmSqogITu5wMksKl3Bqx1O5ZuY17H/r/sx5Z07W0eqkmizQ84C9ImL3iNgE+DHwUJVzHqRi95mI2BZoB7xeg5kkSZL0Hbb53jZMOGECU06bwmdffsbBfzmYn079KZ9/9XnW0eqUGivQKaXVwPnA48AS4L6U0uKIuCYi+uVOexxYFhFlwHTgspTSsprKJEmSpHXru1dfSkeUMrzrcG6eezOdRnfiydefzDpWnVGjvwc6pTQlpdQupbRHSuna3LFfpZQeyn2cUko/SykVpJQ6pZSy+elASZIkfcMWLbZg1LGjmHHmDJo1acaRdxzJOQ+dw8erPl73ixs470QoSZKk73ToboeycNhCLj/kcopLiikYVcDklyZnHStTFmhJkiSt1abNN+X6I69n7jlz2X6z7el/b39OmXgK/7vif7OOlgkLtCRJktbLAd8/gHlD53Ftn2t58KUHKSgq4I6Fd1BT9xWpqyzQkiRJWm/Nmzbnql5XUXJeCe23ac/gBwdz7N3H8tYnb2UdrdZYoCVJkpS3fbbbh6eHPM2fjvkTM9+cSYeiDhTNK6I8lWcdrcZZoCVJkrRBmjZpygU9LqB0RCkHtTmIwimF9C7uzdJlS7OOVqMs0JIkSdoobVu35fHTH+e2429j0QeL2Hf0vtzwzA2sLl+ddbQaYYGWJEnSRosIztzvTJYULuHYdsdyxZNX0GNcD0reL8k6WrWzQEuSJKna7NhqRx44+QEmDpzIu5++S9dbu/LzJ3/OqtWrso5WbSzQkiRJqnYDCgZQVljG6fueznXPXEeXsV2Y/fbsrGNVCwu0JEmSasTWm25Ncf9ipg6aysqvV9JzfE8ufOxCVny1IutoG8UCLUmSpBp19J5HUzq8lMJuhYx8biQdizoy7bVpWcfaYBZoSZIk1bjNW2zOLT+6haeHPE3LZi05+s6jGTJ5CMu/WJ51tLxZoCVJklRrDtn1EEqGlXBVz6u4Y+EdFBQVMGnJpKxj5cUCLUmSpFrVsllLrj3iWuafO5+dWu3EgPsGcNJ9J/H+ivezjrZeLNCSJEnKxH477sfcc+byuyN+xyNLH6FgVAHFJcWklLKOtlYWaEmSJGWmedPmXNHzChYOW0iH7TswZPIQjrnrGP728d+yjvadLNCSJEnKXPtt2zPjzBmM7DuS2W/PpmNRR26ZewvlqTzraP/CAi1JkqQ6oUk0obB7IaXDS+m1Wy8unHohF5VcxFufvJV1tG+wQEuSJKlO2a31bkw5bQoT+k9g5ZqVbNFii6wjfUOzrANIkiRJVUUEZ3Q+g53/sTOtW7bOOs43uAMtSZKkOqtJ1L26WvcSSZIkSXWYBVqSJEnKgwVakiRJyoMFWpIkScqDBVqSJEnKgwVakiRJyoMFWpIkScqDBVqSJEnKgwVakiRJyoMFWpIkScqDBVqSJEnKgwVakiRJyoMFWpIkScqDBVqSJEnKgwVakiRJyoMFWpIkScqDBVqSJEnKQ6SUss6Ql4j4EHgzo+W3BT7KaG3VDmfcODjnxsE5Nw7OueHLcsa7pZS2q3qw3hXoLEXE/JRS16xzqOY448bBOTcOzrlxcM4NX12csZdwSJIkSXmwQEuSJEl5sEDn59asA6jGOePGwTk3Ds65cXDODV+dm7HXQEuSJEl5cAdakiRJyoMFuoqIGB8RH0RE6Xc8HxHxp4h4NSJejIj9azujNt56zHlQbr6LImJ2RHSu7YzaOOuacaXzukXE6og4qbayqfqsz5wjondElETE4oiYUZv5VD3W4+/sLSPi4YhYmJvzkNrOqI0TEbtExPSIKMvN8KJvOafOdDAL9L8qBo5Zy/N9gb1yf84FRtdCJlW/YtY+5zeAw1JKnYDfUgevv9I6FbP2GRMRTYEbgGm1EUg1opi1zDkiWgNFQL+UUgdgYC3lUvUqZu1fz4VAWUqpM9AbuCkiNqmFXKo+q4FLUkoFwIFAYUQUVDmnznQwC3QVKaWZwD/WcsrxwIRUYQ7QOiJ2qp10qi7rmnNKaXZKaXnu4RygTa0EU7VZj69lgAuAB4APaj6RasJ6zPk0YFJK6a3c+c66HlqPOSdg84gIoFXu3NW1kU3VI6X0XkrphdzHnwFLgJ2rnFZnOpgFOn87A29XevwO/zpgNSxnA49lHULVKyJ2Bk7A7yI1dO2ArSLiqYh4PiIGZx1INWIksA/wd2ARcFFKqTzbSNpQEdEW6ALMrfJUnelgzbJYVKovIuJwKgp0z6yzqNrdDFyeUiqv2LRSA9UMOAA4AtgUeDYi5qSUlmYbS9XsaKAE6APsATwREU+nlD7NNpbyFRGtqPjO4MV1eX4W6Py9C+xS6XGb3DE1MBGxLzAO6JtSWpZ1HlW7rsA9ufK8LfCjiFidUnow21iqZu8Ay1JKnwOfR8RMoDNggW5YhgDXp4rfzftqRLwB7A08l20s5SMimlNRnu9KKU36llPqTAfzEo78PQQMzv0k6IHAJyml97IOpeoVEbsCk4Az3KlqmFJKu6eU2qaU2gITgRGW5wZpMtAzIppFxPeAHlRcW6mG5S0qvstAROwAtAdezzSR8pK7fv0vwJKU0h+/47Q608Hcga4iIv6bip/g3TYi3gF+DTQHSCmNAaYAPwJeBVZS8X+9qmfWY86/ArYBinI7lKtTSl2zSasNsR4zVgOwrjmnlJZExFTgRaAcGJdSWuuvNlTdsx5fz78FiiNiERBUXJ71UUZxtWEOAc4AFkVESe7YVcCuUPc6mHcilCRJkvLgJRySJElSHizQkiRJUh4s0JIkSVIeLNCSJElSHizQkiRJUh4s0JK0ESIiRcRNlR5fGhFXV9N7F0fESdXxXutYZ2BELImI6TW9VpV1z4yIkbW5piRVBwu0JG2cL4ETI2LbrINUFhH5/J7/s4GhKaXDayqPJDUkFmhJ2jirgVuBn1Z9ouoOckSsyP2zd0TMiIjJEfF6RFwfEYMi4rmIWBQRe1R6myMjYn5ELI2I43KvbxoRv4+IeRHxYkScV+l9n46Ih4Cyb8lzau79SyPihtyxXwE9gb9ExO+/5TWXVVrnN7ljbSPipYi4K7dzPTF3lz8i4oiIWJBbZ3xEtMgd7xYRsyNiYe7fc/PcEt+PiKkR8UpE3Jj3Z1+SMmCBlqSNNwoYFBFb5vGazsAwYB8q7r7VLqXUHRgHXFDpvLZAd+BYYExEtKRix/iTlFI3oBswNCJ2z52/P3BRSqld5cUi4vvADUAfYD+gW0T0TyldA8wHBqWULqvymqOAvXLr7wccEBGH5p5uDxSllPYBPgVG5LIVA6eklDpRcbfb4RGxCXBvLldn4Ejgi9z77AecAnQCTomIXfL4HEpSJizQkrSRUkqfAhOAC/N42byU0nsppS+B14BpueOLqCjN/3RfSqk8pfQK8DqwN3AUMDh3u9u5VNx2fq/c+c+llN74lvW6AU+llD5MKa0G7gIO/ZbzKjsq92cB8EJu7X+u83ZKaVbu4zup2MVuD7yRUlqaO357bo32wHsppXlQ8fnKZQB4MqX0SUppFRW75rutI5MkZS6fa+QkSd/tZipK5m2Vjq0mt1EREU2ATSo992Wlj8srPS7nm383pyrrJCCAC1JKj1d+IiJ6A59vWPxvFcDvUkpjq6zT9jtybYjKn4c1+N8lSfWAO9CSVA1SSv8A7qPi8op/+htwQO7jfkDzDXjrgRHRJHdd9A+Al4HHqbg0ojlARLSLiM3W8T7PAYdFxLYR0RQ4FZixjtc8DpwVEa1y6+wcEdvnnts1Ig7KfXwa8EwuW9uI2DN3/IzcGi8DO0VEt9z7bJ7nDzlKUp3iX2CSVH1uAs6v9PjPwOSIWAhMZcN2h9+iovxuAQxLKa2KiHFUXObxQkQE8CHQf21vklJ6LyKuAKZTsbP8aEpp8jpeMy0i9gGerViGFcDpVOwUvwwURsR4Ki69GJ3LNgS4P1eQ5wFjUkpfRcQpwC0RsSkV1z8fuQGfC0mqEyKlDf2umySpMcpdwvFISqljxlEkKRNewiFJkiTlwR1oSZIkKQ/uQEuSJEl5sEBLkiRJebBAS5IkSXmwQEuSJEl5sEBLkiRJebBAS5IkSXn4Px2CAf1N68D2AAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "0_rV92mKrAYB"
+ },
+ "source": [
+ "torch.save(model, '/content/drive/MyDrive/speech_technology/ResNet50_full_dataset')"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "p85wlDnAIuHl",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 67,
+ "referenced_widgets": [
+ "682fdfbe18074347b71b382b9f140141",
+ "d2e02c80579d40f2969cbd62869ddf51",
+ "be584960263a47f083fcc738ec1f7a75",
+ "8f1e5a8dd8f646f2bf5ac2500decbffa",
+ "c7f8746fcbbf4e1791637a815c90462d",
+ "08a24c518c2a4e25aedf243d5cb01045",
+ "a1358d61ef2246e3b7045effd03aef65",
+ "6140aaa2c0da49508004a28c7df36872",
+ "6494ca997dc4401394efa95594eea0bd",
+ "4ea8351599cc4937ba828d6fcb4cf3e8",
+ "c495d9fdc23340cf9540ad631f494879"
+ ]
+ },
+ "outputId": "5d91767e-43f3-475a-df93-f1cf5cd83355"
+ },
+ "source": [
+ "correct_test = 0\n",
+ "total_test = 0\n",
+ "\n",
+ "with torch.no_grad():\n",
+ "\n",
+ " for inputs, labels in tqdm(testloader):\n",
+ " \n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " \n",
+ " outputs = model(inputs)\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ "\n",
+ " \n",
+ " total_test += labels.size(0)\n",
+ " correct_test += (predicted == labels).sum().item()\n",
+ " # print(f'Correct = {correct}, total = {total}, percent = {correct / total}')\n",
+ "print(f'Accuracy of the ResNet50 network on the {X_test.shape[0]} test inputs = {round(100 * correct_test / total_test, 2)}%')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "682fdfbe18074347b71b382b9f140141",
+ "version_minor": 0,
+ "version_major": 2
+ },
+ "text/plain": [
+ " 0%| | 0/252 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Accuracy of the ResNet50 network on the 16182 test inputs = 75.08%\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "JhP40HErhxcp"
+ },
+ "source": [
+ "### Хочется еще эпоху"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "kHdZrJX6CJwp"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "import torchvision.models as models"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "_RymSFy2rQ0G"
+ },
+ "source": [
+ "model = torch.load('/content/drive/MyDrive/speech_technology/ResNet50_full_dataset')"
+ ],
+ "execution_count": 12,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "BHJtGH7uiHxq"
+ },
+ "source": [
+ "model = model.to(device)"
+ ],
+ "execution_count": 13,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "LDdBzezAh956"
+ },
+ "source": [
+ "import torch.optim as optim\n",
+ "\n",
+ "criterion_resnet = nn.CrossEntropyLoss()\n",
+ "optimizer_resnet = optim.Adam(model.parameters(), lr=0.00001)\n",
+ "scheduler_resnet = optim.lr_scheduler.StepLR(optimizer_resnet, step_size=1, gamma=0.9)"
+ ],
+ "execution_count": 16,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 387,
+ "referenced_widgets": [
+ "05f05b8c622d42dfb8033454f91a212b",
+ "8c920420edda4c16a213764c816ce227",
+ "27684ab7cf62412bbfa56d43db9a2305",
+ "fb5467979e214859a890d1e94def6b1e",
+ "d2a914a513b2461c8028d3881c5b8349",
+ "280ab8d6b4304ce69ff516fe43226f8a",
+ "4d0ce419de7045c39fb09e1f8ebb1edb",
+ "041b196f8e644c13afc826543766f981",
+ "b85dbb9eb0964ddc81689b6c40986453",
+ "2d4e2e7ade7b41faa6211859129816ed",
+ "6c0b8150348e4d4f89ef0071b5658721"
+ ]
+ },
+ "id": "JYFnO3fihxLH",
+ "outputId": "c8166490-10cf-4a9f-eff4-c4e43597545b"
+ },
+ "source": [
+ "from tqdm.notebook import tqdm\n",
+ "\n",
+ "losses_train_resnet = []\n",
+ "\n",
+ "for epoch in tqdm(range(3, 4)):\n",
+ " epoch_loss = 0.0\n",
+ " running_loss = 0.0\n",
+ " for i, (inputs, labels) in enumerate(trainloader, 0):\n",
+ " # get the inputs; data is a list of [inputs, labels]\n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " # print(inputs.shape)\n",
+ " # zero the parameter gradients\n",
+ " optimizer_resnet.zero_grad()\n",
+ "\n",
+ " # forward + backward + optimize\n",
+ " outputs = model(inputs)\n",
+ " # print(outputs)\n",
+ " loss = criterion_resnet(outputs, labels)\n",
+ " loss.backward()\n",
+ " optimizer_resnet.step()\n",
+ "\n",
+ " # print statistics\n",
+ "\n",
+ " running_loss += loss.item()\n",
+ " epoch_loss += loss.item()\n",
+ " if i % 50 == 49: # print every 50 mini-batches\n",
+ " print('[%d, %5d] loss: %.3f' %\n",
+ " (epoch, i + 1, running_loss / 10))\n",
+ " running_loss = 0.0\n",
+ " if i % 200 == 199: # model checkpoints\n",
+ " torch.save(model, f'/content/drive/MyDrive/speech_technology/ResNet50_full_dataset_epoch_{epoch}_stage_{i}')\n",
+ " print(f'Saved model ResNet50_full_dataset_epoch_{epoch}_stage_{i}')\n",
+ " losses_train_resnet.append(epoch_loss)\n",
+ " scheduler_resnet.step()\n",
+ "print('Finished Training')"
+ ],
+ "execution_count": 17,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "05f05b8c622d42dfb8033454f91a212b",
+ "version_minor": 0,
+ "version_major": 2
+ },
+ "text/plain": [
+ " 0%| | 0/1 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[3, 50] loss: 1.256\n",
+ "[3, 100] loss: 1.201\n",
+ "[3, 150] loss: 1.092\n",
+ "[3, 200] loss: 1.070\n",
+ "Saved model ResNet50_full_dataset_epoch_3_stage_199\n",
+ "[3, 250] loss: 1.033\n",
+ "[3, 300] loss: 1.041\n",
+ "[3, 350] loss: 1.066\n",
+ "[3, 400] loss: 1.138\n",
+ "Saved model ResNet50_full_dataset_epoch_3_stage_399\n",
+ "[3, 450] loss: 1.101\n",
+ "[3, 500] loss: 1.060\n",
+ "[3, 550] loss: 1.052\n",
+ "[3, 600] loss: 1.046\n",
+ "Saved model ResNet50_full_dataset_epoch_3_stage_599\n",
+ "[3, 650] loss: 1.000\n",
+ "[3, 700] loss: 0.983\n",
+ "[3, 750] loss: 0.979\n",
+ "Finished Training\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "9GwUQ13mkVIx"
+ },
+ "source": [
+ "torch.save(model, '/content/drive/MyDrive/speech_technology/ResNet50_full_dataset_latest')"
+ ],
+ "execution_count": 18,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 67,
+ "referenced_widgets": [
+ "a2586a70a06644bebc4be710940a6694",
+ "8d7143d6e13b47728179850ffa33d43b",
+ "cd6aad4f7bcf4e068f8413da02d30848",
+ "e2c29c0a000e4ff3bf94b6dfc581bee9",
+ "78b13b3d9f54464fbf437bab94dd6086",
+ "b69fc78345d947cd9334ff8828da196d",
+ "91a2d3a78f7949d5911eafd52f266104",
+ "ea1118456db049fb80ea44209affb18d",
+ "7e4e450f949343fe8eb86bc1b5db1418",
+ "3ed54cbf68ee4ad99e348d00bbd7e94f",
+ "25bf6a89b93c422eb62c7430d95ae2af"
+ ]
+ },
+ "id": "_iukfg1AhxIK",
+ "outputId": "f57802f6-b338-471a-8524-11c72738f1d0"
+ },
+ "source": [
+ "correct_test = 0\n",
+ "total_test = 0\n",
+ "\n",
+ "with torch.no_grad():\n",
+ "\n",
+ " for inputs, labels in tqdm(testloader):\n",
+ " \n",
+ " inputs = inputs.to(device)\n",
+ " labels = labels.to(device)\n",
+ " \n",
+ " outputs = model(inputs)\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ "\n",
+ " \n",
+ " total_test += labels.size(0)\n",
+ " correct_test += (predicted == labels).sum().item()\n",
+ " # print(f'Correct = {correct}, total = {total}, percent = {correct / total}')\n",
+ "print(f'Accuracy of the ResNet50 network on the {X_test.shape[0]} test inputs = {round(100 * correct_test / total_test, 2)}%')"
+ ],
+ "execution_count": 19,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "a2586a70a06644bebc4be710940a6694",
+ "version_minor": 0,
+ "version_major": 2
+ },
+ "text/plain": [
+ " 0%| | 0/252 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Accuracy of the ResNet50 network on the 16182 test inputs = 82.51%\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "cd0z0m18KMhg"
+ },
+ "source": [
+ "Accuracy of the ResNet50 network on the 16182 test inputs = 82.51%"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m00qRKatwE9H"
+ },
+ "source": [
+ "## Попробуем считать видосик с ютуба"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "G9S4I7DiyUMV",
+ "outputId": "8ff678e7-5031-41d4-f162-4c6c675e3120"
+ },
+ "source": [
+ "!sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl"
+ ],
+ "execution_count": 40,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ " % Total % Received % Xferd Average Speed Time Time Time Current\n",
+ " Dload Upload Total Spent Left Speed\n",
+ "100 3 100 3 0 0 1 0 0:00:03 0:00:02 0:00:01 1\n",
+ "100 3 100 3 0 0 1 0 0:00:03 0:00:02 0:00:01 1\n",
+ "100 614 100 614 0 0 193 0 0:00:03 0:00:03 --:--:-- 193\n",
+ "100 1797k 100 1797k 0 0 506k 0 0:00:03 0:00:03 --:--:-- 19.7M\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "4o1cSA251Vjq"
+ },
+ "source": [
+ "!sudo chmod a+rx /usr/local/bin/youtube-dl"
+ ],
+ "execution_count": 41,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Z7u36GzyxE_2",
+ "outputId": "69815cdb-48ae-48b3-89e1-1a03a06cbbcc"
+ },
+ "source": [
+ "!youtube-dl --list-formats https://www.youtube.com/watch?v=EK32jo7i5LQ"
+ ],
+ "execution_count": 43,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[youtube] EK32jo7i5LQ: Downloading webpage\n",
+ "[info] Available formats for EK32jo7i5LQ:\n",
+ "format code extension resolution note\n",
+ "249 webm audio only tiny 55k , webm_dash container, opus @ 55k (48000Hz), 8.86MiB\n",
+ "250 webm audio only tiny 73k , webm_dash container, opus @ 73k (48000Hz), 11.81MiB\n",
+ "140 m4a audio only tiny 129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 20.83MiB\n",
+ "251 webm audio only tiny 141k , webm_dash container, opus @141k (48000Hz), 22.81MiB\n",
+ "160 mp4 256x144 144p 25k , mp4_dash container, avc1.4d400c@ 25k, 30fps, video only, 4.07MiB\n",
+ "394 mp4 256x144 144p 44k , mp4_dash container, av01.0.00M.08@ 44k, 30fps, video only, 7.13MiB\n",
+ "278 webm 256x144 144p 46k , webm_dash container, vp9@ 46k, 30fps, video only, 7.48MiB\n",
+ "133 mp4 426x240 240p 55k , mp4_dash container, avc1.4d4015@ 55k, 30fps, video only, 8.89MiB\n",
+ "242 webm 426x240 240p 69k , webm_dash container, vp9@ 69k, 30fps, video only, 11.26MiB\n",
+ "395 mp4 426x240 240p 74k , mp4_dash container, av01.0.00M.08@ 74k, 30fps, video only, 12.03MiB\n",
+ "134 mp4 640x360 360p 103k , mp4_dash container, avc1.4d401e@ 103k, 30fps, video only, 16.69MiB\n",
+ "243 webm 640x360 360p 142k , webm_dash container, vp9@ 142k, 30fps, video only, 22.86MiB\n",
+ "396 mp4 640x360 360p 142k , mp4_dash container, av01.0.01M.08@ 142k, 30fps, video only, 22.89MiB\n",
+ "135 mp4 854x480 480p 164k , mp4_dash container, avc1.4d401f@ 164k, 30fps, video only, 26.43MiB\n",
+ "244 webm 854x480 480p 237k , webm_dash container, vp9@ 237k, 30fps, video only, 38.25MiB\n",
+ "397 mp4 854x480 480p 240k , mp4_dash container, av01.0.04M.08@ 240k, 30fps, video only, 38.76MiB\n",
+ "136 mp4 1280x720 720p 420k , mp4_dash container, avc1.4d401f@ 420k, 30fps, video only, 67.65MiB\n",
+ "247 webm 1280x720 720p 453k , webm_dash container, vp9@ 453k, 30fps, video only, 72.94MiB\n",
+ "398 mp4 1280x720 720p60 605k , mp4_dash container, av01.0.08M.08@ 605k, 60fps, video only, 97.47MiB\n",
+ "302 webm 1280x720 720p60 648k , webm_dash container, vp9@ 648k, 60fps, video only, 104.25MiB\n",
+ "298 mp4 1280x720 720p60 657k , mp4_dash container, avc1.4d4020@ 657k, 60fps, video only, 105.83MiB\n",
+ "399 mp4 1920x1080 1080p60 984k , mp4_dash container, av01.0.09M.08@ 984k, 60fps, video only, 158.41MiB\n",
+ "299 mp4 1920x1080 1080p60 1116k , mp4_dash container, avc1.64002a@1116k, 60fps, video only, 179.69MiB\n",
+ "303 webm 1920x1080 1080p60 1240k , webm_dash container, vp9@1240k, 60fps, video only, 199.59MiB\n",
+ "400 mp4 2560x1440 1440p60 2462k , mp4_dash container, av01.0.12M.08@2462k, 60fps, video only, 396.13MiB\n",
+ "308 webm 2560x1440 1440p60 3286k , webm_dash container, vp9@3286k, 60fps, video only, 528.73MiB\n",
+ "18 mp4 640x360 360p 332k , avc1.42001E, 30fps, mp4a.40.2 (44100Hz), 53.50MiB\n",
+ "22 mp4 1280x720 720p 549k , avc1.64001F, 30fps, mp4a.40.2 (44100Hz) (best)\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ALOhEuD-wDpr",
+ "outputId": "9deaeedf-b5d2-41b5-87d4-31540af6d1fc"
+ },
+ "source": [
+ "!youtube-dl -o '/content/drive/MyDrive/speech_technology/youtube_video_1.wav' -x --audio-format wav https://www.youtube.com/watch?v=EK32jo7i5LQ"
+ ],
+ "execution_count": 44,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[youtube] EK32jo7i5LQ: Downloading webpage\n",
+ "[download] Destination: /content/drive/MyDrive/speech_technology/youtube_video_1.wav\n",
+ "\u001b[K[download] 100% of 22.81MiB in 06:19\n",
+ "[ffmpeg] Post-process file /content/drive/MyDrive/speech_technology/youtube_video_1.wav exists, skipping\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "WliIEnotWxWh"
+ },
+ "source": [
+ "### Создадим словарик для соответствия индексов и таргетов (цифра <-> слово)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "kN1MJJLqwD77"
+ },
+ "source": [
+ "target_words_ordered = 'bed_bird_cat_dog_eight_five_four'.split('_') + 'go_happy_house_marvin_nine_no_off_on'.split('_') + \\\n",
+ " 'left_right_up_down_stop'.split('_') + 'one_seven_sheila_six_three_tree_two_wow_yes_zero'.split('_')\n",
+ "\n",
+ "target_to_word = {\n",
+ " ind: word for ind, word in enumerate(target_words_ordered)\n",
+ "}"
+ ],
+ "execution_count": 30,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "R52Ngs1wKZVr",
+ "outputId": "8992a396-7952-4189-e0cb-75f4c803ef19"
+ },
+ "source": [
+ "!sox --info /content/drive/MyDrive/speech_technology/prime_numbers_mono.wav"
+ ],
+ "execution_count": 109,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "\n",
+ "Input File : '/content/drive/MyDrive/speech_technology/prime_numbers_mono.wav'\n",
+ "Channels : 1\n",
+ "Sample Rate : 16000\n",
+ "Precision : 16-bit\n",
+ "Duration : 00:22:29.52 = 21592247 samples ~ 101214 CDDA sectors\n",
+ "File Size : 43.2M\n",
+ "Bit Rate : 256k\n",
+ "Sample Encoding: 16-bit Signed Integer PCM\n",
+ "\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "uNEPDrexwEEV",
+ "outputId": "02cd9966-c606-4a08-d353-9ec7868834c9"
+ },
+ "source": [
+ "%%time\n",
+ "amplitudes, sr = librosa.core.load('/content/drive/MyDrive/speech_technology/prime_numbers_mono.wav')"
+ ],
+ "execution_count": 122,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "CPU times: user 38.5 s, sys: 230 ms, total: 38.7 s\n",
+ "Wall time: 39.5 s\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ZZ6H7Q0QwEHQ"
+ },
+ "source": [
+ "spectrogram = librosa.feature.melspectrogram(amplitudes, sr=sr)"
+ ],
+ "execution_count": 123,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "OuZU5h3tAqrz",
+ "outputId": "f21ba33e-7678-447b-cc73-774cda43d551"
+ },
+ "source": [
+ "spectrogram.shape"
+ ],
+ "execution_count": 125,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(128, 58119)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 125
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5MLzpW8fV6ZS"
+ },
+ "source": [
+ "### Нарезал спектрограмму окошком длины 150"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 49,
+ "referenced_widgets": [
+ "1d1d8f9d05874562b0da0d9f42022f5e",
+ "2ef90ce5007f45868c06df86abf7bef9",
+ "c11a2d13af084317a714c254775b2a07",
+ "e60ddc48f732420c9f5130df2bad349e",
+ "7988d180e38a4c1f9ed3e700339a4029",
+ "01e13fefb4344b958654d40324a160db",
+ "a01606b4960840cdae66fdaa7d90f4b4",
+ "f458289e94ea4315aff2c9e1f6a33d1d",
+ "131fbe8d79544d508756fdda0ab55520",
+ "94bd7c2cdd6745049bbc6656422df364",
+ "c91aa585907545898c626e068d5380fb"
+ ]
+ },
+ "id": "QjLSERokAS9T",
+ "outputId": "ec6907bd-ad76-4c41-d938-7a298ca02547"
+ },
+ "source": [
+ "samples = []\n",
+ "for i in tqdm(range(0, spectrogram.shape[1]-150, 10)):\n",
+ " samples.append(spectrogram[:, i:i + 150])"
+ ],
+ "execution_count": 129,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "1d1d8f9d05874562b0da0d9f42022f5e",
+ "version_minor": 0,
+ "version_major": 2
+ },
+ "text/plain": [
+ " 0%| | 0/5797 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {}
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "A6_o6czjBXMo"
+ },
+ "source": [
+ "samples = np.float32(samples)"
+ ],
+ "execution_count": 130,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "gm9xhqfjBgOI",
+ "outputId": "43992dd0-8a69-4a5e-deff-6e65a3dfa02f"
+ },
+ "source": [
+ "samples.shape"
+ ],
+ "execution_count": 131,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(5797, 128, 150)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 131
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "8BN0nZcxwEOF"
+ },
+ "source": [
+ "samples = samples.transpose([0, 2, 1])"
+ ],
+ "execution_count": 132,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "fyF04SS1ByMy",
+ "outputId": "c7cc17af-9046-45d9-d926-ff31067916e1"
+ },
+ "source": [
+ "samples = samples[:, None, :, :]\n",
+ "samples.shape"
+ ],
+ "execution_count": 133,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(5797, 1, 150, 128)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 133
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "e6pHM8qmCLpR"
+ },
+ "source": [
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "import torchvision.models as models"
+ ],
+ "execution_count": 134,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "dCcUe5boB6Tj"
+ },
+ "source": [
+ "model = torch.load('/content/drive/MyDrive/speech_technology/ResNet50_full_dataset_latest').to(device)"
+ ],
+ "execution_count": 135,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "-KVhlmzxCiYJ"
+ },
+ "source": [
+ "batch_size = 64\n",
+ "\n",
+ "tensor_video = torch.Tensor(samples)\n",
+ "\n",
+ "video_dataset = TensorDataset(tensor_video)\n",
+ "\n",
+ "videoloader = DataLoader(video_dataset, batch_size=batch_size,\n",
+ " shuffle=False, num_workers=2, drop_last=True)"
+ ],
+ "execution_count": 136,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "ebe5ff03043b40049e918c1a25e140d1",
+ "3a201a95aad64a898b45fcd8ce8ebe1f",
+ "f5f930c8ffd14693af6914e3314da71f",
+ "24b846ae797244bc9becfd44a216cc58",
+ "d66e2540f0594470beadf03c9cb11b5b",
+ "d808ed95076d49faaf508529334303d7",
+ "3ccc98a3d0fc43e6978116961f24bdad",
+ "5216c9a211e545af9ad63deebfc21fbd",
+ "59e0a76fe8914cffbd0dc1a423c9092b",
+ "37e1c8d6f36b49a5af6ff01fab880fb8",
+ "cb3627dc92854c1ca0f0fea7d64dc5f2"
+ ]
+ },
+ "id": "b2IURS0DCN9Z",
+ "outputId": "8dbaf6e6-3949-451b-9c02-d70fb1de980d"
+ },
+ "source": [
+ "global_time = 0\n",
+ "with torch.no_grad():\n",
+ " model.eval()\n",
+ " for inputs in tqdm(videoloader):\n",
+ " \n",
+ " inputs = inputs[0].to(device)\n",
+ " \n",
+ " outputs = F.softmax(model(inputs)[:, :30])\n",
+ " _, predicted = torch.max(outputs.data, 1)\n",
+ " \n",
+ " for i, pred in enumerate(predicted):\n",
+ " if outputs[i, pred].item() > 0.9:\n",
+ " print(f'Video TimeCode: {global_time} milliseconds \\t Predicted word is \"{target_to_word[pred.item()]}\"')\n",
+ " global_time += 5"
+ ],
+ "execution_count": 137,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "ebe5ff03043b40049e918c1a25e140d1",
+ "version_minor": 0,
+ "version_major": 2
+ },
+ "text/plain": [
+ " 0%| | 0/90 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n",
+ " \n"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Video TimeCode: 480 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 485 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 490 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 500 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 585 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 605 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 615 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 705 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 1070 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1075 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1080 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1085 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1090 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1100 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1105 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1110 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1115 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1120 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1145 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1150 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1570 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1590 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1650 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1655 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1725 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 1765 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1770 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 1775 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 2395 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 2400 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 2410 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 2450 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 2585 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 2655 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 3105 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3235 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3245 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3250 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3455 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3465 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3485 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 3860 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4530 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4535 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4550 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4555 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4795 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4800 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4810 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4820 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4825 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4830 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4840 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 4865 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5310 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5320 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5325 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5330 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5335 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5340 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5345 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5350 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5355 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5360 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5365 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5370 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5375 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5385 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5405 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5750 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 5765 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6075 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6080 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6085 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6095 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6100 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6245 milliseconds \t Predicted word is \"four\"\n",
+ "Video TimeCode: 6505 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 6675 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 6725 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6730 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 6765 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 6800 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 7185 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 7265 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 7290 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 7310 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 7655 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 7670 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 7675 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 7680 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 8280 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 8480 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 8770 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 8795 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 8870 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 8995 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 9000 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 9170 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9320 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 9520 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 9595 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9705 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9710 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9715 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9720 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9725 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9740 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 9860 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10115 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10705 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10715 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10745 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10755 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10760 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 10815 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 10825 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 10845 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 11200 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 11210 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 11220 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 11230 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 11250 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 11855 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12135 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12155 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12205 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12230 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12240 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12250 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12315 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 12340 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12355 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12360 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12365 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12370 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12375 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12380 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12385 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12390 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12395 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12425 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 12885 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13050 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 13125 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13130 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13135 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13150 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13165 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13170 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13420 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 13590 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13595 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13620 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13630 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13635 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 13975 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 14025 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 14295 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 14310 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 14370 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 14480 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 14835 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 14980 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 15000 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 15270 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 15515 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 15530 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 15570 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 15725 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 15730 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16340 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16345 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16350 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16365 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16410 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16415 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16420 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16425 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16430 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16440 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16450 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16600 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 16610 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 16625 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16630 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 16680 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 17100 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 17145 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17150 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17155 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17160 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17165 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17170 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17175 milliseconds \t Predicted word is \"marvin\"\n",
+ "Video TimeCode: 17655 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 17700 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18395 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 18575 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 18785 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18790 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18800 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18805 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18950 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18965 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 18970 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19130 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19145 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19190 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19240 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19250 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 19410 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19580 milliseconds \t Predicted word is \"one\"\n",
+ "Video TimeCode: 19755 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 19760 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 20165 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 20335 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 20350 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 20390 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 20535 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 21195 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 21205 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 21230 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 21250 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 21455 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 22035 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 22455 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 22460 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 22485 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 22560 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 22850 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 23070 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 23075 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 23080 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 23415 milliseconds \t Predicted word is \"one\"\n",
+ "Video TimeCode: 23425 milliseconds \t Predicted word is \"one\"\n",
+ "Video TimeCode: 23435 milliseconds \t Predicted word is \"one\"\n",
+ "Video TimeCode: 23445 milliseconds \t Predicted word is \"one\"\n",
+ "Video TimeCode: 24125 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 24680 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 24890 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25080 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25310 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25320 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25920 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25925 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25935 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25940 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25955 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 25960 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26205 milliseconds \t Predicted word is \"happy\"\n",
+ "Video TimeCode: 26475 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26515 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26530 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26535 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26540 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26545 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26560 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 26795 milliseconds \t Predicted word is \"zero\"\n",
+ "Video TimeCode: 26860 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 27425 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 27665 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 28320 milliseconds \t Predicted word is \"three\"\n",
+ "Video TimeCode: 28380 milliseconds \t Predicted word is \"zero\"\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "DPBhzqV4Sj0k"
+ },
+ "source": [
+ "### Еще надо было, наверное, добавить в обучающую выборку пустой звук/шум, чтобы, если он не распознает слово, то выдает шум (пустой класс)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "NtCakOJpQe-u"
+ },
+ "source": [
+ "### Чё-то я запутался, кажется, не так подготовил спектрограмму для нарезания, или нарезаю не так, или идея по подготовке данных плохая, или еще где-то накосячил, всякое может быть, но у меня больше нет вариантов (точнее нет времени):("
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "RM7oE68sSjLd"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": null,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/week06/hw/create_directory.txt b/week06/hw/create_directory.txt
new file mode 100644
index 0000000..147dcb5
--- /dev/null
+++ b/week06/hw/create_directory.txt
@@ -0,0 +1 @@
+Create directory /speech-tech-mipt/week06/hw/