{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Lab4.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true, "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU", "widgets": { "application/vnd.jupyter.widget-state+json": { "52b580e658764226bca8ec6150f5dfa2": { "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_d4178aeef56f4d9093d95f9dad6f4659", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_c3d864076bb647dea8c7a87a088fdd86", "IPY_MODEL_cafdce4646284737be1052a7b5d34b19", "IPY_MODEL_da5923b8f2b942a3a2f11408ad95339c" ] } }, "d4178aeef56f4d9093d95f9dad6f4659": { "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 } }, "c3d864076bb647dea8c7a87a088fdd86": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_13d8f5e34d174c2b91f2e12923c6273e", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 17%", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_d4adee0ff01440649eb226d465db6291" } }, "cafdce4646284737be1052a7b5d34b19": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_181e562939b646178a41d5cbea4b421e", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "danger", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 120, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_ae88d9aef9de4944ad902e1f592ed72f" } }, "da5923b8f2b942a3a2f11408ad95339c": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_55052d9744e94ae99ada21afb7b2bfd6", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 120/720 [04:21<01:13, 8.16it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_de3a27f3bab54c53b1bee011f9e572d8" } }, "13d8f5e34d174c2b91f2e12923c6273e": { "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" } }, "d4adee0ff01440649eb226d465db6291": { "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 } }, "181e562939b646178a41d5cbea4b421e": { "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" } }, "ae88d9aef9de4944ad902e1f592ed72f": { "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 } }, "55052d9744e94ae99ada21afb7b2bfd6": { "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" } }, "de3a27f3bab54c53b1bee011f9e572d8": { "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 } }, "2d880be240d84dd48e0a7eaef1104c14": { "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_72914891589a48d992915f28a8f33915", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_121214d561bb4cc482fa0b53050af2d1", "IPY_MODEL_acb1dc0badb04b4db62972d334a28c58", "IPY_MODEL_a06baafca0fc4416807c49049728756f" ] } }, "72914891589a48d992915f28a8f33915": { "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 } }, "121214d561bb4cc482fa0b53050af2d1": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_e3bb0de942f44d88808ab207a968d24c", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 33%", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_ca115b9aadea481398cca2a2f64479be" } }, "acb1dc0badb04b4db62972d334a28c58": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_b643da0174424466a393872c3eb0ebd4", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "danger", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 240, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_480eb2b175e94de79df27041596f7a89" } }, "a06baafca0fc4416807c49049728756f": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_e1e207f85ebb47c9bed26d71509f21b8", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 240/720 [04:05<01:02, 7.64it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_39bac9d2b79040659535d2e03372bde5" } }, "e3bb0de942f44d88808ab207a968d24c": { "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" } }, "ca115b9aadea481398cca2a2f64479be": { "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 } }, "b643da0174424466a393872c3eb0ebd4": { "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" } }, "480eb2b175e94de79df27041596f7a89": { "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 } }, "e1e207f85ebb47c9bed26d71509f21b8": { "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" } }, "39bac9d2b79040659535d2e03372bde5": { "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 } }, "5436e909c7704c3987fc31d4996a364c": { "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_fddb57b98a2a4befa9973b59a851ceae", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_219ca528efe34441a6cc772c17d99640", "IPY_MODEL_935ff14bb0c44d3ebd7cd33644f6d3a7", "IPY_MODEL_c0ff465f8b7540c8b094d847a232bb6a" ] } }, "fddb57b98a2a4befa9973b59a851ceae": { "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 } }, "219ca528efe34441a6cc772c17d99640": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_dcf74eac636045838d4f2da32276df8b", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 50%", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_38cdf52fcd514d27841e42975a0dd9f6" } }, "935ff14bb0c44d3ebd7cd33644f6d3a7": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_7a623791cdd64b8698026dc7944bb78f", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "danger", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 360, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_8dc54c237e3b449f9d342d027a36c356" } }, "c0ff465f8b7540c8b094d847a232bb6a": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_5625ff26ad14498d92a8f3cabf1079be", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 360/720 [03:49<00:47, 7.64it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_2998111c6ee8484ba994c6df5775621a" } }, "dcf74eac636045838d4f2da32276df8b": { "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" } }, "38cdf52fcd514d27841e42975a0dd9f6": { "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 } }, "7a623791cdd64b8698026dc7944bb78f": { "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" } }, "8dc54c237e3b449f9d342d027a36c356": { "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 } }, "5625ff26ad14498d92a8f3cabf1079be": { "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" } }, "2998111c6ee8484ba994c6df5775621a": { "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 } }, "8d7c071fa80b41699d5119cd88500139": { "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_49fd1c193d71437386b147387f608362", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_98f6c27dfc4243a4942e759654f47d45", "IPY_MODEL_c452e937822e4995bb551325bf0c854f", "IPY_MODEL_365f03995a5a4261b12640af61c1dd2e" ] } }, "49fd1c193d71437386b147387f608362": { "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 } }, "98f6c27dfc4243a4942e759654f47d45": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_03e2d5368fab40a4b955613125f6486a", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 67%", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_14887211d54442bebca080f5367a7830" } }, "c452e937822e4995bb551325bf0c854f": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_a06c616ce20c4ee98de36b03573204c6", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "danger", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 480, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_8f9ad2ad53f7462e97b9aa564c732430" } }, "365f03995a5a4261b12640af61c1dd2e": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_88071d3d9efe4ca289e44106e506803c", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 480/720 [03:33<00:33, 7.07it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_35a33dd6388849859c2a7c07d564eb78" } }, "03e2d5368fab40a4b955613125f6486a": { "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" } }, "14887211d54442bebca080f5367a7830": { "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 } }, "a06c616ce20c4ee98de36b03573204c6": { "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" } }, "8f9ad2ad53f7462e97b9aa564c732430": { "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 } }, "88071d3d9efe4ca289e44106e506803c": { "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" } }, "35a33dd6388849859c2a7c07d564eb78": { "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 } }, "35c1de0d70dc41ca91004c35e3ac8f01": { "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_8cf0150a8f054d6987d1b8fc7b4dbc6f", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_ddaff05f0f9943a6a672cfa19163f4c5", "IPY_MODEL_71a2510006ee43f2be0bcad1d6e94b92", "IPY_MODEL_449eed7546c24757b60b62eca25d2abc" ] } }, "8cf0150a8f054d6987d1b8fc7b4dbc6f": { "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 } }, "ddaff05f0f9943a6a672cfa19163f4c5": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_71ce471c5c344d1e8cd943aa3b0a6349", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 83%", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_23918549ba3b4b3190e64f64e8d713ce" } }, "71a2510006ee43f2be0bcad1d6e94b92": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_f24b7471de2244b09adf2cf91d36ad5e", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "danger", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 600, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_498036fa8d9a45ae9fe0526c3fcfbb87" } }, "449eed7546c24757b60b62eca25d2abc": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_55c45fa03e234b6bb0639359fe5457f8", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 600/720 [03:16<00:14, 8.51it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_f178589a800543e0bdb59ad179284972" } }, "71ce471c5c344d1e8cd943aa3b0a6349": { "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" } }, "23918549ba3b4b3190e64f64e8d713ce": { "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 } }, "f24b7471de2244b09adf2cf91d36ad5e": { "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" } }, "498036fa8d9a45ae9fe0526c3fcfbb87": { "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 } }, "55c45fa03e234b6bb0639359fe5457f8": { "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" } }, "f178589a800543e0bdb59ad179284972": { "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 } }, "9470581189364d40a0af9bbe80dc6325": { "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_59350d6a3c9c454bbd3e0ccefecdb016", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_c00a039340cd4db1b5e384ea6345fadc", "IPY_MODEL_4bab78472d37459090dd434ed6783fef", "IPY_MODEL_9a92d06114b046d1a91a0afd753fdcb2" ] } }, "59350d6a3c9c454bbd3e0ccefecdb016": { "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 } }, "c00a039340cd4db1b5e384ea6345fadc": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_46b99851631c4c6787c97b0d590b80b0", "_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_2eea7e772de54161a362d26f371a5d56" } }, "4bab78472d37459090dd434ed6783fef": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_772927770cea443ebd2d11b056e52d9a", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "success", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 720, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_ecfad20cecb04416baa2921794e7960a" } }, "9a92d06114b046d1a91a0afd753fdcb2": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_fadeff7d65894b4283fea4972b221831", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 720/720 [03:01<00:00, 8.54it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_1ff701777eff40b0b5ed3e3aae6c3d5e" } }, "46b99851631c4c6787c97b0d590b80b0": { "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" } }, "2eea7e772de54161a362d26f371a5d56": { "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 } }, "772927770cea443ebd2d11b056e52d9a": { "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" } }, "ecfad20cecb04416baa2921794e7960a": { "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 } }, "fadeff7d65894b4283fea4972b221831": { "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" } }, "1ff701777eff40b0b5ed3e3aae6c3d5e": { "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 } }, "63307ca4f344461dad241d73a1bd564a": { "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_a70a54a222dd4c74a53a5143affd6697", "_model_module": "@jupyter-widgets/controls", "children": [ "IPY_MODEL_a47f7a8a55d443f69f1071a63f790598", "IPY_MODEL_39c38679384148cb84a88780e1d13b38", "IPY_MODEL_38031802dd5c441bbc4fb1ad4655bc25" ] } }, "a70a54a222dd4c74a53a5143affd6697": { "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 } }, "a47f7a8a55d443f69f1071a63f790598": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_46a9cef0c4a14edd8719dd41ce7dbaba", "_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_e4b78d907e4c4ae1af9d751666b8eb11" } }, "39c38679384148cb84a88780e1d13b38": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_view_name": "ProgressView", "style": "IPY_MODEL_8b4ec4fc917e4c14bf79819c694f3eae", "_dom_classes": [], "description": "", "_model_name": "FloatProgressModel", "bar_style": "", "max": 720, "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": 720, "_view_count": null, "_view_module_version": "1.5.0", "orientation": "horizontal", "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_12b1ef8207cf47cb87b222b187832df8" } }, "38031802dd5c441bbc4fb1ad4655bc25": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_view_name": "HTMLView", "style": "IPY_MODEL_bb9d81a91324440893a5767dc03511c4", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "value": " 720/720 [00:14<00:00, 48.60it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", "layout": "IPY_MODEL_afb958bec9b147ee85eb6e66ce8ac1d2" } }, "46a9cef0c4a14edd8719dd41ce7dbaba": { "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" } }, "e4b78d907e4c4ae1af9d751666b8eb11": { "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 } }, "8b4ec4fc917e4c14bf79819c694f3eae": { "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" } }, "12b1ef8207cf47cb87b222b187832df8": { "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 } }, "bb9d81a91324440893a5767dc03511c4": { "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" } }, "afb958bec9b147ee85eb6e66ce8ac1d2": { "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": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "source": [ "#Лабораторная работа №4" ], "metadata": { "id": "W1c1N1D6H0MV" } }, { "cell_type": "markdown", "source": [ "# Задание" ], "metadata": { "id": "HZxvk8dYH0MW" } }, { "cell_type": "markdown", "source": [ "\n", "\n", "По заданию выбрать свои классы, загрузить предобученную модель по варианту, заморозить веса модели и провести дообучение на своих классах набора данных. Параметры аугментации использовать из лабораторной работы номер 3.\n", "\n", "Сравнить результаты и качество обученных моделей для первых четырех лабораторных работ." ], "metadata": { "id": "2cGXG1SyH0MW" } }, { "cell_type": "markdown", "source": [ "Отчет должен содержать: титульный лист, задание с вариантом, скриншоты и краткие пояснения по каждому этапу лабораторной работы, результаты дообучения модели после заморозки весов.\n", "\n", "Варианты классов использовать из 1 лабораторной работы." ], "metadata": { "id": "8oyW_66-H0MX" } }, { "cell_type": "markdown", "source": [ "### Варианты предобученных моделей\n", "\n", "| Вариант | Модель \n", "|----------|----------|\n", "| Четный | resnet20\n", "| Нечетный | mobilenetv2_x0_5" ], "metadata": { "id": "cMQ3j36rQ_4W" } }, { "cell_type": "markdown", "source": [ "#Контрольные вопросы\n", "1. Перенос обучения\n", "2. Архитектура предобученной модели\n", "3. Fine tunning\n", "4. Заморозка весов" ], "metadata": { "id": "OfptVMQOH0MX" } }, { "cell_type": "markdown", "source": [ "#Инициализация предобученной модели" ], "metadata": { "id": "QCK0mXnxjHVP" } }, { "cell_type": "code", "metadata": { "id": "Gmv_Qcw6KiTu" }, "source": [ "#!pip install torchsummary\n", "import time\n", "import numpy as np\n", "import torch\n", "import torch.optim as optim\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "from torch.utils.data import TensorDataset, Dataset, DataLoader\n", "from torchsummary import summary\n", "from torchvision import transforms as T\n", "import pickle\n", "from sklearn.metrics import classification_report\n", "from PIL import Image\n", "from tqdm.auto import tqdm\n", "from IPython.display import clear_output\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "!nvidia-smi" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "zv4YVFroEn9K", "outputId": "431bd0f0-5f93-4a4d-d59d-2c77a2d54ef0" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Tue Feb 15 10:12:54 2022 \n", "+-----------------------------------------------------------------------------+\n", "| NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 |\n", "|-------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|===============================+======================+======================|\n", "| 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 |\n", "| N/A 72C P8 32W / 149W | 0MiB / 11441MiB | 0% Default |\n", "| | | N/A |\n", "+-------------------------------+----------------------+----------------------+\n", " \n", "+-----------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=============================================================================|\n", "| No running processes found |\n", "+-----------------------------------------------------------------------------+\n" ] } ] }, { "cell_type": "code", "source": [ "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')" ], "metadata": { "id": "UDp0N4q5Evvt" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "!wget https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz\n", "!tar -xvzf cifar-100-python.tar.gz" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "igqG2uRXEx95", "outputId": "6f9d4600-3097-4152-95d0-6306a3a4c4a2" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "--2022-02-15 10:03:27-- https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz\n", "Resolving www.cs.toronto.edu (www.cs.toronto.edu)... 128.100.3.30\n", "Connecting to www.cs.toronto.edu (www.cs.toronto.edu)|128.100.3.30|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 169001437 (161M) [application/x-gzip]\n", "Saving to: ‘cifar-100-python.tar.gz’\n", "\n", "cifar-100-python.ta 100%[===================>] 161.17M 31.4MB/s in 5.7s \n", "\n", "2022-02-15 10:03:34 (28.3 MB/s) - ‘cifar-100-python.tar.gz’ saved [169001437/169001437]\n", "\n", "cifar-100-python/\n", "cifar-100-python/file.txt~\n", "cifar-100-python/train\n", "cifar-100-python/test\n", "cifar-100-python/meta\n" ] } ] }, { "cell_type": "code", "source": [ "with open('cifar-100-python/train', 'rb') as f:\n", " data_train = pickle.load(f, encoding='latin1')\n", "with open('cifar-100-python/test', 'rb') as f:\n", " data_test = pickle.load(f, encoding='latin1')\n", "\n", "# Здесь указать ваши классы по варианту!!!\n", "CLASSES = [0, 55, 58]\n", "\n", "train_X = data_train['data'].reshape(-1, 3, 32, 32)\n", "train_X = np.transpose(train_X, [0, 2, 3, 1]) # NCHW -> NHWC\n", "train_y = np.array(data_train['fine_labels'])\n", "mask = np.isin(train_y, CLASSES)\n", "train_X = train_X[mask].copy()\n", "train_y = train_y[mask].copy()\n", "train_y = np.unique(train_y, return_inverse=1)[1]\n", "del data_train\n", "\n", "test_X = data_test['data'].reshape(-1, 3, 32, 32)\n", "test_X = np.transpose(test_X, [0, 2, 3, 1])\n", "test_y = np.array(data_test['fine_labels'])\n", "mask = np.isin(test_y, CLASSES)\n", "test_X = test_X[mask].copy()\n", "test_y = test_y[mask].copy()\n", "test_y = np.unique(test_y, return_inverse=1)[1]\n", "del data_test\n", "Image.fromarray(train_X[50]).resize((256,256))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 273 }, "id": "qDzb8iHSE0nB", "outputId": "a5415611-4085-4af5-9d13-22e4944962f2" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "code", "source": [ "class CifarDataset(Dataset):\n", " def __init__(self, X, y, transform=None, p=0.0):\n", " assert X.size(0) == y.size(0)\n", " super(Dataset, self).__init__()\n", " self.X = X\n", " self.y = y\n", " self.transform = transform\n", " self.prob = p\n", " \n", " def __len__(self):\n", " return self.y.size(0)\n", " \n", " def __getitem__(self, index):\n", " x = self.X[index]\n", " if self.transform and np.random.random()" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "code", "source": [ "batch_size = 128\n", "dataloader = {}\n", "for (X, y), part in zip([(train_X, train_y), (test_X, test_y)],\n", " ['train', 'test']):\n", " tensor_x = torch.Tensor(X)\n", " tensor_y = F.one_hot(torch.Tensor(y).to(torch.int64),\n", " num_classes=len(CLASSES))/1.\n", " dataset = CifarDataset(tensor_x, tensor_y,\n", " transform if part=='train' else None,\n", " p=0.5) # создание объекта датасета\n", " dataloader[part] = DataLoader(dataset, batch_size=batch_size,\n", " prefetch_factor=8 if part=='train' else 2,\n", " num_workers=2, persistent_workers=True,\n", " shuffle=True) # создание экземпляра класса DataLoader\n", "dataloader" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yBcmBcRQE_N6", "outputId": "38234b1d-af1c-4ec9-ad2a-6a5d9ab6c58f" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'test': ,\n", " 'train': }" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "code", "source": [ "class Normalize(nn.Module):\n", " def __init__(self, mean, std):\n", " super(Normalize, self).__init__()\n", " self.mean = torch.tensor(mean).to(device)\n", " self.std = torch.tensor(std).to(device)\n", "\n", " def forward(self, input):\n", " x = input / 255.0\n", " x = x - self.mean\n", " x = x / self.std\n", " return x.permute(0, 3, 1, 2) # nhwc -> nm\n", "\n", "class GlobalMaxPool2d(nn.Module):\n", " def __init__(self):\n", " super(GlobalMaxPool2d, self).__init__()\n", "\n", " def forward(self, input):\n", " out = F.adaptive_max_pool2d(input, output_size=1)\n", " return out.flatten(start_dim=1)\n", "\n", "class Cifar100_MLP(nn.Module):\n", " def __init__(self, hidden_size=32, classes=100):\n", " super(Cifar100_MLP, self).__init__()\n", " # https://blog.jovian.ai/image-classification-of-cifar100-dataset-using-pytorch-8b7145242df1\n", " self.seq = nn.Sequential(\n", " Normalize([0.5074,0.4867,0.4411],[0.2011,0.1987,0.2025]),\n", " # первый способ уменьшения размерности картинки - через stride\n", " nn.Conv2d(3, HIDDEN_SIZE, 3, stride=4),\n", " nn.ReLU(),\n", " nn.Dropout2d(p=0.2),\n", " # второй способ уменьшения размерности картинки - через слой пуллинг\n", " nn.Conv2d(HIDDEN_SIZE, HIDDEN_SIZE*2, 3, stride=1, padding=1),\n", " nn.ReLU(),\n", " nn.AvgPool2d(4),#nn.MaxPool2d(4),\n", " nn.Dropout2d(p=0.3),\n", " nn.Flatten(),\n", " nn.Linear(HIDDEN_SIZE*8, classes),\n", " )\n", "\n", " def forward(self, input):\n", " return self.seq(input)\n", "\n", "model = torch.hub.load(\"chenyaofo/pytorch-cifar-models\",\n", " \"cifar100_mobilenetv2_x0_5\",\n", " #'cifar100_resnet20',\n", " pretrained=True)\n", "model.to(device)\n", "new_model = nn.Sequential(\n", " Normalize([0.5074,0.4867,0.4411],[0.2011,0.1987,0.2025]),# https://blog.jovian.ai/image-classification-of-cifar100-dataset-using-pytorch-8b7145242df1\n", " model\n", ").to(device)\n", "print(new_model(torch.rand(1, 32, 32, 3).to(device)))\n", "summary(new_model, input_size=(32, 32, 3))\n", "new_model" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "zpnsDVhoFB-N", "outputId": "031f21d0-bc9b-40bd-d919-4f45c2d44f1f" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Using cache found in /root/.cache/torch/hub/chenyaofo_pytorch-cifar-models_master\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "MobileNetV2(\n", " (features): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=16, bias=False)\n", " (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): Conv2d(16, 8, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (2): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (2): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(8, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)\n", " (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (3): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=96, bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(96, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (4): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=96, bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(96, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (5): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=96, bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(96, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (6): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=96, bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(96, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (7): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=96, bias=False)\n", " (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(96, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (8): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (9): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (10): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (11): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)\n", " (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (12): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(48, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(288, 288, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=288, bias=False)\n", " (1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(288, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (13): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(48, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(288, 288, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=288, bias=False)\n", " (1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(288, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (14): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(48, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(288, 288, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=288, bias=False)\n", " (1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(288, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (15): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(80, 480, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(480, 480, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=480, bias=False)\n", " (1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(480, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (16): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(80, 480, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(480, 480, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=480, bias=False)\n", " (1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(480, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (17): InvertedResidual(\n", " (conv): Sequential(\n", " (0): ConvBNActivation(\n", " (0): Conv2d(80, 480, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (1): ConvBNActivation(\n", " (0): Conv2d(480, 480, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=480, bias=False)\n", " (1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " (2): Conv2d(480, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (3): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (18): ConvBNActivation(\n", " (0): Conv2d(160, 1280, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(1280, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU6(inplace=True)\n", " )\n", " )\n", " (classifier): Sequential(\n", " (0): Dropout(p=0.2, inplace=False)\n", " (1): Linear(in_features=1280, out_features=100, bias=True)\n", " )\n", ")" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "code", "source": [ "summary(model, input_size=(3, 512, 512))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_5bkK8ct3GUI", "outputId": "e74e9901-21ea-49ed-e585-fdd4a4315838" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "----------------------------------------------------------------\n", " Layer (type) Output Shape Param #\n", "================================================================\n", " Conv2d-1 [-1, 16, 512, 512] 432\n", " BatchNorm2d-2 [-1, 16, 512, 512] 32\n", " ReLU6-3 [-1, 16, 512, 512] 0\n", " Conv2d-4 [-1, 16, 512, 512] 144\n", " BatchNorm2d-5 [-1, 16, 512, 512] 32\n", " ReLU6-6 [-1, 16, 512, 512] 0\n", " Conv2d-7 [-1, 8, 512, 512] 128\n", " BatchNorm2d-8 [-1, 8, 512, 512] 16\n", " InvertedResidual-9 [-1, 8, 512, 512] 0\n", " Conv2d-10 [-1, 48, 512, 512] 384\n", " BatchNorm2d-11 [-1, 48, 512, 512] 96\n", " ReLU6-12 [-1, 48, 512, 512] 0\n", " Conv2d-13 [-1, 48, 512, 512] 432\n", " BatchNorm2d-14 [-1, 48, 512, 512] 96\n", " ReLU6-15 [-1, 48, 512, 512] 0\n", " Conv2d-16 [-1, 16, 512, 512] 768\n", " BatchNorm2d-17 [-1, 16, 512, 512] 32\n", " InvertedResidual-18 [-1, 16, 512, 512] 0\n", " Conv2d-19 [-1, 96, 512, 512] 1,536\n", " BatchNorm2d-20 [-1, 96, 512, 512] 192\n", " ReLU6-21 [-1, 96, 512, 512] 0\n", " Conv2d-22 [-1, 96, 512, 512] 864\n", " BatchNorm2d-23 [-1, 96, 512, 512] 192\n", " ReLU6-24 [-1, 96, 512, 512] 0\n", " Conv2d-25 [-1, 16, 512, 512] 1,536\n", " BatchNorm2d-26 [-1, 16, 512, 512] 32\n", " InvertedResidual-27 [-1, 16, 512, 512] 0\n", " Conv2d-28 [-1, 96, 512, 512] 1,536\n", " BatchNorm2d-29 [-1, 96, 512, 512] 192\n", " ReLU6-30 [-1, 96, 512, 512] 0\n", " Conv2d-31 [-1, 96, 256, 256] 864\n", " BatchNorm2d-32 [-1, 96, 256, 256] 192\n", " ReLU6-33 [-1, 96, 256, 256] 0\n", " Conv2d-34 [-1, 16, 256, 256] 1,536\n", " BatchNorm2d-35 [-1, 16, 256, 256] 32\n", " InvertedResidual-36 [-1, 16, 256, 256] 0\n", " Conv2d-37 [-1, 96, 256, 256] 1,536\n", " BatchNorm2d-38 [-1, 96, 256, 256] 192\n", " ReLU6-39 [-1, 96, 256, 256] 0\n", " Conv2d-40 [-1, 96, 256, 256] 864\n", " BatchNorm2d-41 [-1, 96, 256, 256] 192\n", " ReLU6-42 [-1, 96, 256, 256] 0\n", " Conv2d-43 [-1, 16, 256, 256] 1,536\n", " BatchNorm2d-44 [-1, 16, 256, 256] 32\n", " InvertedResidual-45 [-1, 16, 256, 256] 0\n", " Conv2d-46 [-1, 96, 256, 256] 1,536\n", " BatchNorm2d-47 [-1, 96, 256, 256] 192\n", " ReLU6-48 [-1, 96, 256, 256] 0\n", " Conv2d-49 [-1, 96, 256, 256] 864\n", " BatchNorm2d-50 [-1, 96, 256, 256] 192\n", " ReLU6-51 [-1, 96, 256, 256] 0\n", " Conv2d-52 [-1, 16, 256, 256] 1,536\n", " BatchNorm2d-53 [-1, 16, 256, 256] 32\n", " InvertedResidual-54 [-1, 16, 256, 256] 0\n", " Conv2d-55 [-1, 96, 256, 256] 1,536\n", " BatchNorm2d-56 [-1, 96, 256, 256] 192\n", " ReLU6-57 [-1, 96, 256, 256] 0\n", " Conv2d-58 [-1, 96, 128, 128] 864\n", " BatchNorm2d-59 [-1, 96, 128, 128] 192\n", " ReLU6-60 [-1, 96, 128, 128] 0\n", " Conv2d-61 [-1, 32, 128, 128] 3,072\n", " BatchNorm2d-62 [-1, 32, 128, 128] 64\n", " InvertedResidual-63 [-1, 32, 128, 128] 0\n", " Conv2d-64 [-1, 192, 128, 128] 6,144\n", " BatchNorm2d-65 [-1, 192, 128, 128] 384\n", " ReLU6-66 [-1, 192, 128, 128] 0\n", " Conv2d-67 [-1, 192, 128, 128] 1,728\n", " BatchNorm2d-68 [-1, 192, 128, 128] 384\n", " ReLU6-69 [-1, 192, 128, 128] 0\n", " Conv2d-70 [-1, 32, 128, 128] 6,144\n", " BatchNorm2d-71 [-1, 32, 128, 128] 64\n", " InvertedResidual-72 [-1, 32, 128, 128] 0\n", " Conv2d-73 [-1, 192, 128, 128] 6,144\n", " BatchNorm2d-74 [-1, 192, 128, 128] 384\n", " ReLU6-75 [-1, 192, 128, 128] 0\n", " Conv2d-76 [-1, 192, 128, 128] 1,728\n", " BatchNorm2d-77 [-1, 192, 128, 128] 384\n", " ReLU6-78 [-1, 192, 128, 128] 0\n", " Conv2d-79 [-1, 32, 128, 128] 6,144\n", " BatchNorm2d-80 [-1, 32, 128, 128] 64\n", " InvertedResidual-81 [-1, 32, 128, 128] 0\n", " Conv2d-82 [-1, 192, 128, 128] 6,144\n", " BatchNorm2d-83 [-1, 192, 128, 128] 384\n", " ReLU6-84 [-1, 192, 128, 128] 0\n", " Conv2d-85 [-1, 192, 128, 128] 1,728\n", " BatchNorm2d-86 [-1, 192, 128, 128] 384\n", " ReLU6-87 [-1, 192, 128, 128] 0\n", " Conv2d-88 [-1, 32, 128, 128] 6,144\n", " BatchNorm2d-89 [-1, 32, 128, 128] 64\n", " InvertedResidual-90 [-1, 32, 128, 128] 0\n", " Conv2d-91 [-1, 192, 128, 128] 6,144\n", " BatchNorm2d-92 [-1, 192, 128, 128] 384\n", " ReLU6-93 [-1, 192, 128, 128] 0\n", " Conv2d-94 [-1, 192, 128, 128] 1,728\n", " BatchNorm2d-95 [-1, 192, 128, 128] 384\n", " ReLU6-96 [-1, 192, 128, 128] 0\n", " Conv2d-97 [-1, 48, 128, 128] 9,216\n", " BatchNorm2d-98 [-1, 48, 128, 128] 96\n", " InvertedResidual-99 [-1, 48, 128, 128] 0\n", " Conv2d-100 [-1, 288, 128, 128] 13,824\n", " BatchNorm2d-101 [-1, 288, 128, 128] 576\n", " ReLU6-102 [-1, 288, 128, 128] 0\n", " Conv2d-103 [-1, 288, 128, 128] 2,592\n", " BatchNorm2d-104 [-1, 288, 128, 128] 576\n", " ReLU6-105 [-1, 288, 128, 128] 0\n", " Conv2d-106 [-1, 48, 128, 128] 13,824\n", " BatchNorm2d-107 [-1, 48, 128, 128] 96\n", "InvertedResidual-108 [-1, 48, 128, 128] 0\n", " Conv2d-109 [-1, 288, 128, 128] 13,824\n", " BatchNorm2d-110 [-1, 288, 128, 128] 576\n", " ReLU6-111 [-1, 288, 128, 128] 0\n", " Conv2d-112 [-1, 288, 128, 128] 2,592\n", " BatchNorm2d-113 [-1, 288, 128, 128] 576\n", " ReLU6-114 [-1, 288, 128, 128] 0\n", " Conv2d-115 [-1, 48, 128, 128] 13,824\n", " BatchNorm2d-116 [-1, 48, 128, 128] 96\n", "InvertedResidual-117 [-1, 48, 128, 128] 0\n", " Conv2d-118 [-1, 288, 128, 128] 13,824\n", " BatchNorm2d-119 [-1, 288, 128, 128] 576\n", " ReLU6-120 [-1, 288, 128, 128] 0\n", " Conv2d-121 [-1, 288, 64, 64] 2,592\n", " BatchNorm2d-122 [-1, 288, 64, 64] 576\n", " ReLU6-123 [-1, 288, 64, 64] 0\n", " Conv2d-124 [-1, 80, 64, 64] 23,040\n", " BatchNorm2d-125 [-1, 80, 64, 64] 160\n", "InvertedResidual-126 [-1, 80, 64, 64] 0\n", " Conv2d-127 [-1, 480, 64, 64] 38,400\n", " BatchNorm2d-128 [-1, 480, 64, 64] 960\n", " ReLU6-129 [-1, 480, 64, 64] 0\n", " Conv2d-130 [-1, 480, 64, 64] 4,320\n", " BatchNorm2d-131 [-1, 480, 64, 64] 960\n", " ReLU6-132 [-1, 480, 64, 64] 0\n", " Conv2d-133 [-1, 80, 64, 64] 38,400\n", " BatchNorm2d-134 [-1, 80, 64, 64] 160\n", "InvertedResidual-135 [-1, 80, 64, 64] 0\n", " Conv2d-136 [-1, 480, 64, 64] 38,400\n", " BatchNorm2d-137 [-1, 480, 64, 64] 960\n", " ReLU6-138 [-1, 480, 64, 64] 0\n", " Conv2d-139 [-1, 480, 64, 64] 4,320\n", " BatchNorm2d-140 [-1, 480, 64, 64] 960\n", " ReLU6-141 [-1, 480, 64, 64] 0\n", " Conv2d-142 [-1, 80, 64, 64] 38,400\n", " BatchNorm2d-143 [-1, 80, 64, 64] 160\n", "InvertedResidual-144 [-1, 80, 64, 64] 0\n", " Conv2d-145 [-1, 480, 64, 64] 38,400\n", " BatchNorm2d-146 [-1, 480, 64, 64] 960\n", " ReLU6-147 [-1, 480, 64, 64] 0\n", " Conv2d-148 [-1, 480, 64, 64] 4,320\n", " BatchNorm2d-149 [-1, 480, 64, 64] 960\n", " ReLU6-150 [-1, 480, 64, 64] 0\n", " Conv2d-151 [-1, 160, 64, 64] 76,800\n", " BatchNorm2d-152 [-1, 160, 64, 64] 320\n", "InvertedResidual-153 [-1, 160, 64, 64] 0\n", " Conv2d-154 [-1, 1280, 64, 64] 204,800\n", " BatchNorm2d-155 [-1, 1280, 64, 64] 2,560\n", " ReLU6-156 [-1, 1280, 64, 64] 0\n", " Dropout-157 [-1, 1280] 0\n", " Linear-158 [-1, 100] 128,100\n", "================================================================\n", "Total params: 815,780\n", "Trainable params: 815,780\n", "Non-trainable params: 0\n", "----------------------------------------------------------------\n", "Input size (MB): 3.00\n", "Forward/backward pass size (MB): 5380.51\n", "Params size (MB): 3.11\n", "Estimated Total Size (MB): 5386.62\n", "----------------------------------------------------------------\n" ] } ] }, { "cell_type": "code", "source": [ "#!git clone https://github.com/Fangyh09/pytorch-receptive-field.git\n", "def compute_RF_numerical(net,img_np):\n", " '''\n", " @param net: Pytorch network\n", " @param img_np: numpy array to use as input to the networks, it must be full of ones and with the correct\n", " shape.\n", " '''\n", " def weights_init(m):\n", " classname = m.__class__.__name__\n", " if classname.find('Conv') != -1:\n", " m.weight.data.fill_(1)\n", " m.bias.data.fill_(0)\n", " #net.apply(weights_init)\n", " img_ = torch.tensor(torch.from_numpy(img_np).float(),requires_grad=True)\n", " out_cnn=net(img_.to(device))\n", " out_shape=out_cnn.size()\n", " ndims=len(out_cnn.size())\n", " grad=torch.zeros(out_cnn.size())\n", " l_tmp=[]\n", " for i in range(ndims):\n", " if i==0 or i ==1:#batch or channel\n", " l_tmp.append(0)\n", " else:\n", " l_tmp.append(out_shape[i]/2)\n", " \n", " grad[tuple(l_tmp)]=1\n", " out_cnn.backward(gradient=grad.to(device))\n", " grad_np=img_.grad[0,0].data.detach().cpu().numpy()\n", " idx_nonzeros=np.where(grad_np!=0)\n", " RF=[np.max(idx)-np.min(idx)+1 for idx in idx_nonzeros]\n", " \n", " return RF\n", "\n", "compute_RF_numerical(model, np.zeros((1, 3, 1024, 1024)))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jnoXaYoazM1o", "outputId": "0a06bcc2-9fd4-4b7b-97a5-c045713cd2c4" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:14: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", " \n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "[1024, 1024]" ] }, "metadata": {}, "execution_count": 5 } ] }, { "cell_type": "code", "source": [ "## mobilenetv2\n", "#in_features = new_model[1].classifier[1].in_features\n", "#new_model[1].classifier[1] = nn.Linear(in_features=in_features,\n", "# out_features=len(CLASSES),\n", "# bias=True)\n", "## resnet20\n", "in_features = new_model[1].fc.in_features\n", "new_model[1].fc = nn.Linear(in_features=in_features,\n", " out_features=len(CLASSES),\n", " bias=True)\n", "\n", "new_model.to(device)\n", "summary(new_model, input_size=(32, 32, 3))\n", "print(new_model(torch.rand(1, 32, 32, 3).to(device)))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "03JE6MAlFiVc", "outputId": "37d72771-d0ae-4c07-c1b0-7dbe95026b80" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "----------------------------------------------------------------\n", " Layer (type) Output Shape Param #\n", "================================================================\n", " Normalize-1 [-1, 3, 32, 32] 0\n", " Conv2d-2 [-1, 16, 32, 32] 432\n", " BatchNorm2d-3 [-1, 16, 32, 32] 32\n", " ReLU-4 [-1, 16, 32, 32] 0\n", " Conv2d-5 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-6 [-1, 16, 32, 32] 32\n", " ReLU-7 [-1, 16, 32, 32] 0\n", " Conv2d-8 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-9 [-1, 16, 32, 32] 32\n", " ReLU-10 [-1, 16, 32, 32] 0\n", " BasicBlock-11 [-1, 16, 32, 32] 0\n", " Conv2d-12 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-13 [-1, 16, 32, 32] 32\n", " ReLU-14 [-1, 16, 32, 32] 0\n", " Conv2d-15 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-16 [-1, 16, 32, 32] 32\n", " ReLU-17 [-1, 16, 32, 32] 0\n", " BasicBlock-18 [-1, 16, 32, 32] 0\n", " Conv2d-19 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-20 [-1, 16, 32, 32] 32\n", " ReLU-21 [-1, 16, 32, 32] 0\n", " Conv2d-22 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-23 [-1, 16, 32, 32] 32\n", " ReLU-24 [-1, 16, 32, 32] 0\n", " BasicBlock-25 [-1, 16, 32, 32] 0\n", " Conv2d-26 [-1, 32, 16, 16] 4,608\n", " BatchNorm2d-27 [-1, 32, 16, 16] 64\n", " ReLU-28 [-1, 32, 16, 16] 0\n", " Conv2d-29 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-30 [-1, 32, 16, 16] 64\n", " Conv2d-31 [-1, 32, 16, 16] 512\n", " BatchNorm2d-32 [-1, 32, 16, 16] 64\n", " ReLU-33 [-1, 32, 16, 16] 0\n", " BasicBlock-34 [-1, 32, 16, 16] 0\n", " Conv2d-35 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-36 [-1, 32, 16, 16] 64\n", " ReLU-37 [-1, 32, 16, 16] 0\n", " Conv2d-38 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-39 [-1, 32, 16, 16] 64\n", " ReLU-40 [-1, 32, 16, 16] 0\n", " BasicBlock-41 [-1, 32, 16, 16] 0\n", " Conv2d-42 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-43 [-1, 32, 16, 16] 64\n", " ReLU-44 [-1, 32, 16, 16] 0\n", " Conv2d-45 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-46 [-1, 32, 16, 16] 64\n", " ReLU-47 [-1, 32, 16, 16] 0\n", " BasicBlock-48 [-1, 32, 16, 16] 0\n", " Conv2d-49 [-1, 64, 8, 8] 18,432\n", " BatchNorm2d-50 [-1, 64, 8, 8] 128\n", " ReLU-51 [-1, 64, 8, 8] 0\n", " Conv2d-52 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-53 [-1, 64, 8, 8] 128\n", " Conv2d-54 [-1, 64, 8, 8] 2,048\n", " BatchNorm2d-55 [-1, 64, 8, 8] 128\n", " ReLU-56 [-1, 64, 8, 8] 0\n", " BasicBlock-57 [-1, 64, 8, 8] 0\n", " Conv2d-58 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-59 [-1, 64, 8, 8] 128\n", " ReLU-60 [-1, 64, 8, 8] 0\n", " Conv2d-61 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-62 [-1, 64, 8, 8] 128\n", " ReLU-63 [-1, 64, 8, 8] 0\n", " BasicBlock-64 [-1, 64, 8, 8] 0\n", " Conv2d-65 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-66 [-1, 64, 8, 8] 128\n", " ReLU-67 [-1, 64, 8, 8] 0\n", " Conv2d-68 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-69 [-1, 64, 8, 8] 128\n", " ReLU-70 [-1, 64, 8, 8] 0\n", " BasicBlock-71 [-1, 64, 8, 8] 0\n", "AdaptiveAvgPool2d-72 [-1, 64, 1, 1] 0\n", " Linear-73 [-1, 3] 195\n", " CifarResNet-74 [-1, 3] 0\n", "================================================================\n", "Total params: 272,019\n", "Trainable params: 272,019\n", "Non-trainable params: 0\n", "----------------------------------------------------------------\n", "Input size (MB): 0.01\n", "Forward/backward pass size (MB): 5.18\n", "Params size (MB): 1.04\n", "Estimated Total Size (MB): 6.23\n", "----------------------------------------------------------------\n", "tensor([[ 0.0618, -0.5320, 0.1268]], device='cuda:0',\n", " grad_fn=)\n" ] } ] }, { "cell_type": "markdown", "source": [ "# Заморозка весов" ], "metadata": { "id": "cklFXQrBGai1" } }, { "cell_type": "code", "source": [ "print(\"Обучаемые параметры:\")\n", "keep_last = 2\n", "total = len([*new_model.named_parameters()])\n", "params_to_update = []\n", "for i, (name, param) in enumerate(new_model.named_parameters()):\n", " if i < total - keep_last:\n", " param.requires_grad = False \n", " else:\n", " params_to_update.append(param)\n", " print(\"\\t\",name)\n", "summary(new_model, input_size=(32, 32, 3))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2CkfRJgxGHtf", "outputId": "9f3c5ba4-df77-41cb-ca56-e783191c637b" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Обучаемые параметры:\n", "\t 1.fc.weight\n", "\t 1.fc.bias\n", "----------------------------------------------------------------\n", " Layer (type) Output Shape Param #\n", "================================================================\n", " Normalize-1 [-1, 3, 32, 32] 0\n", " Conv2d-2 [-1, 16, 32, 32] 432\n", " BatchNorm2d-3 [-1, 16, 32, 32] 32\n", " ReLU-4 [-1, 16, 32, 32] 0\n", " Conv2d-5 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-6 [-1, 16, 32, 32] 32\n", " ReLU-7 [-1, 16, 32, 32] 0\n", " Conv2d-8 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-9 [-1, 16, 32, 32] 32\n", " ReLU-10 [-1, 16, 32, 32] 0\n", " BasicBlock-11 [-1, 16, 32, 32] 0\n", " Conv2d-12 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-13 [-1, 16, 32, 32] 32\n", " ReLU-14 [-1, 16, 32, 32] 0\n", " Conv2d-15 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-16 [-1, 16, 32, 32] 32\n", " ReLU-17 [-1, 16, 32, 32] 0\n", " BasicBlock-18 [-1, 16, 32, 32] 0\n", " Conv2d-19 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-20 [-1, 16, 32, 32] 32\n", " ReLU-21 [-1, 16, 32, 32] 0\n", " Conv2d-22 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-23 [-1, 16, 32, 32] 32\n", " ReLU-24 [-1, 16, 32, 32] 0\n", " BasicBlock-25 [-1, 16, 32, 32] 0\n", " Conv2d-26 [-1, 32, 16, 16] 4,608\n", " BatchNorm2d-27 [-1, 32, 16, 16] 64\n", " ReLU-28 [-1, 32, 16, 16] 0\n", " Conv2d-29 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-30 [-1, 32, 16, 16] 64\n", " Conv2d-31 [-1, 32, 16, 16] 512\n", " BatchNorm2d-32 [-1, 32, 16, 16] 64\n", " ReLU-33 [-1, 32, 16, 16] 0\n", " BasicBlock-34 [-1, 32, 16, 16] 0\n", " Conv2d-35 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-36 [-1, 32, 16, 16] 64\n", " ReLU-37 [-1, 32, 16, 16] 0\n", " Conv2d-38 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-39 [-1, 32, 16, 16] 64\n", " ReLU-40 [-1, 32, 16, 16] 0\n", " BasicBlock-41 [-1, 32, 16, 16] 0\n", " Conv2d-42 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-43 [-1, 32, 16, 16] 64\n", " ReLU-44 [-1, 32, 16, 16] 0\n", " Conv2d-45 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-46 [-1, 32, 16, 16] 64\n", " ReLU-47 [-1, 32, 16, 16] 0\n", " BasicBlock-48 [-1, 32, 16, 16] 0\n", " Conv2d-49 [-1, 64, 8, 8] 18,432\n", " BatchNorm2d-50 [-1, 64, 8, 8] 128\n", " ReLU-51 [-1, 64, 8, 8] 0\n", " Conv2d-52 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-53 [-1, 64, 8, 8] 128\n", " Conv2d-54 [-1, 64, 8, 8] 2,048\n", " BatchNorm2d-55 [-1, 64, 8, 8] 128\n", " ReLU-56 [-1, 64, 8, 8] 0\n", " BasicBlock-57 [-1, 64, 8, 8] 0\n", " Conv2d-58 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-59 [-1, 64, 8, 8] 128\n", " ReLU-60 [-1, 64, 8, 8] 0\n", " Conv2d-61 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-62 [-1, 64, 8, 8] 128\n", " ReLU-63 [-1, 64, 8, 8] 0\n", " BasicBlock-64 [-1, 64, 8, 8] 0\n", " Conv2d-65 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-66 [-1, 64, 8, 8] 128\n", " ReLU-67 [-1, 64, 8, 8] 0\n", " Conv2d-68 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-69 [-1, 64, 8, 8] 128\n", " ReLU-70 [-1, 64, 8, 8] 0\n", " BasicBlock-71 [-1, 64, 8, 8] 0\n", "AdaptiveAvgPool2d-72 [-1, 64, 1, 1] 0\n", " Linear-73 [-1, 3] 195\n", " CifarResNet-74 [-1, 3] 0\n", "================================================================\n", "Total params: 272,019\n", "Trainable params: 195\n", "Non-trainable params: 271,824\n", "----------------------------------------------------------------\n", "Input size (MB): 0.01\n", "Forward/backward pass size (MB): 5.18\n", "Params size (MB): 1.04\n", "Estimated Total Size (MB): 6.23\n", "----------------------------------------------------------------\n" ] } ] }, { "cell_type": "markdown", "source": [ "# Fine tunning" ], "metadata": { "id": "AKGQ9CH3HoLq" } }, { "cell_type": "code", "source": [ "# добавляем сглаживание целевых меток, это увеличит значение функции потерь\n", "# но полученная модель будет более устойчивой к выбросам в обучающей выборке\n", "criterion = nn.CrossEntropyLoss(label_smoothing=0.1)\n", "# используется SGD c momentum и L2-регуляризацией весов\n", "optimizer = optim.SGD(params_to_update, lr=3e-4, momentum=0.9,\n", " weight_decay=1e-5)\n", "# добавляем постепенное уменьшение шага обучения каждые 200 эпох\n", "scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5)" ], "metadata": { "id": "l6HA-mcOHra1" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "EPOCHS = 60\n", "REDRAW_EVERY = 10\n", "steps_per_epoch = len(dataloader['train'])\n", "steps_per_epoch_val = len(dataloader['test'])\n", "# NEW\n", "pbar = tqdm(total=EPOCHS*steps_per_epoch)\n", "losses = []\n", "losses_val = []\n", "passed = 0\n", "# для создания чекпоинта\n", "best_acc = 0\n", "checkpoint_path = 'cifar_cnn_fine.pth' \n", "for epoch in range(EPOCHS): # проход по набору данных несколько раз\n", " tmp = []\n", " new_model.train()\n", " for i, batch in enumerate(dataloader['train'], 0):\n", " # получение одного минибатча; batch это двуэлементный список из [inputs, labels]\n", " inputs, labels = batch\n", " # на GPU\n", " inputs, labels = inputs.to(device), labels.to(device)\n", "\n", " # очищение прошлых градиентов с прошлой итерации\n", " optimizer.zero_grad()\n", "\n", " # прямой + обратный проходы + оптимизация\n", " outputs = new_model(inputs)\n", " loss = criterion(outputs, labels)\n", " #loss = F.cross_entropy(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", "\n", " # для подсчёта статистик\n", " accuracy = (labels.detach().argmax(dim=-1)==outputs.detach().argmax(dim=-1)).\\\n", " to(torch.float32).mean().cpu()*100\n", " tmp.append((loss.item(), accuracy.item()))\n", " pbar.update(1)\n", " losses.append((np.mean(tmp, axis=0),\n", " np.percentile(tmp, 25, axis=0),\n", " np.percentile(tmp, 75, axis=0)))\n", " scheduler.step() # обновляем learning_rate каждую эпоху\n", " tmp = []\n", " new_model.eval()\n", " with torch.no_grad(): # отключение автоматического дифференцирования\n", " for i, data in enumerate(dataloader['test'], 0):\n", " inputs, labels = data\n", " # на GPU\n", " inputs, labels = inputs.to(device), labels.to(device)\n", "\n", " outputs = new_model(inputs)\n", " loss = criterion(outputs, labels)\n", " accuracy = (labels.argmax(dim=-1)==outputs.argmax(dim=-1)).\\\n", " to(torch.float32).mean().cpu()*100\n", " tmp.append((loss.item(), accuracy.item()))\n", " losses_val.append((np.mean(tmp, axis=0),\n", " np.percentile(tmp, 25, axis=0),\n", " np.percentile(tmp, 75, axis=0)))\n", " # сохранение чекпоинта\n", " acc = losses_val[-1][0][1]\n", " if acc > best_acc:\n", " best_acc = acc\n", " torch.save(new_model.state_dict(), checkpoint_path)\n", " # обновление графиков\n", " if (epoch+1) % REDRAW_EVERY != 0:\n", " continue\n", " clear_output(wait=False)\n", " print('Эпоха: %s\\n'\n", " 'Лучшая доля правильных ответов: %s\\n'\n", " 'Текущая доля правильных ответов: %s' % (epoch+1, best_acc, acc))\n", " passed += pbar.format_dict['elapsed']\n", " pbar = tqdm(total=EPOCHS*steps_per_epoch, miniters=5)\n", " pbar.update((epoch+1)*steps_per_epoch)\n", " x_vals = np.arange(epoch+1)\n", " _, ax = plt.subplots(1, 2, figsize=(15, 5))\n", " stats = np.array(losses)\n", " stats_val = np.array(losses_val)\n", " ax[1].set_ylim(stats_val[:, 0, 1].min()-5, 100)\n", " ax[1].grid(axis='y')\n", " for i, title in enumerate(['CCE', 'Accuracy']):\n", " ax[i].plot(x_vals, stats[:, 0, i], label='train')\n", " ax[i].fill_between(x_vals, stats[:, 1, i],\n", " stats[:, 2, i], alpha=0.4)\n", " ax[i].plot(x_vals, stats_val[:, 0, i], label='val')\n", " ax[i].fill_between(x_vals,\n", " stats_val[:, 1, i],\n", " stats_val[:, 2, i], alpha=0.4)\n", " ax[i].legend()\n", " ax[i].set_title(title)\n", " plt.show()\n", "new_model.load_state_dict(torch.load(checkpoint_path))\n", "print('Обучение закончено за %s секунд' % passed)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 437, "referenced_widgets": [ "52b580e658764226bca8ec6150f5dfa2", "d4178aeef56f4d9093d95f9dad6f4659", "c3d864076bb647dea8c7a87a088fdd86", "cafdce4646284737be1052a7b5d34b19", "da5923b8f2b942a3a2f11408ad95339c", "13d8f5e34d174c2b91f2e12923c6273e", "d4adee0ff01440649eb226d465db6291", "181e562939b646178a41d5cbea4b421e", "ae88d9aef9de4944ad902e1f592ed72f", "55052d9744e94ae99ada21afb7b2bfd6", "de3a27f3bab54c53b1bee011f9e572d8", "2d880be240d84dd48e0a7eaef1104c14", "72914891589a48d992915f28a8f33915", "121214d561bb4cc482fa0b53050af2d1", "acb1dc0badb04b4db62972d334a28c58", "a06baafca0fc4416807c49049728756f", "e3bb0de942f44d88808ab207a968d24c", "ca115b9aadea481398cca2a2f64479be", "b643da0174424466a393872c3eb0ebd4", "480eb2b175e94de79df27041596f7a89", "e1e207f85ebb47c9bed26d71509f21b8", "39bac9d2b79040659535d2e03372bde5", "5436e909c7704c3987fc31d4996a364c", "fddb57b98a2a4befa9973b59a851ceae", "219ca528efe34441a6cc772c17d99640", "935ff14bb0c44d3ebd7cd33644f6d3a7", "c0ff465f8b7540c8b094d847a232bb6a", "dcf74eac636045838d4f2da32276df8b", "38cdf52fcd514d27841e42975a0dd9f6", "7a623791cdd64b8698026dc7944bb78f", "8dc54c237e3b449f9d342d027a36c356", "5625ff26ad14498d92a8f3cabf1079be", "2998111c6ee8484ba994c6df5775621a", "8d7c071fa80b41699d5119cd88500139", "49fd1c193d71437386b147387f608362", "98f6c27dfc4243a4942e759654f47d45", "c452e937822e4995bb551325bf0c854f", "365f03995a5a4261b12640af61c1dd2e", "03e2d5368fab40a4b955613125f6486a", "14887211d54442bebca080f5367a7830", "a06c616ce20c4ee98de36b03573204c6", "8f9ad2ad53f7462e97b9aa564c732430", "88071d3d9efe4ca289e44106e506803c", "35a33dd6388849859c2a7c07d564eb78", "35c1de0d70dc41ca91004c35e3ac8f01", "8cf0150a8f054d6987d1b8fc7b4dbc6f", "ddaff05f0f9943a6a672cfa19163f4c5", "71a2510006ee43f2be0bcad1d6e94b92", "449eed7546c24757b60b62eca25d2abc", "71ce471c5c344d1e8cd943aa3b0a6349", "23918549ba3b4b3190e64f64e8d713ce", "f24b7471de2244b09adf2cf91d36ad5e", "498036fa8d9a45ae9fe0526c3fcfbb87", "55c45fa03e234b6bb0639359fe5457f8", "f178589a800543e0bdb59ad179284972", "9470581189364d40a0af9bbe80dc6325", "59350d6a3c9c454bbd3e0ccefecdb016", "c00a039340cd4db1b5e384ea6345fadc", "4bab78472d37459090dd434ed6783fef", "9a92d06114b046d1a91a0afd753fdcb2", "46b99851631c4c6787c97b0d590b80b0", "2eea7e772de54161a362d26f371a5d56", "772927770cea443ebd2d11b056e52d9a", "ecfad20cecb04416baa2921794e7960a", "fadeff7d65894b4283fea4972b221831", "1ff701777eff40b0b5ed3e3aae6c3d5e", "63307ca4f344461dad241d73a1bd564a", "a70a54a222dd4c74a53a5143affd6697", "a47f7a8a55d443f69f1071a63f790598", "39c38679384148cb84a88780e1d13b38", "38031802dd5c441bbc4fb1ad4655bc25", "46a9cef0c4a14edd8719dd41ce7dbaba", "e4b78d907e4c4ae1af9d751666b8eb11", "8b4ec4fc917e4c14bf79819c694f3eae", "12b1ef8207cf47cb87b222b187832df8", "bb9d81a91324440893a5767dc03511c4", "afb958bec9b147ee85eb6e66ce8ac1d2" ] }, "id": "eC0xA-UoH2qc", "outputId": "fa784571-84dc-4adc-beb6-4a9a9a7a6d93" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Эпоха: 60\n", "Лучшая доля правильных ответов: 98.4375\n", "Текущая доля правильных ответов: 96.68560536702473\n" ] }, { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "63307ca4f344461dad241d73a1bd564a", "version_minor": 0, "version_major": 2 }, "text/plain": [ " 0%| | 0/720 [00:00" ] }, "metadata": { "needs_background": "light" } }, { "output_type": "stream", "name": "stdout", "text": [ "Обучение закончено за 95.2061197757721 секунд\n" ] } ] }, { "cell_type": "code", "source": [ "batch_size = 128\n", "dataloader = {}\n", "for (X, y), part in zip([(train_X, train_y), (test_X, test_y)],\n", " ['train', 'test']):\n", " tensor_x = torch.Tensor(X)\n", " tensor_y = F.one_hot(torch.Tensor(y).to(torch.int64),\n", " num_classes=len(CLASSES))/1.\n", " dataset = CifarDataset(tensor_x, tensor_y,\n", " transform=None,\n", " p=0.0) # создание объекта датасета\n", " dataloader[part] = DataLoader(dataset, batch_size=batch_size,\n", " num_workers=2, shuffle=True) # создание экземпляра класса DataLoader\n", "dataloader" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IES359CcLBYc", "outputId": "16cc531d-f88c-46b9-8585-2faacf412458" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'test': ,\n", " 'train': }" ] }, "metadata": {}, "execution_count": 13 } ] }, { "cell_type": "code", "source": [ "for part in ['train', 'test']:\n", " y_pred = []\n", " y_true = []\n", " with torch.no_grad(): # отключение автоматического дифференцирования\n", " for i, data in enumerate(dataloader[part], 0):\n", " inputs, labels = data\n", " # на GPU\n", " inputs, labels = inputs.to(device), labels.to(device)\n", "\n", " outputs = new_model(inputs).detach().cpu().numpy()\n", " y_pred.append(outputs)\n", " y_true.append(labels.cpu().numpy())\n", " y_true = np.concatenate(y_true)\n", " y_pred = np.concatenate(y_pred)\n", " print(part)\n", " print(classification_report(y_true.argmax(axis=-1), y_pred.argmax(axis=-1),\n", " digits=4, target_names=list(map(str, CLASSES))))\n", " print('-'*50)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "i6DiPQarLEIQ", "outputId": "9e5d8ac1-629c-44ad-e55e-8ed93ce612cc" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "train\n", " precision recall f1-score support\n", "\n", " 0 0.9960 0.9940 0.9950 500\n", " 55 0.9980 0.9880 0.9930 500\n", " 58 0.9881 1.0000 0.9940 500\n", "\n", " accuracy 0.9940 1500\n", " macro avg 0.9940 0.9940 0.9940 1500\n", "weighted avg 0.9940 0.9940 0.9940 1500\n", "\n", "--------------------------------------------------\n", "test\n", " precision recall f1-score support\n", "\n", " 0 0.9804 1.0000 0.9901 100\n", " 55 0.9896 0.9500 0.9694 100\n", " 58 0.9706 0.9900 0.9802 100\n", "\n", " accuracy 0.9800 300\n", " macro avg 0.9802 0.9800 0.9799 300\n", "weighted avg 0.9802 0.9800 0.9799 300\n", "\n", "--------------------------------------------------\n" ] } ] }, { "cell_type": "code", "source": [ "# сохраниение модели\n", "# ПЕРВЫЙ СПОСОБ: сохранение параметров\n", "PATH = 'cifar_cnn_fine.pth'\n", "torch.save(new_model.state_dict(), PATH)\n", "\n", "# ВТОРОЙ СПОСОБ: сохранение всей архитектуры\n", "PATH2 = 'cifar_cnn_fine.pt'\n", "torch.save(new_model, PATH2)\n", "# загрузка\n", "new_model_2 = torch.load(PATH2)\n", "new_model_2.eval()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "w6y5sD4YLOVm", "outputId": "095db5e1-4d30-4f72-f46d-e5f9590dd234" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Sequential(\n", " (0): Normalize()\n", " (1): CifarResNet(\n", " (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (layer1): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer2): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(16, 32, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer3): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(32, 64, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (fc): Linear(in_features=64, out_features=3, bias=True)\n", " )\n", ")" ] }, "metadata": {}, "execution_count": 15 } ] }, { "cell_type": "code", "source": [ "class GlobalAvgPooling2d(nn.Module):\n", " def __init__(self):\n", " super(GlobalAvgPooling2d, self).__init__()\n", "\n", " def forward(self, x):\n", " x = F.adaptive_avg_pool2d(x, (1, 1))\n", " return torch.flatten(x, 1)\n", "\n", "class MyModel(nn.Module):\n", "\n", " def __init__(self, model):\n", " super(MyModel, self).__init__()\n", "\n", " # Here you get the bottleneck/feature extractor\n", " self.normalization = model[0]\n", " self.resnet_feature_extractor = \\\n", " nn.Sequential(*list(model[1].children())[:-1])\n", "\n", " # Now you can include your classifiers\n", " self.classifier = list(model[1].children())[-1]\n", "\n", " # Set your own forward pass\n", " def forward(self, x, extra_info=None):\n", " x = self.normalization(x)\n", " x = self.resnet_feature_extractor(x)\n", " x = self.classifier(x)\n", " return x\n", "\n", "new_model = torch.load(PATH2)\n", "new_model[1].avgpool = GlobalAvgPooling2d()\n", "new_model.to(device)\n", "model = MyModel(new_model).to(device)\n", "\n", "summary(model, input_size=(32, 32, 3))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5MPDj7sOPUcL", "outputId": "6c6a3047-2c76-4eea-a400-8079039c9819" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "----------------------------------------------------------------\n", " Layer (type) Output Shape Param #\n", "================================================================\n", " Normalize-1 [-1, 3, 32, 32] 0\n", " Conv2d-2 [-1, 16, 32, 32] 432\n", " BatchNorm2d-3 [-1, 16, 32, 32] 32\n", " ReLU-4 [-1, 16, 32, 32] 0\n", " Conv2d-5 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-6 [-1, 16, 32, 32] 32\n", " ReLU-7 [-1, 16, 32, 32] 0\n", " Conv2d-8 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-9 [-1, 16, 32, 32] 32\n", " ReLU-10 [-1, 16, 32, 32] 0\n", " BasicBlock-11 [-1, 16, 32, 32] 0\n", " Conv2d-12 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-13 [-1, 16, 32, 32] 32\n", " ReLU-14 [-1, 16, 32, 32] 0\n", " Conv2d-15 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-16 [-1, 16, 32, 32] 32\n", " ReLU-17 [-1, 16, 32, 32] 0\n", " BasicBlock-18 [-1, 16, 32, 32] 0\n", " Conv2d-19 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-20 [-1, 16, 32, 32] 32\n", " ReLU-21 [-1, 16, 32, 32] 0\n", " Conv2d-22 [-1, 16, 32, 32] 2,304\n", " BatchNorm2d-23 [-1, 16, 32, 32] 32\n", " ReLU-24 [-1, 16, 32, 32] 0\n", " BasicBlock-25 [-1, 16, 32, 32] 0\n", " Conv2d-26 [-1, 32, 16, 16] 4,608\n", " BatchNorm2d-27 [-1, 32, 16, 16] 64\n", " ReLU-28 [-1, 32, 16, 16] 0\n", " Conv2d-29 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-30 [-1, 32, 16, 16] 64\n", " Conv2d-31 [-1, 32, 16, 16] 512\n", " BatchNorm2d-32 [-1, 32, 16, 16] 64\n", " ReLU-33 [-1, 32, 16, 16] 0\n", " BasicBlock-34 [-1, 32, 16, 16] 0\n", " Conv2d-35 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-36 [-1, 32, 16, 16] 64\n", " ReLU-37 [-1, 32, 16, 16] 0\n", " Conv2d-38 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-39 [-1, 32, 16, 16] 64\n", " ReLU-40 [-1, 32, 16, 16] 0\n", " BasicBlock-41 [-1, 32, 16, 16] 0\n", " Conv2d-42 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-43 [-1, 32, 16, 16] 64\n", " ReLU-44 [-1, 32, 16, 16] 0\n", " Conv2d-45 [-1, 32, 16, 16] 9,216\n", " BatchNorm2d-46 [-1, 32, 16, 16] 64\n", " ReLU-47 [-1, 32, 16, 16] 0\n", " BasicBlock-48 [-1, 32, 16, 16] 0\n", " Conv2d-49 [-1, 64, 8, 8] 18,432\n", " BatchNorm2d-50 [-1, 64, 8, 8] 128\n", " ReLU-51 [-1, 64, 8, 8] 0\n", " Conv2d-52 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-53 [-1, 64, 8, 8] 128\n", " Conv2d-54 [-1, 64, 8, 8] 2,048\n", " BatchNorm2d-55 [-1, 64, 8, 8] 128\n", " ReLU-56 [-1, 64, 8, 8] 0\n", " BasicBlock-57 [-1, 64, 8, 8] 0\n", " Conv2d-58 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-59 [-1, 64, 8, 8] 128\n", " ReLU-60 [-1, 64, 8, 8] 0\n", " Conv2d-61 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-62 [-1, 64, 8, 8] 128\n", " ReLU-63 [-1, 64, 8, 8] 0\n", " BasicBlock-64 [-1, 64, 8, 8] 0\n", " Conv2d-65 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-66 [-1, 64, 8, 8] 128\n", " ReLU-67 [-1, 64, 8, 8] 0\n", " Conv2d-68 [-1, 64, 8, 8] 36,864\n", " BatchNorm2d-69 [-1, 64, 8, 8] 128\n", " ReLU-70 [-1, 64, 8, 8] 0\n", " BasicBlock-71 [-1, 64, 8, 8] 0\n", "GlobalAvgPooling2d-72 [-1, 64] 0\n", " Linear-73 [-1, 3] 195\n", "================================================================\n", "Total params: 272,019\n", "Trainable params: 195\n", "Non-trainable params: 271,824\n", "----------------------------------------------------------------\n", "Input size (MB): 0.01\n", "Forward/backward pass size (MB): 5.18\n", "Params size (MB): 1.04\n", "Estimated Total Size (MB): 6.23\n", "----------------------------------------------------------------\n" ] } ] }, { "cell_type": "code", "source": [ "# входной тензор для модели\n", "x = torch.randn(1, 32, 32, 3, requires_grad=True).to(device)\n", "torch_out = model(x)\n", "\n", "# экспорт модели\n", "torch.onnx.export(model, # модель\n", " x, # входной тензор (или кортеж нескольких тензоров)\n", " \"cifar100_CNN_RESNET20.onnx\", # куда сохранить (либо путь к файлу либо fileObject)\n", " export_params=True, # сохраняет веса обученных параметров внутри файла модели\n", " opset_version=9, # версия ONNX\n", " do_constant_folding=True, # следует ли выполнять укорачивание констант для оптимизации\n", " input_names = ['input'], # имя входного слоя\n", " output_names = ['output'], # имя выходного слоя\n", " dynamic_axes={'input' : {0 : 'batch_size'}, # динамичные оси, в данном случае только размер пакета\n", " 'output' : {0 : 'batch_size'}})" ], "metadata": { "id": "2nJknJyhLb6z" }, "execution_count": null, "outputs": [] } ] }