{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "tf2.0_attention_mechanisms.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true,
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "587e3dcf092346fea5ccaea95820434a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_dc83bbdebf9945a5838dd1822aad6619",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_4327aec254a540e2a816309f1fe49393",
              "IPY_MODEL_9cca5fa7a1744da4b58540ed4e2b9327"
            ]
          }
        },
        "dc83bbdebf9945a5838dd1822aad6619": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "4327aec254a540e2a816309f1fe49393": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_46d8fa6491c94caab3f66028e27f8f36",
            "_dom_classes": [],
            "description": "Dl Completed...",
            "_model_name": "IntProgressModel",
            "bar_style": "success",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_c65ddfa6f705401d909ca2ebb981a42c"
          }
        },
        "9cca5fa7a1744da4b58540ed4e2b9327": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_2e6c5798b0274e04b593a868c64296a7",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "1/|/100% 1/1 [00:02&lt;00:00,  2.27s/ url]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_f298eb3ea6a6441c8d13e1b1cad36f10"
          }
        },
        "46d8fa6491c94caab3f66028e27f8f36": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "initial",
            "_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"
          }
        },
        "c65ddfa6f705401d909ca2ebb981a42c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "2e6c5798b0274e04b593a868c64296a7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "f298eb3ea6a6441c8d13e1b1cad36f10": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "4d451f618f974192b039c42532e7ccc2": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_197d2e809ad842bea7025673399180a1",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_8420356505d04f06bc59f6bd642c13d3",
              "IPY_MODEL_af6e4c6bb1604aec822ebeab6946f404"
            ]
          }
        },
        "197d2e809ad842bea7025673399180a1": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "8420356505d04f06bc59f6bd642c13d3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_55e949912e6a4a41b6a6cf21a611e96e",
            "_dom_classes": [],
            "description": "Dl Size...",
            "_model_name": "IntProgressModel",
            "bar_style": "success",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_df660c85fa4943bb9f6fbf8bf604818c"
          }
        },
        "af6e4c6bb1604aec822ebeab6946f404": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_5c21d5780f254824bb68ce4dd9828648",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "80/|/100% 80/80 [00:02&lt;00:00, 35.72 MiB/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_816bd50aa6fe4407bb4698a20e341cb3"
          }
        },
        "55e949912e6a4a41b6a6cf21a611e96e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "initial",
            "_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"
          }
        },
        "df660c85fa4943bb9f6fbf8bf604818c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "5c21d5780f254824bb68ce4dd9828648": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "816bd50aa6fe4407bb4698a20e341cb3": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "df464c03fc2f458a85ed0ae0e73c5051": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_e4f700f8f26c45ba999850a84afc8126",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_31d072eea14c44f2a2ecb49bdf7f9e2f",
              "IPY_MODEL_7c269f448cc345099e0be58504c1d0ac"
            ]
          }
        },
        "e4f700f8f26c45ba999850a84afc8126": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "31d072eea14c44f2a2ecb49bdf7f9e2f": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_7becc8d47a9a4d7cae810cf106f684a3",
            "_dom_classes": [],
            "description": "",
            "_model_name": "IntProgressModel",
            "bar_style": "info",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_8975735c896c4a0eb47558bf982b2d21"
          }
        },
        "7c269f448cc345099e0be58504c1d0ac": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_692f133a49c14c3c91f995775d75d9e3",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "24970 examples [00:27, 946.42 examples/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_4e56f6a116e84f1e9df0a1bf9a1f6f1c"
          }
        },
        "7becc8d47a9a4d7cae810cf106f684a3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "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"
          }
        },
        "8975735c896c4a0eb47558bf982b2d21": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "692f133a49c14c3c91f995775d75d9e3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "4e56f6a116e84f1e9df0a1bf9a1f6f1c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "a6e3161d5346447d84576cf58cc6e388": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_847120dcf70c491da26bc305f3d320ee",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_cfd9377d360346b3940b389817adfcf7",
              "IPY_MODEL_5adf26296e604838a232a9586ec2faec"
            ]
          }
        },
        "847120dcf70c491da26bc305f3d320ee": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "cfd9377d360346b3940b389817adfcf7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_5510438c184147caa3616efa5f5591eb",
            "_dom_classes": [],
            "description": "",
            "_model_name": "IntProgressModel",
            "bar_style": "danger",
            "max": 25000,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 7313,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_83742ba0310f4c4cb06541accac3f80e"
          }
        },
        "5adf26296e604838a232a9586ec2faec": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_cf15e4375d3943a7a9db6d7f2db9cdc7",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 29% 7313/25000 [00:00&lt;00:00, 73128.67 examples/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_9ced3ef3239e4d32a2f84416308321e1"
          }
        },
        "5510438c184147caa3616efa5f5591eb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "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"
          }
        },
        "83742ba0310f4c4cb06541accac3f80e": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "cf15e4375d3943a7a9db6d7f2db9cdc7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "9ced3ef3239e4d32a2f84416308321e1": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "2c74eec70d7f4d38b4d1899f6458ce29": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_3c077060b6144f18893e5c3f926d8a38",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_fe67636fb6ad4ebf96bcc011a687399a",
              "IPY_MODEL_4e17b2c775764a50b1e1583876899b2c"
            ]
          }
        },
        "3c077060b6144f18893e5c3f926d8a38": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "fe67636fb6ad4ebf96bcc011a687399a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_3d79e8ec08c84c058637edfe550bc408",
            "_dom_classes": [],
            "description": "",
            "_model_name": "IntProgressModel",
            "bar_style": "info",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_e730ae6850394cae9d9824db5554a083"
          }
        },
        "4e17b2c775764a50b1e1583876899b2c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_148eacadd25c47f092d8bb6751ccb363",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "24900 examples [00:24, 1081.31 examples/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_b4da3e67410b496a9c68e4def9135539"
          }
        },
        "3d79e8ec08c84c058637edfe550bc408": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "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"
          }
        },
        "e730ae6850394cae9d9824db5554a083": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "148eacadd25c47f092d8bb6751ccb363": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "b4da3e67410b496a9c68e4def9135539": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "f2c53d6006734484a53b104067917913": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_f24f5aee69b5454f9d18bfada181941f",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_c2bf6140d3bf446bab013432eedc75ae",
              "IPY_MODEL_f9f62c09df45460487ea79bc79041037"
            ]
          }
        },
        "f24f5aee69b5454f9d18bfada181941f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "c2bf6140d3bf446bab013432eedc75ae": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_ffa29e9788cd4b8c84d736cc1f447e29",
            "_dom_classes": [],
            "description": "",
            "_model_name": "IntProgressModel",
            "bar_style": "danger",
            "max": 25000,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 10092,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_55f8edd5cbfc4d248325519766f7cdcd"
          }
        },
        "f9f62c09df45460487ea79bc79041037": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_508b72989ecd485d9ec53538ee2eda91",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 40% 10092/25000 [00:00&lt;00:00, 100919.86 examples/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_dc0a96747ec24204bae67844b652f0ff"
          }
        },
        "ffa29e9788cd4b8c84d736cc1f447e29": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "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"
          }
        },
        "55f8edd5cbfc4d248325519766f7cdcd": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "508b72989ecd485d9ec53538ee2eda91": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "dc0a96747ec24204bae67844b652f0ff": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "998de4867ba34068af1992fd7834f33c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_2985b687cbea4300a805ea1445812dfa",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_3cae39c4705d4657b181d59e6c447bbc",
              "IPY_MODEL_d8cb29b4cea547e4938f2c8298cfa277"
            ]
          }
        },
        "2985b687cbea4300a805ea1445812dfa": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "3cae39c4705d4657b181d59e6c447bbc": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_5606868825ec44e3b016547fb25d8f38",
            "_dom_classes": [],
            "description": "",
            "_model_name": "IntProgressModel",
            "bar_style": "info",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_5555f48666d7465881e97684adfc9b89"
          }
        },
        "d8cb29b4cea547e4938f2c8298cfa277": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_75ac3bb5665a4b5f94976f89cf4c260b",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": "49944 examples [00:51, 1027.71 examples/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_bd025262c7604e69bb1d5a300557adff"
          }
        },
        "5606868825ec44e3b016547fb25d8f38": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "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"
          }
        },
        "5555f48666d7465881e97684adfc9b89": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "75ac3bb5665a4b5f94976f89cf4c260b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "bd025262c7604e69bb1d5a300557adff": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "5e1ca30dc0064c7b8886e70b53f31919": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "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_d8e121c64d4244eca3286f4ee2187e4d",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_e36c7eb6c5be4779b7f6b2b533ac656e",
              "IPY_MODEL_750cb868db384818bac8878b0c150977"
            ]
          }
        },
        "d8e121c64d4244eca3286f4ee2187e4d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "e36c7eb6c5be4779b7f6b2b533ac656e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "IntProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_0f96220bc6994464b9846ac16261566b",
            "_dom_classes": [],
            "description": "",
            "_model_name": "IntProgressModel",
            "bar_style": "danger",
            "max": 50000,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 48268,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_fd5ec32575264f2da663ba49512aca62"
          }
        },
        "750cb868db384818bac8878b0c150977": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_9332b6cd206d48a482197a512f8288dd",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 97% 48268/50000 [00:00&lt;01:33, 18.44 examples/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_380c23e4d5f84c379d26aa6f0d31c12c"
          }
        },
        "0f96220bc6994464b9846ac16261566b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "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"
          }
        },
        "fd5ec32575264f2da663ba49512aca62": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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
          }
        },
        "9332b6cd206d48a482197a512f8288dd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "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"
          }
        },
        "380c23e4d5f84c379d26aa6f0d31c12c": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "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": [
        "<a href=\"https://colab.research.google.com/github/gmihaila/machine_learning_things/blob/master/attention_mechanisms/tf2_0_attention_mechanisms.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "V8NGywAXKazI",
        "colab_type": "code",
        "outputId": "ae3726cf-be3a-4991-ad99-426fa4e54c88",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        }
      },
      "source": [
        "!nvidia-smi"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Sun Feb  9 15:24:01 2020       \n",
            "+-----------------------------------------------------------------------------+\n",
            "| NVIDIA-SMI 440.48.02    Driver Version: 418.67       CUDA Version: 10.1     |\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",
            "|===============================+======================+======================|\n",
            "|   0  Tesla T4            Off  | 00000000:00:04.0 Off |                    0 |\n",
            "| N/A   55C    P8    10W /  70W |      0MiB / 15079MiB |      0%      Default |\n",
            "+-------------------------------+----------------------+----------------------+\n",
            "                                                                               \n",
            "+-----------------------------------------------------------------------------+\n",
            "| Processes:                                                       GPU Memory |\n",
            "|  GPU       PID   Type   Process name                             Usage      |\n",
            "|=============================================================================|\n",
            "|  No running processes found                                                 |\n",
            "+-----------------------------------------------------------------------------+\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "27jF_okvy53u",
        "colab_type": "text"
      },
      "source": [
        "### Imports"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "44oVj91SohKO",
        "colab_type": "code",
        "outputId": "6973d878-c112-4f18-8af2-f0f676b2a7d2",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 52
        }
      },
      "source": [
        "import os\n",
        "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"\n",
        "try:\n",
        "  # %tensorflow_version only exists in Colab.\n",
        "  %tensorflow_version 2.x\n",
        "except Exception:\n",
        "  pass\n",
        "from __future__ import absolute_import, division, print_function, unicode_literals\n",
        "import tensorflow as tf\n",
        "# tf.debugging.set_log_device_placement(True)\n",
        "import tensorflow_datasets as tfds\n",
        "import tensorflow_hub as hub\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import classification_report\n",
        "import time\n",
        "print(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))\n",
        "\n",
        "EMBEDDING_SIZE = 100\n",
        "BUFFER_SIZE = 1000\n",
        "BATCH = 1000\n",
        "EPOCHS = 20\n",
        "MAX_LEN = 500"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "TensorFlow 2.x selected.\n",
            "Num GPUs Available:  1\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BrE1BFRhOo1G",
        "colab_type": "text"
      },
      "source": [
        "### Functions"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0ok5p7RDOp38",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def pad_generator(data_generator, max_len=500, valid_split=False, test=0.3):\n",
        "  data = []\n",
        "  labels = []\n",
        "  [(data.append(val), labels.append(label)) for val, label in data_generator]\n",
        "  if max_len == -1:\n",
        "    max_len = max([len(instance) for instance in data])\n",
        "  data = tf.keras.preprocessing.sequence.pad_sequences(sequences=data, \n",
        "                                                       maxlen=max_len, \n",
        "                                                       dtype='int64', \n",
        "                                                       padding='post', \n",
        "                                                       truncating='post', \n",
        "                                                       value=0)\n",
        "  labels = np.array(labels, dtype='int64')\n",
        "  print(data.shape, labels.shape)\n",
        "  if valid_split:\n",
        "    X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=test)\n",
        "    train = tf.data.Dataset.from_tensor_slices((X_train, y_train))\n",
        "    test = tf.data.Dataset.from_tensor_slices((X_test, y_test))\n",
        "    return train, test\n",
        "  else:\n",
        "    dataset = tf.data.Dataset.from_tensor_slices((data, labels))\n",
        "    return dataset\n",
        "\n",
        "\n",
        "def plt_history(history_dict, \n",
        "                acc_key='accuracy', val_acc_key='val_accuracy', \n",
        "                loss_key='loss', val_loss_key='val_loss'):\n",
        "  acc = history_dict[acc_key]\n",
        "  val_acc = history_dict[val_acc_key]\n",
        "  loss = history_dict[loss_key]\n",
        "  val_loss = history_dict[val_loss_key]\n",
        "  epochs = range(1, len(acc) + 1)\n",
        "  plt.subplot(1, 2, 1)\n",
        "  # \"bo\" is for \"blue dot\"\n",
        "  plt.plot(epochs, loss, 'bo', label='Training loss')\n",
        "  # b is for \"solid blue line\"\n",
        "  plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
        "  plt.title('Training and validation loss')\n",
        "  plt.xlabel('Epochs')\n",
        "  plt.ylabel('Loss')\n",
        "  plt.legend()\n",
        "  plt.grid()\n",
        "  plt.tight_layout()\n",
        "  plt.xticks(epochs)\n",
        "\n",
        "\n",
        "  plt.subplot(1, 2, 2)\n",
        "  plt.plot(epochs, acc, 'bo', label='Training acc')\n",
        "  plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
        "  plt.title('Training and validation accuracy')\n",
        "  plt.xlabel('Epochs')\n",
        "  plt.ylabel('Accuracy')\n",
        "  plt.legend(loc='lower right')\n",
        "  plt.grid()\n",
        "  plt.tight_layout()\n",
        "  plt.xticks(epochs)\n",
        "  fig = plt.gcf()\n",
        "  fig.set_size_inches(15, 5)\n",
        "  plt.show()\n",
        "  return"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jBV03_70yLrc",
        "colab_type": "text"
      },
      "source": [
        "### Dataset"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0f0BDAbayM4H",
        "colab_type": "code",
        "outputId": "cf41b7d3-df09-4ae9-b3c5-e709358cb48a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 392,
          "referenced_widgets": [
            "587e3dcf092346fea5ccaea95820434a",
            "dc83bbdebf9945a5838dd1822aad6619",
            "4327aec254a540e2a816309f1fe49393",
            "9cca5fa7a1744da4b58540ed4e2b9327",
            "46d8fa6491c94caab3f66028e27f8f36",
            "c65ddfa6f705401d909ca2ebb981a42c",
            "2e6c5798b0274e04b593a868c64296a7",
            "f298eb3ea6a6441c8d13e1b1cad36f10",
            "4d451f618f974192b039c42532e7ccc2",
            "197d2e809ad842bea7025673399180a1",
            "8420356505d04f06bc59f6bd642c13d3",
            "af6e4c6bb1604aec822ebeab6946f404",
            "55e949912e6a4a41b6a6cf21a611e96e",
            "df660c85fa4943bb9f6fbf8bf604818c",
            "5c21d5780f254824bb68ce4dd9828648",
            "816bd50aa6fe4407bb4698a20e341cb3",
            "df464c03fc2f458a85ed0ae0e73c5051",
            "e4f700f8f26c45ba999850a84afc8126",
            "31d072eea14c44f2a2ecb49bdf7f9e2f",
            "7c269f448cc345099e0be58504c1d0ac",
            "7becc8d47a9a4d7cae810cf106f684a3",
            "8975735c896c4a0eb47558bf982b2d21",
            "692f133a49c14c3c91f995775d75d9e3",
            "4e56f6a116e84f1e9df0a1bf9a1f6f1c",
            "a6e3161d5346447d84576cf58cc6e388",
            "847120dcf70c491da26bc305f3d320ee",
            "cfd9377d360346b3940b389817adfcf7",
            "5adf26296e604838a232a9586ec2faec",
            "5510438c184147caa3616efa5f5591eb",
            "83742ba0310f4c4cb06541accac3f80e",
            "cf15e4375d3943a7a9db6d7f2db9cdc7",
            "9ced3ef3239e4d32a2f84416308321e1",
            "2c74eec70d7f4d38b4d1899f6458ce29",
            "3c077060b6144f18893e5c3f926d8a38",
            "fe67636fb6ad4ebf96bcc011a687399a",
            "4e17b2c775764a50b1e1583876899b2c",
            "3d79e8ec08c84c058637edfe550bc408",
            "e730ae6850394cae9d9824db5554a083",
            "148eacadd25c47f092d8bb6751ccb363",
            "b4da3e67410b496a9c68e4def9135539",
            "f2c53d6006734484a53b104067917913",
            "f24f5aee69b5454f9d18bfada181941f",
            "c2bf6140d3bf446bab013432eedc75ae",
            "f9f62c09df45460487ea79bc79041037",
            "ffa29e9788cd4b8c84d736cc1f447e29",
            "55f8edd5cbfc4d248325519766f7cdcd",
            "508b72989ecd485d9ec53538ee2eda91",
            "dc0a96747ec24204bae67844b652f0ff",
            "998de4867ba34068af1992fd7834f33c",
            "2985b687cbea4300a805ea1445812dfa",
            "3cae39c4705d4657b181d59e6c447bbc",
            "d8cb29b4cea547e4938f2c8298cfa277",
            "5606868825ec44e3b016547fb25d8f38",
            "5555f48666d7465881e97684adfc9b89",
            "75ac3bb5665a4b5f94976f89cf4c260b",
            "bd025262c7604e69bb1d5a300557adff",
            "5e1ca30dc0064c7b8886e70b53f31919",
            "d8e121c64d4244eca3286f4ee2187e4d",
            "e36c7eb6c5be4779b7f6b2b533ac656e",
            "750cb868db384818bac8878b0c150977",
            "0f96220bc6994464b9846ac16261566b",
            "fd5ec32575264f2da663ba49512aca62",
            "9332b6cd206d48a482197a512f8288dd",
            "380c23e4d5f84c379d26aa6f0d31c12c"
          ]
        }
      },
      "source": [
        "# Use the version pre-encoded with an ~8k vocabulary.\n",
        "# Return the train/test datasets as a tuple.\n",
        "# Return (example, label) pairs from the dataset (instead of a dictionary).\n",
        "# Also return the `info` structure. \n",
        "\n",
        "(train_data, test_data), info = tfds.load('imdb_reviews/subwords8k', \n",
        "                                          split = (tfds.Split.TRAIN, tfds.Split.TEST),\n",
        "                                          as_supervised=True,\n",
        "                                          with_info=True)\n",
        "\n",
        "text_encoder = info.features['text'].encoder\n",
        "print ('Vocabulary size: {}'.format(text_encoder.vocab_size))\n",
        "\n",
        "train_data, valid_data = pad_generator(data_generator=train_data, \n",
        "                                       max_len=MAX_LEN, \n",
        "                                       valid_split=True, \n",
        "                                       test=0.3)\n",
        "\n",
        "test_data = pad_generator(data_generator=test_data, \n",
        "                                       max_len=MAX_LEN)"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\u001b[1mDownloading and preparing dataset imdb_reviews (80.23 MiB) to /root/tensorflow_datasets/imdb_reviews/subwords8k/1.0.0...\u001b[0m\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "587e3dcf092346fea5ccaea95820434a",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=1, bar_style='info', description='Dl Completed...', max=1, style=ProgressStyl…"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "4d451f618f974192b039c42532e7ccc2",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=1, bar_style='info', description='Dl Size...', max=1, style=ProgressStyle(des…"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "df464c03fc2f458a85ed0ae0e73c5051",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=1, bar_style='info', max=1), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\rShuffling and writing examples to /root/tensorflow_datasets/imdb_reviews/subwords8k/1.0.0.incompleteC05WFF/imdb_reviews-train.tfrecord\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "a6e3161d5346447d84576cf58cc6e388",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=0, max=25000), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\r"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "2c74eec70d7f4d38b4d1899f6458ce29",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=1, bar_style='info', max=1), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\rShuffling and writing examples to /root/tensorflow_datasets/imdb_reviews/subwords8k/1.0.0.incompleteC05WFF/imdb_reviews-test.tfrecord\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "f2c53d6006734484a53b104067917913",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=0, max=25000), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\r"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "998de4867ba34068af1992fd7834f33c",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=1, bar_style='info', max=1), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\rShuffling and writing examples to /root/tensorflow_datasets/imdb_reviews/subwords8k/1.0.0.incompleteC05WFF/imdb_reviews-unsupervised.tfrecord\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "5e1ca30dc0064c7b8886e70b53f31919",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(IntProgress(value=0, max=50000), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\r\u001b[1mDataset imdb_reviews downloaded and prepared to /root/tensorflow_datasets/imdb_reviews/subwords8k/1.0.0. Subsequent calls will reuse this data.\u001b[0m\n",
            "Vocabulary size: 8185\n",
            "(25000, 500) (25000,)\n",
            "(25000, 500) (25000,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6CZFnObX2_pF",
        "colab_type": "text"
      },
      "source": [
        "### Prepare the data for training"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bq8liBE81mC-",
        "colab_type": "code",
        "outputId": "0d8ebf50-76d5-4889-c52f-362a9f068243",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 125
        }
      },
      "source": [
        "# batch padding\n",
        "train_batches = (train_data.shuffle(BUFFER_SIZE).batch(BATCH))\n",
        "valid_batches = (valid_data.shuffle(BUFFER_SIZE).batch(BATCH))\n",
        "test_batches = (test_data.shuffle(BUFFER_SIZE).batch(BATCH))\n",
        "\n",
        "# sample\n",
        "encodings, labels = next(iter(train_batches))\n",
        "\n",
        "print(\"Text:                  {}\".format(text_encoder.decode(encodings[0])))\n",
        "print(\"Encoding sample:       {}\".format(encodings[0][:10]))\n",
        "print(\"Label:                 {}\".format(labels[0]))\n",
        "print(\"Encoding batch shape:  {}\".format(encodings.shape))\n",
        "print(\"Labels batch shape:    {}\".format(labels.shape))"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Text:                  Picture the fugly annoying goth kids from college in a scat film, throw in a pinch of story and a whole lot of awful acting, and you are still not even close to how bad this movie is.<br /><br />Shot badly, bad effects, worse acting. Contrived attempt at shocking horror. Everyone I've showed this to gets kinda depressed watching it. The sex scenes are disturbing, not necessarily for their content, but more because they're just something you want to end as soon as possible. The last sex scene is just foul, even before she gets to the guy.<br /><br />I'm one of those people that loves to watch movies that people hate, which is why I picked this one up. But for your own sake, save yourself the time and avoid this abhorrence. It's that bad. I literally threw it in the garbage.\n",
            "Encoding sample:       [7369 7961    1 1587 3908   47 1517 4357  282  671]\n",
            "Label:                 0\n",
            "Encoding batch shape:  (1000, 500)\n",
            "Labels batch shape:    (1000,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MX47y3x96SWZ",
        "colab_type": "text"
      },
      "source": [
        "### Encoder\n",
        "\n",
        "The input is put through an encoder model which gives us the encoder output of shape (batch_size, max_length, hidden_size) and the encoder hidden state of shape (batch_size, hidden_size)."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Nfm6SEPkpigt",
        "colab_type": "code",
        "outputId": "3301ebc9-953a-491a-f783-4d819586f00a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 87
        }
      },
      "source": [
        "class Encoder(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):\n",
        "    super(Encoder, self).__init__()\n",
        "    self.batch_sz = batch_sz\n",
        "    self.enc_units = enc_units\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    self.gru = tf.keras.layers.GRU(self.enc_units,\n",
        "                                   return_sequences=True,\n",
        "                                   return_state=True,\n",
        "                                   recurrent_initializer='glorot_uniform')\n",
        "  def call(self, x, hidden):\n",
        "    x = self.embedding(x)\n",
        "    output, state = self.gru(x, initial_state = hidden)\n",
        "    return output, state\n",
        "\n",
        "  def initialize_hidden_state(self):\n",
        "    return tf.zeros((self.batch_sz, self.enc_units))\n",
        "\n",
        "encoder = Encoder(vocab_size=text_encoder.vocab_size, embedding_dim=100, enc_units=102, batch_sz=BATCH)\n",
        "\n",
        "initial_state = encoder.initialize_hidden_state()\n",
        "\n",
        "encoder_outputs, last_output = encoder(encodings, initial_state)\n",
        "\n",
        "print(\"encodings                {}\".format(encodings.shape))\n",
        "print(\"encoder_output           {}\".format(encoder_outputs.shape))\n",
        "print(\"last_state               {}\".format(last_output.shape))\n",
        "print(\"initialize_hidden_state  {}\".format(initial_state.shape))"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "encodings                (1000, 500)\n",
            "encoder_output           (1000, 500, 102)\n",
            "last_state               (1000, 102)\n",
            "initialize_hidden_state  (1000, 102)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TQo4CekVD2zc",
        "colab_type": "text"
      },
      "source": [
        "### CustomAttention - Fixed Padding"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "GmSiEGKkCADb",
        "colab_type": "code",
        "outputId": "61d84d5c-8570-498b-8833-07406ac0989f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 52
        }
      },
      "source": [
        "class CustomAttention(tf.keras.layers.Layer):\n",
        "  \"\"\"Implements CustomAttention attention scoring using small neural networks.\n",
        "  Works great for single classificaiton prediciton.\n",
        "  Add multiple dense layer to increase attention neural netowrk (a1, a2, etc.).\n",
        "\n",
        "  Temrinology:\n",
        "    'max_len' refers to sequence maximum length\n",
        "    'hidden_size' / 'query_depth' / 'alignments_size' refers to rnn_size.\n",
        "    'key' / 'keys' are 'encoder outputs' related values with \n",
        "      shape `[batch_size x max_len x hidden size]`\n",
        "    'query' / 'value'(s) refers to decoder values with \n",
        "      shape `[batch_size x hidden size]`\n",
        "\n",
        "  Source:\n",
        "  https://github.com/conversationai/conversationai-models/blob/master/attention-tutorial/Attention_Model_Tutorial.ipynb\n",
        "  \"\"\"\n",
        "  def __init__(self, max_len, rnn_size, attention_size):\n",
        "    \"\"\"Construct the AttentionMechanism.\n",
        "\n",
        "    Args:\n",
        "      max_len: sequence maximum length.\n",
        "      rnn_size: number of hidden units in rnn cell.\n",
        "      attention_size: The size of layer for neural network scoring prediciton.\n",
        "    \"\"\"\n",
        "\n",
        "    super(CustomAttention, self).__init__()\n",
        "    self.max_len = max_len\n",
        "    self.rnn_size = rnn_size\n",
        "    # attention layer\n",
        "    self.a1 = tf.keras.layers.Dense(units=attention_size, activation=tf.nn.relu)\n",
        "    # last layer that outputs scoring value\n",
        "    self.V = tf.keras.layers.Dense(1, activation=None)\n",
        "\n",
        "  def call(self, encoder_output):\n",
        "    \"\"\"Score based on the decoder and encoder outputs.\n",
        "\n",
        "    Args:\n",
        "      encoder_output: Tensor with shape `[batch_size, rnn_size]`\n",
        "    Returns:\n",
        "      context: The weighted average sum of encoder output with \n",
        "        shape `[batch_size, rnn_size]`\n",
        "      attention_weights: The attention with shape `[batch_size, max_len]`\n",
        "    \"\"\"\n",
        "    # concatenate sequences vertically\n",
        "    encoder_output = tf.concat(encoder_output, axis = 2)\n",
        "    # reshape to [batch_size*max_len, rnn_size]\n",
        "    intermediate_values = tf.reshape(encoder_output, [-1, self.rnn_size])\n",
        "    # feed to each layer\n",
        "    intermediate_values = self.a1(intermediate_values)\n",
        "    intermediate_values = self.V(intermediate_values)\n",
        "    # reshape to [batch_size, max_len, 1]\n",
        "    scores = tf.reshape(intermediate_values, [-1, self.max_len, 1])\n",
        "    attention_weights = tf.nn.softmax(logits=scores, axis=1)\n",
        "    context_vector = tf.reduce_sum(encoder_output * attention_weights, 1)\n",
        "    # match shape [batch_size, max_len]\n",
        "    attention_weights = tf.squeeze(attention_weights)\n",
        "    return context_vector, attention_weights\n",
        "\n",
        "\n",
        "custom_attn = CustomAttention(max_len=MAX_LEN, rnn_size=102, attention_size=10)\n",
        "\n",
        "context_vector, attention_weights = custom_attn(encoder_outputs)\n",
        "\n",
        "print(\"Attention result shape [context_vector]: (batch size, units) {}\".format(context_vector.shape))\n",
        "print(\"Attention weights shape: (batch_size, sequence_length, 1)    {}\".format(attention_weights.shape))"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Attention result shape [context_vector]: (batch size, units) (1000, 102)\n",
            "Attention weights shape: (batch_size, sequence_length, 1)    (1000, 500)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "n3spGXTyEr9V",
        "colab_type": "text"
      },
      "source": [
        "### CustomAttention - Batch Padding"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3KUwElfhaqLO",
        "colab_type": "code",
        "outputId": "55c2c88a-6a7d-4325-869d-3ff141c1313c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 52
        }
      },
      "source": [
        "class CustomAttention(tf.keras.layers.Layer):\n",
        "  \"\"\"Implements CustomAttention attention scoring using small neural networks.\n",
        "  Works great for single classificaiton prediciton.\n",
        "\n",
        "  Temrinology:\n",
        "    'max_len' refers to sequence maximum length\n",
        "    'hidden_size' / 'query_depth' refers to RNN size.\n",
        "    'key' / 'keys' are 'encoder outputs' related values with \n",
        "      shape `[batch_size x max_len x hidden size]`\n",
        "    'query' / 'value'(s) refers to decoder values with \n",
        "      shape `[batch_size x hidden size]`\n",
        "\n",
        "  Source:\n",
        "  https://github.com/conversationai/conversationai-models/blob/master/attention-tutorial/Attention_Model_Tutorial.ipynb\n",
        "  \"\"\"\n",
        "  def __init__(self, attention_size, attention_depth):\n",
        "    \"\"\"Construct the AttentionMechanism.\n",
        "\n",
        "    Args:\n",
        "      attention_size: The size of layer for neural network scoring prediciton.\n",
        "      attention_depth: The number of layer for neural network scoring prediciton.\n",
        "    \"\"\"\n",
        "\n",
        "    super(CustomAttention, self).__init__()\n",
        "    self.attention_depth = attention_depth\n",
        "    self.attention_size = attention_size\n",
        "    # last layer that outputs scoring value\n",
        "    self.V = tf.keras.layers.Dense(1, activation=None)\n",
        "\n",
        "  def call(self, encoder_output):\n",
        "    \"\"\"Score based on the decoder and encoder outputs.\n",
        "\n",
        "    Args:\n",
        "      encoder_output: Tensor with shape `[batch_size, rnn_size]`\n",
        "    Returns:\n",
        "      context: The weighted average sum of encoder output with \n",
        "        shape `[batch_size, rnn_size]`\n",
        "      attention_weights: The attention with shape `[batch_size, max_len]`\n",
        "    \"\"\"\n",
        "\n",
        "    # concatenate sequences vertically\n",
        "    encoder_output = tf.concat(encoder_output, axis = 2)\n",
        "    encoder_shape = encoder_output.shape\n",
        "    sequence_length = encoder_shape[1]\n",
        "    final_layer_size = encoder_shape[2]\n",
        "    # reshape to [batch_size*max_len, rnn_size]\n",
        "    x = tf.reshape(encoder_output, [-1, final_layer_size])\n",
        "    # feed to each layer\n",
        "    for _ in range(self.attention_depth-1):\n",
        "      x = tf.keras.layers.Dense(units=self.attention_size, activation=tf.nn.relu)(x)\n",
        "    x = self.V(x)\n",
        "    # reshape to [batch_size, max_len, 1]\n",
        "    scores = tf.reshape(x, [-1, sequence_length, 1])\n",
        "    attention_weights = tf.nn.softmax(logits=scores, axis=1)\n",
        "    context_vector = tf.reduce_sum(encoder_output * attention_weights, 1)\n",
        "    # match shape [batch_size, max_len]\n",
        "    attention_weights = tf.squeeze(attention_weights)\n",
        "    return context_vector, attention_weights\n",
        "\n",
        "custom_attn = CustomAttention(attention_size=10, attention_depth=2)\n",
        "\n",
        "context_vector, attention_weights = custom_attn(encoder_outputs)\n",
        "\n",
        "print(\"Attention result shape [context_vector]: (batch size, units) {}\".format(context_vector.shape))\n",
        "print(\"Attention weights shape: (batch_size, sequence_length, 1)    {}\".format(attention_weights.shape))"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Attention result shape [context_vector]: (batch size, units) (1000, 102)\n",
            "Attention weights shape: (batch_size, sequence_length, 1)    (1000, 500)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zYR86CRDCy8j",
        "colab_type": "text"
      },
      "source": [
        "### BahdanauAttention\n",
        "\n",
        "* FC = Fully connected (dense) layer\n",
        "* EO = Encoder output\n",
        "* H = hidden state\n",
        "* X = input to the decoder\n",
        "\n",
        "And the pseudo-code:\n",
        "\n",
        "* `score = FC(tanh(FC(EO) + FC(H)))`\n",
        "* `attention weights = softmax(score, axis = 1)`. Softmax by default is applied on the last axis but here we want to apply it on the *1st axis*, since the shape of score is *(batch_size, max_length, hidden_size)*. `Max_length` is the length of our input. Since we are trying to assign a weight to each input, softmax should be applied on that axis.\n",
        "* `context vector = sum(attention weights * EO, axis = 1)`. Same reason as above for choosing axis as 1.\n",
        "* `embedding output` = The input to the decoder X is passed through an embedding layer.\n",
        "* `merged vector = concat(embedding output, context vector)`\n",
        "* This merged vector is then given to the GRU"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LO8HIXBxxYh4",
        "colab_type": "code",
        "outputId": "7fcd837c-2212-431b-c163-efc06e553e6c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 52
        }
      },
      "source": [
        "class BahdanauAttention(tf.keras.layers.Layer):\n",
        "  \"\"\"Implements BahdanauAttention attention scoring.\n",
        "\n",
        "  Temrinology:\n",
        "    'max_len' refers to sequence maximum length\n",
        "    'rnn_size' / 'hidden_size' / 'query_depth' / 'alignments_size' refers \n",
        "      to RNN size.\n",
        "    'key' / 'keys' are 'encoder outputs' related values with \n",
        "      shape `[batch_size x max_len x hidden size]`\n",
        "    'query' / 'value'(s) refers to decoder values with \n",
        "      shape `[batch_size x hidden size]`\n",
        "\n",
        "  Source:\n",
        "  https://github.com/tensorflow/docs/blob/master/site/en/tutorials/text/nmt_with_attention.ipynb\n",
        "  \"\"\"\n",
        "  def __init__(self, units):\n",
        "    \"\"\"Construct the AttentionMechanism.\n",
        "\n",
        "    Args:\n",
        "      units: number of neurons in layer of neural network scoring aproximation.\n",
        "    \"\"\"\n",
        "    super(BahdanauAttention, self).__init__()\n",
        "    self.W1 = tf.keras.layers.Dense(units)\n",
        "    self.W2 = tf.keras.layers.Dense(units)\n",
        "    self.V = tf.keras.layers.Dense(1)\n",
        "\n",
        "  def call(self, decoder_input, encoder_output):\n",
        "    \"\"\"Score the query based on the decoder and encoder outputs.\n",
        "\n",
        "    Args:\n",
        "      decoder_input: Tensor with shape `[batch_size, rnn_size]`.\n",
        "      encoder_output: Tensor with shape `[batch_size, max_len, rnn_size]`\n",
        "    Returns:\n",
        "      context: The weighted average sum of encoder output with \n",
        "        shape `[batch_size, rnn_size]`\n",
        "      attention_weights: The attention with shape `[batch_size, max_len]`\n",
        "    \"\"\"\n",
        "    # decoder_input == (batch_size, hidden size)\n",
        "    # decoder_input to shape == (batch_size, 1, hidden size)\n",
        "    # we are doing this to perform addition to calculate the score\n",
        "    decoder_input = tf.expand_dims(decoder_input, 1)\n",
        "    # score shape == (batch_size, max_length, 1)\n",
        "    # we get 1 at the last axis because we are applying score to self.V\n",
        "    # the shape of the tensor before applying self.V is (batch_size, max_length, units)\n",
        "    score = self.V(tf.nn.tanh(self.W1(encoder_output) + self.W2(decoder_input)))\n",
        "    # attention_weights shape == (batch_size, max_length, 1)\n",
        "    attention_weights = tf.nn.softmax(score, axis=1)\n",
        "    # context_vector shape after sum == (batch_size, hidden_size)\n",
        "    context_vector = attention_weights * encoder_output\n",
        "    context_vector = tf.reduce_sum(context_vector, axis=1)\n",
        "    # match shape [batch_size, max_len]\n",
        "    attention_weights = tf.squeeze(attention_weights)\n",
        "    return context_vector, attention_weights\n",
        "\n",
        "\n",
        "## initial_state - might always be 0 because we use only deocder\n",
        "attention_layer = BahdanauAttention(10)\n",
        "context_vector, attention_weights = attention_layer(initial_state, encoder_outputs)\n",
        "\n",
        "print(\"Attention result shape [context_vector]: (batch size, units) {}\".format(context_vector.shape))\n",
        "print(\"Attention weights shape: (batch_size, sequence_length, 1)    {}\".format(attention_weights.shape))"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Attention result shape [context_vector]: (batch size, units) (1000, 102)\n",
            "Attention weights shape: (batch_size, sequence_length, 1)    (1000, 500)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iSZ4BT-I-wqD",
        "colab_type": "text"
      },
      "source": [
        "### LuongAttention"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "suQ0jwlE2AyL",
        "colab_type": "code",
        "outputId": "edf9430f-b06f-495d-f568-dc96e404a54f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 52
        }
      },
      "source": [
        "class LuongAttention(tf.keras.Model):\n",
        "  \"\"\"Implements Luong-style attention scoring.\n",
        "\n",
        "  Temrinology:\n",
        "    'max_len' refers to sequence maximum length\n",
        "    'hidden_size' / 'query_depth' / 'allignment_size' refers to RNN size.\n",
        "    'key' / 'keys' are 'encoder outputs' related values with \n",
        "      shape `[batch_size x max_len x hidden size]`\n",
        "    'query' / 'value'(s) refers to decoder values with \n",
        "      shape `[batch_size x hidden size]`\n",
        "\n",
        "  Implementation of all 3 variants: dot, general, concat.\n",
        "  Source:\n",
        "  https://github.com/ChunML/NLP/blob/master/machine_translation/train_luong_tf2.py\n",
        "  \"\"\"\n",
        "\n",
        "  def __init__(self, rnn_size, attention_func):\n",
        "    \"\"\"Construct the AttentionMechanism.\n",
        "\n",
        "    Args:\n",
        "      rnn_size: The hidden state size of RNN cell.\n",
        "      attention_func: The attention score function. Can be one of the following:\n",
        "        'dot' \n",
        "        'general'\n",
        "        'concat'\n",
        "    \"\"\"\n",
        "    super(LuongAttention, self).__init__()\n",
        "    self.attention_func = attention_func\n",
        "\n",
        "    if attention_func not in ['dot', 'general', 'concat']:\n",
        "      raise ValueError(\n",
        "      'Unknown attention score function! Must be either dot, general or concat.')\n",
        "    if attention_func == 'general':\n",
        "      # General score function\n",
        "      self.wa = tf.keras.layers.Dense(rnn_size)\n",
        "    elif attention_func == 'concat':\n",
        "      # Concat score function\n",
        "      self.wa = tf.keras.layers.Dense(rnn_size, activation='tanh')\n",
        "      self.va = tf.keras.layers.Dense(1)\n",
        "\n",
        "  def call(self, decoder_output, encoder_output):\n",
        "    \"\"\"Score the query based on the decoder and encoder outputs.\n",
        "\n",
        "    Args:\n",
        "      decoder_output: Tensor with shape `[batch_size, rnn_size]`.\n",
        "      encoder_output: Tensor with shape `[batch_size, max_len, rnn_size]`\n",
        "    Returns:\n",
        "      context: The weighted average sum of encoder output with \n",
        "        shape `[batch_size, rnn_size]`\n",
        "      alignment: The attention with shape `[batch_size, max_len]`\n",
        "    \"\"\"\n",
        "    \n",
        "    # match shape [batch_size, 1, rnn_size]\n",
        "    decoder_output = tf.expand_dims(decoder_output, 1)\n",
        "\n",
        "    if self.attention_func == 'dot':\n",
        "      # Dot score function: decoder_output (dot) encoder_output\n",
        "      # decoder_output has shape: (batch_size, 1, rnn_size)\n",
        "      # encoder_output has shape: (batch_size, max_len, rnn_size)\n",
        "      # => score has shape: (batch_size, 1, max_len)\n",
        "      score = tf.matmul(decoder_output, encoder_output, transpose_b=True)\n",
        "    elif self.attention_func == 'general':\n",
        "      # General score function: decoder_output (dot) (Wa (dot) encoder_output)\n",
        "      # decoder_output has shape: (batch_size, 1, rnn_size)\n",
        "      # encoder_output has shape: (batch_size, max_len, rnn_size)\n",
        "      # => score has shape: (batch_size, 1, max_len)\n",
        "      score = tf.matmul(decoder_output, self.wa(encoder_output), transpose_b=True)\n",
        "    elif self.attention_func == 'concat':\n",
        "      # Concat score function: va (dot) tanh(Wa (dot) concat(decoder_output + encoder_output))\n",
        "      # Decoder output must be broadcasted to encoder output's shape first\n",
        "      decoder_output = tf.tile(decoder_output, [1, encoder_output.shape[1], 1])\n",
        "      # Concat => Wa => va\n",
        "      # (batch_size, max_len, 2 * rnn_size) => (batch_size, max_len, rnn_size) => (batch_size, max_len, 1)\n",
        "      score = self.va(self.wa(tf.concat((decoder_output, encoder_output), axis=-1)))\n",
        "      # Transpose score vector to have the same shape as other two above\n",
        "      # (batch_size, max_len, 1) => (batch_size, 1, max_len)\n",
        "      score = tf.transpose(score, [0, 2, 1])\n",
        "    # attention_weights a_t = softmax(score)\n",
        "    attention_weights = tf.nn.softmax(score, axis=2)\n",
        "    # context vector c_t is the weighted average sum of encoder output\n",
        "    context = tf.matmul(attention_weights, encoder_output)\n",
        "    # match size [batch_size, max_len]\n",
        "    attention_weights = tf.squeeze(attention_weights)\n",
        "    # match size [batch_size, rnn_size]\n",
        "    context = tf.squeeze(context, 1)\n",
        "    return context, attention_weights\n",
        "\n",
        "\n",
        "## initial_state - might always be 0 because we use only deocder\n",
        "attention_layer = LuongAttention(rnn_size=102, attention_func='dot')\n",
        "context_vector, attention_weights = attention_layer(initial_state, encoder_outputs)\n",
        "\n",
        "print(\"Attention result shape [context_vector]: (batch size, units) {}\".format(context_vector.shape))\n",
        "print(\"Attention weights shape: (batch_size, sequence_length, 1)    {}\".format(attention_weights.shape))"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Attention result shape [context_vector]: (batch size, units) (1000, 102)\n",
            "Attention weights shape: (batch_size, sequence_length, 1)    (1000, 500)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FEGp84E96rfA",
        "colab_type": "text"
      },
      "source": [
        "### Decoder"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "-F8--ps96r6K",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "class Decoder(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):\n",
        "    super(Decoder, self).__init__()\n",
        "    self.batch_sz = batch_sz\n",
        "    self.dec_units = dec_units\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    self.gru = tf.keras.layers.GRU(self.dec_units,\n",
        "                                   return_sequences=True,\n",
        "                                   return_state=True,\n",
        "                                   recurrent_initializer='glorot_uniform')\n",
        "    self.fc = tf.keras.layers.Dense(vocab_size)\n",
        "\n",
        "    # used for attention\n",
        "    self.attention = BahdanauAttention(self.dec_units)\n",
        "\n",
        "  def call(self, x, hidden, enc_output):\n",
        "    # enc_output shape == (batch_size, max_length, hidden_size)\n",
        "    context_vector, attention_weights = self.attention(hidden, enc_output)\n",
        "\n",
        "    # x shape after passing through embedding == (batch_size, 1, embedding_dim)\n",
        "    x = self.embedding(x)\n",
        "\n",
        "    # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)\n",
        "    x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)\n",
        "\n",
        "    # passing the concatenated vector to the GRU\n",
        "    output, state = self.gru(x)\n",
        "\n",
        "    # output shape == (batch_size * 1, hidden_size)\n",
        "    output = tf.reshape(output, (-1, output.shape[2]))\n",
        "\n",
        "    # output shape == (batch_size, vocab)\n",
        "    x = self.fc(output)\n",
        "\n",
        "    return x, state, attention_weights"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Zj7V2qJ6HbYk",
        "colab_type": "text"
      },
      "source": [
        "### Regular Classification [word embeedings]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GPb81vrgHxsX",
        "colab_type": "text"
      },
      "source": [
        "#### Sequential Model + regular train"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ls-2WEi3HyNJ",
        "colab_type": "code",
        "outputId": "db4486dd-1742-442f-e677-70e998c52986",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "def model_predicitons(data_generator):\n",
        "  \"\"\"Predict on test data.\n",
        "  Make sure train_generator is already batched formatted.\n",
        "  \"\"\"\n",
        "  # models used\n",
        "  global model\n",
        "  y_pred = []\n",
        "  y_true = []\n",
        "  # make predicitons\n",
        "  for batch, (inputs_batch, labels_batch) in enumerate(data_generator):\n",
        "    preds_batch = model(inputs_batch)\n",
        "    preds_batch = tf.keras.backend.round(preds_batch)\n",
        "    [y_pred.append(val[0]) for val in preds_batch]\n",
        "    [y_true.append(val) for val in labels_batch]\n",
        "  return np.array(y_true), np.array(y_pred)\n",
        "\n",
        "model = tf.keras.Sequential()\n",
        "model.add(tf.keras.layers.Embedding(text_encoder.vocab_size, EMBEDDING_SIZE))\n",
        "model.add(tf.keras.layers.GlobalAveragePooling1D())\n",
        "model.add(tf.keras.layers.Dense(16, activation='relu'))\n",
        "model.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n",
        "\n",
        "model.summary()\n",
        "\n",
        "model.compile(optimizer='adam',\n",
        "              loss='binary_crossentropy',\n",
        "              metrics=['accuracy'])\n",
        "# use test as valid \n",
        "history = model.fit(train_batches,\n",
        "                    epochs=EPOCHS,\n",
        "                    validation_data=valid_batches,\n",
        "                    verbose=1)\n",
        "\n",
        "results = model.evaluate(test_batches, verbose=2)\n",
        "\n",
        "plt_history(history_dict=history.history)\n",
        "\n",
        "# evaluate\n",
        "y_true, y_pred = model_predicitons(test_data.batch(15000))\n",
        "print(classification_report(y_true, y_pred))"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "embedding_1 (Embedding)      (None, None, 100)         818500    \n",
            "_________________________________________________________________\n",
            "global_average_pooling1d (Gl (None, 100)               0         \n",
            "_________________________________________________________________\n",
            "dense_7 (Dense)              (None, 16)                1616      \n",
            "_________________________________________________________________\n",
            "dense_8 (Dense)              (None, 1)                 17        \n",
            "=================================================================\n",
            "Total params: 820,133\n",
            "Trainable params: 820,133\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "Train for 18 steps, validate for 8 steps\n",
            "Epoch 1/20\n",
            "18/18 [==============================] - 3s 175ms/step - loss: 0.6924 - accuracy: 0.5628 - val_loss: 0.6912 - val_accuracy: 0.6744\n",
            "Epoch 2/20\n",
            "18/18 [==============================] - 2s 130ms/step - loss: 0.6894 - accuracy: 0.6775 - val_loss: 0.6869 - val_accuracy: 0.7059\n",
            "Epoch 3/20\n",
            "18/18 [==============================] - 2s 127ms/step - loss: 0.6825 - accuracy: 0.7187 - val_loss: 0.6772 - val_accuracy: 0.7280\n",
            "Epoch 4/20\n",
            "18/18 [==============================] - 2s 130ms/step - loss: 0.6691 - accuracy: 0.7414 - val_loss: 0.6601 - val_accuracy: 0.7287\n",
            "Epoch 5/20\n",
            "18/18 [==============================] - 2s 128ms/step - loss: 0.6468 - accuracy: 0.7470 - val_loss: 0.6347 - val_accuracy: 0.7503\n",
            "Epoch 6/20\n",
            "18/18 [==============================] - 2s 127ms/step - loss: 0.6147 - accuracy: 0.7676 - val_loss: 0.6010 - val_accuracy: 0.7653\n",
            "Epoch 7/20\n",
            "18/18 [==============================] - 2s 129ms/step - loss: 0.5748 - accuracy: 0.7889 - val_loss: 0.5595 - val_accuracy: 0.7845\n",
            "Epoch 8/20\n",
            "18/18 [==============================] - 2s 127ms/step - loss: 0.5302 - accuracy: 0.8132 - val_loss: 0.5193 - val_accuracy: 0.8063\n",
            "Epoch 9/20\n",
            "18/18 [==============================] - 2s 132ms/step - loss: 0.4842 - accuracy: 0.8328 - val_loss: 0.4794 - val_accuracy: 0.8193\n",
            "Epoch 10/20\n",
            "18/18 [==============================] - 2s 127ms/step - loss: 0.4412 - accuracy: 0.8505 - val_loss: 0.4426 - val_accuracy: 0.8332\n",
            "Epoch 11/20\n",
            "18/18 [==============================] - 2s 128ms/step - loss: 0.4023 - accuracy: 0.8678 - val_loss: 0.4126 - val_accuracy: 0.8452\n",
            "Epoch 12/20\n",
            "18/18 [==============================] - 2s 128ms/step - loss: 0.3687 - accuracy: 0.8775 - val_loss: 0.3913 - val_accuracy: 0.8476\n",
            "Epoch 13/20\n",
            "18/18 [==============================] - 2s 127ms/step - loss: 0.3415 - accuracy: 0.8866 - val_loss: 0.3717 - val_accuracy: 0.8580\n",
            "Epoch 14/20\n",
            "18/18 [==============================] - 2s 129ms/step - loss: 0.3173 - accuracy: 0.8943 - val_loss: 0.3573 - val_accuracy: 0.8636\n",
            "Epoch 15/20\n",
            "18/18 [==============================] - 2s 129ms/step - loss: 0.2968 - accuracy: 0.9020 - val_loss: 0.3424 - val_accuracy: 0.8664\n",
            "Epoch 16/20\n",
            "18/18 [==============================] - 2s 128ms/step - loss: 0.2791 - accuracy: 0.9080 - val_loss: 0.3403 - val_accuracy: 0.8675\n",
            "Epoch 17/20\n",
            "18/18 [==============================] - 2s 128ms/step - loss: 0.2641 - accuracy: 0.9128 - val_loss: 0.3303 - val_accuracy: 0.8731\n",
            "Epoch 18/20\n",
            "18/18 [==============================] - 2s 126ms/step - loss: 0.2495 - accuracy: 0.9178 - val_loss: 0.3234 - val_accuracy: 0.8727\n",
            "Epoch 19/20\n",
            "18/18 [==============================] - 2s 126ms/step - loss: 0.2373 - accuracy: 0.9202 - val_loss: 0.3219 - val_accuracy: 0.8748\n",
            "Epoch 20/20\n",
            "18/18 [==============================] - 2s 125ms/step - loss: 0.2251 - accuracy: 0.9253 - val_loss: 0.3156 - val_accuracy: 0.8769\n",
            "25/25 - 1s - loss: 0.3441 - accuracy: 0.8570\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8AAAAFPCAYAAACCr6e/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3iUZdbH8e8hlEiRKlgwgMgqVZoI\nIhBQEdEF27o0O6KuZdXVVxRFRKOuvbHusq4dQWy7rg3XhYBgAxRRQYVFuoVepQTO+8c9gSEkISQz\nmUny+1zXXM7TzpyZ4Dxznucu5u6IiIiIiIiIlHblEp2AiIiIiIiISHFQASwiIiIiIiJlggpgERER\nERERKRNUAIuIiIiIiEiZoAJYREREREREygQVwCIiIiIiIlImqACWEsnMUsxso5mlxXLfRDKzI80s\n5vOSmdlJZrYwavk7M+tSkH0L8VpPmdkthT0+n7h3mdmzsY4rIiLJS+f6/Ypb4s/1IsWlfKITkLLB\nzDZGLVYGtgI7IsuXufuY/Ynn7juAqrHetyxw96NiEcfMBgOD3D09KvbgWMQWEZGSR+f65KFzvUje\nVABLsXD3XSelyFXHwe7+QV77m1l5d88qjtxERESk6HSul5JM/x7LDjWBlqQQaeL6spmNNbMNwCAz\n62Rmn5jZWjP70cweM7MKkf3Lm5mbWcPI8ouR7e+a2QYz+9jMGu3vvpHtp5rZ92a2zsweN7NpZnZh\nHnkXJMfLzGy+ma0xs8eijk0xs4fNbJWZLQB65fP5DDOzcTnWjTKzhyLPB5vZ3Mj7+V/kim1esZaa\nWXrkeWUzeyGS2zdAuxz73mpmCyJxvzGzPpH1LYEngC6RJmcroz7bEVHHXx5576vM7J9mdkhBPpt9\nMbMzI/msNbOJZnZU1LZbzGy5ma03s2+j3mtHM/s8sv5nM7u/oK8nIiJFp3O9zvX5nevz+5yz8zGz\nD8xstZn9ZGb/F/U6t0U+k/VmNsPMDrVcmpub2dTsv3Pk85wSeZ3VwK1m1sTMJkVeY2Xkc6sedXyD\nyHtcEdn+qJmlRnJuGrXfIWa22cxq5/V+JXFUAEsyORN4CagOvAxkAX8E6gCdCSeNy/I5fgBwG1AL\nWAzcub/7mlldYDxwY+R1fwA65BOnIDn2Jpxs2hBO9idF1l8B9ASOAY4Fzs3ndcYCp5tZlUie5YHf\n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\nq+10BlhEJA1oTmGpr9x9u5ldSVC4NgZmuvsyM7sZWOTuc9lV6JYAO4Cfuft6ADO7haCIBrjZ3Tck\n/1WISEOk4jf9RfM30hlgEZE0oDmFpT5z93nu3sPdD3P3qaG2G0PFLx6Y7O693b2fu88K23amux8e\nuj2QqtcgIpJM69evZ8CAAQwYMICDDjqITp06VS5/++23NYpx0UUX8eGHH+51nenTp1PYwLqc6Qyw\niEga0JzCIiIidVdhYcWgmMF0iLEOitm+fXsWL14MwJQpU2jRogXXXnstEFwnC8E1sO5Oo0aRz2k+\n8MC+vzO84oorok+yjtIZYBGRNKA5hUVEROqmisuYVq4EdyovY0rEidWPP/6YI488kvz8fPr06cPa\ntWsZP348eXl59OnTh5tvvrly3WOOOYbFixezfft22rRpw3XXXUdOTg5HHXUUX3wRTLd+ww03MG3a\ntMr1r7vuOgYPHswRRxzB66+/DsCWLVs466yz6N27N2effTZ5eXmVxXm4m266iSOPPJK+ffty+eWX\nV47M/NFHHzFy5EhycnLIzc2ltLQUgN/85jf069ePnJwcCpLY5U0FsIhIGtCcwiIiInVTsi9j+uij\nj5g0aRIlJSV06tSJW2+9lUWLFlFcXMxzzz1HSUnJHtts2rSJ448/nuLiYo466ihmzpwZMba789Zb\nb/H73/++spi+++67OeiggygpKeGXv/xltdMUXX311SxcuJD33nuPTZs28fTTTwMwbtw4Jk2aRHFx\nMa+//joHHnggTz31FPPnz+ett96iuLiYa665Jk6/nX1TASwikgby82HGDMjKAjMnKytY1gBYIiIi\n6S3ZlzF169aNvLy8yuVHH32U3NxccnNzef/99yMWwM2aNWP06NEADBo0qPIsbFVnnnnmHuu8+uqr\njB07FoCcnBz69OkTcdsXXniBwYMHk5OTw8svv8yyZcvYuHEjX331FaeffjoAGRkZZGZm8vzzz3Px\nxRfTrFkzANq1a1f7X0SUdA2wiEia0JzCIiIidU/XrkG350jtidC8efPK+8uXL+euu+7irbfeok2b\nNpx//vkRpwVq2rRp5f3GjRuzffv2iLH333//fa4TSXl5OVdeeSXvvPMOnTp14oYbbqj19ETJojPA\nIiL1jOYTFhERSZ5UXsb0n//8h5YtW9KqVSvWrl3LM8/Ef6r0YcOGMXv2bADee++9iGeYt27dSqNG\n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\nYII=\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.86      0.85      0.86     12500\n",
            "           1       0.86      0.86      0.86     12500\n",
            "\n",
            "    accuracy                           0.86     25000\n",
            "   macro avg       0.86      0.86      0.86     25000\n",
            "weighted avg       0.86      0.86      0.86     25000\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Vn17XbWeIxGk",
        "colab_type": "text"
      },
      "source": [
        "#### Sequential Model + gradient tape\n",
        "\n",
        "\n",
        "Need signature if each batch different shape:\n",
        "```python\n",
        "@tf.function(input_signature=[\n",
        "     tf.TensorSpec(shape=[None, None], dtype=tf.int64),\n",
        "     tf.TensorSpec(shape=[None,], dtype=tf.int64)])\n",
        "```\n",
        "\n",
        "\n",
        "\n",
        "**Notes:**\n",
        "\n",
        "* Apply with logits if we apply optimizer to values coming form softmax\n",
        "* if sequence varies, use funcion signature and specify exact tensor shape and dtype\n",
        "* Specify Global Scope variables that will be used in functions"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "S5VYo9hiIz4U",
        "colab_type": "code",
        "outputId": "673ba308-fb8a-4706-8642-03f6ac805477",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 867
        }
      },
      "source": [
        "class Classification(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, emb_size):\n",
        "    super(Classification, self).__init__()\n",
        "    self.emb_layer = tf.keras.layers.Embedding(vocab_size, emb_size)\n",
        "    self.avg_layer = tf.keras.layers.GlobalAveragePooling1D()\n",
        "    self.l1 = tf.keras.layers.Dense(units=16, activation=tf.nn.relu)\n",
        "    self.l2 = tf.keras.layers.Dense(units=1, activation=tf.nn.sigmoid)\n",
        "    return\n",
        "\n",
        "  def call(self, input_batch):\n",
        "    intermediate_value = self.emb_layer(input_batch)\n",
        "    intermediate_value = self.avg_layer(intermediate_value)\n",
        "    intermediate_value = self.l1(intermediate_value)\n",
        "    output_batch = self.l2(intermediate_value)\n",
        "    return output_batch\n",
        "\n",
        "\n",
        "def loss_func(target, logits):\n",
        "  bce = tf.losses.BinaryCrossentropy(from_logits=False)\n",
        "  return bce(y_true=target, y_pred=logits)\n",
        "\n",
        "@tf.function\n",
        "def train_batch(input_batch, label_batch):\n",
        "  # use global scope variables\n",
        "  global model, model_optimizer, model_metrics\n",
        "  loss = 0\n",
        "  with tf.GradientTape() as tape:\n",
        "    preds_batch = model(input_batch)\n",
        "    loss = loss_func(label_batch, preds_batch)\n",
        "    acc = model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "  variables = model.variables\n",
        "  gradients = tape.gradient(loss, variables)\n",
        "  model_optimizer.apply_gradients(zip(gradients, variables))\n",
        "  return loss, acc\n",
        "\n",
        "def model_predicitons(data_generator):\n",
        "  \"\"\"Predict on test data.\n",
        "  Make sure train_generator is already batched formatted.\n",
        "  \"\"\"\n",
        "  # models used\n",
        "  global model\n",
        "  y_pred = []\n",
        "  y_true = []\n",
        "  # make predicitons\n",
        "  for batch, (inputs_batch, labels_batch) in enumerate(data_generator):\n",
        "    preds_batch = model(inputs_batch)\n",
        "    preds_batch = tf.keras.backend.round(preds_batch)\n",
        "    [y_pred.append(val[0]) for val in preds_batch]\n",
        "    [y_true.append(val) for val in labels_batch]\n",
        "  return np.array(y_true), np.array(y_pred)\n",
        "\n",
        "EPOCHS = 20\n",
        "history_dict = {'accuracy':[],\n",
        "                'val_accuracy':[], \n",
        "                'loss':[], \n",
        "                'val_loss':[]}\n",
        "\n",
        "with tf.device('/device:GPU:0'):\n",
        "  \n",
        "  model = Classification(vocab_size=text_encoder.vocab_size, emb_size=EMBEDDING_SIZE)\n",
        "  model_optimizer = tf.optimizers.Adam()\n",
        "  model_metrics = tf.metrics.Accuracy()\n",
        "\n",
        "  for epoch in range(EPOCHS):\n",
        "    epoch_time = 0\n",
        "\n",
        "    # train data\n",
        "    loss_epoch = 0\n",
        "    acc_epoch = 0\n",
        "\n",
        "    for batch, (encodings_batch, labels_batch) in enumerate(train_batches, start=1):\n",
        "      start_time = time.time()\n",
        "      # train on batch\n",
        "      loss_batch, acc_batch = train_batch(encodings_batch, labels_batch)\n",
        "      # keep track of loss and accuracy\n",
        "      loss_epoch += loss_batch\n",
        "      acc_epoch += acc_batch\n",
        "      end_time = time.time()\n",
        "      epoch_time += (end_time - start_time)\n",
        "        \n",
        "    batch_time = epoch_time / batch\n",
        "    loss_epoch = tf.get_static_value(loss_epoch) / batch\n",
        "    history_dict['loss'].append(loss_epoch)\n",
        "    acc_epoch = tf.get_static_value(acc_epoch) / batch\n",
        "    history_dict['accuracy'].append(acc_epoch)\n",
        "\n",
        "    # validation data\n",
        "    val_acc_epoch = 0\n",
        "    val_loss_epoch = 0\n",
        "\n",
        "    for batch, (encodings_bacth, labels_batch) in enumerate(valid_batches, start=1):\n",
        "      preds_batch = model(encodings_bacth)\n",
        "\n",
        "      val_loss_epoch += loss_func(labels_batch, preds_batch)\n",
        "      val_acc_epoch += model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "    val_loss_epoch = tf.get_static_value(val_loss_epoch) / batch\n",
        "    history_dict['val_loss'].append(val_loss_epoch)\n",
        "\n",
        "    val_acc_epoch = tf.get_static_value(val_acc_epoch) / batch\n",
        "    history_dict['val_accuracy'].append(val_acc_epoch)\n",
        "\n",
        "    print('Epoch: %s/%s loss: %.4f acc: %.4f val_loss: %.4f val_acc: %.4f\\tTime epoch: %.2f batch: %.2f'%(epoch+1, \n",
        "                                                                                                        EPOCHS, \n",
        "                                                                                                        loss_epoch, \n",
        "                                                                                                        acc_epoch, \n",
        "                                                                                                        val_loss_epoch, \n",
        "                                                                                                        val_acc_epoch,\n",
        "                                                                                                        epoch_time,\n",
        "                                                                                                        batch_time))    \n",
        "plt_history(history_dict)\n",
        "\n",
        "# evaluate\n",
        "y_true, y_pred = model_predicitons(test_data.batch(15000))\n",
        "print(classification_report(y_true, y_pred))"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 1/20 loss: 0.6921 acc: 0.5129 val_loss: 0.6903 val_acc: 0.5243\tTime epoch: 2.89 batch: 0.16\n",
            "Epoch: 2/20 loss: 0.6872 acc: 0.5221 val_loss: 0.6829 val_acc: 0.5345\tTime epoch: 2.13 batch: 0.12\n",
            "Epoch: 3/20 loss: 0.6758 acc: 0.5392 val_loss: 0.6675 val_acc: 0.5466\tTime epoch: 2.13 batch: 0.12\n",
            "Epoch: 4/20 loss: 0.6550 acc: 0.5488 val_loss: 0.6426 val_acc: 0.5535\tTime epoch: 2.21 batch: 0.12\n",
            "Epoch: 5/20 loss: 0.6230 acc: 0.5555 val_loss: 0.6076 val_acc: 0.5597\tTime epoch: 2.20 batch: 0.12\n",
            "Epoch: 6/20 loss: 0.5822 acc: 0.5609 val_loss: 0.5673 val_acc: 0.5643\tTime epoch: 2.22 batch: 0.12\n",
            "Epoch: 7/20 loss: 0.5360 acc: 0.5646 val_loss: 0.5244 val_acc: 0.5676\tTime epoch: 2.19 batch: 0.12\n",
            "Epoch: 8/20 loss: 0.4886 acc: 0.5680 val_loss: 0.4834 val_acc: 0.5710\tTime epoch: 2.16 batch: 0.12\n",
            "Epoch: 9/20 loss: 0.4444 acc: 0.5715 val_loss: 0.4481 val_acc: 0.5742\tTime epoch: 2.14 batch: 0.12\n",
            "Epoch: 10/20 loss: 0.4048 acc: 0.5747 val_loss: 0.4172 val_acc: 0.5773\tTime epoch: 2.13 batch: 0.12\n",
            "Epoch: 11/20 loss: 0.3710 acc: 0.5780 val_loss: 0.3919 val_acc: 0.5801\tTime epoch: 2.13 batch: 0.12\n",
            "Epoch: 12/20 loss: 0.3419 acc: 0.5804 val_loss: 0.3737 val_acc: 0.5822\tTime epoch: 2.14 batch: 0.12\n",
            "Epoch: 13/20 loss: 0.3188 acc: 0.5824 val_loss: 0.3589 val_acc: 0.5841\tTime epoch: 2.15 batch: 0.12\n",
            "Epoch: 14/20 loss: 0.2981 acc: 0.5843 val_loss: 0.3462 val_acc: 0.5860\tTime epoch: 2.20 batch: 0.12\n",
            "Epoch: 15/20 loss: 0.2787 acc: 0.5861 val_loss: 0.3362 val_acc: 0.5879\tTime epoch: 2.20 batch: 0.12\n",
            "Epoch: 16/20 loss: 0.2633 acc: 0.5879 val_loss: 0.3290 val_acc: 0.5892\tTime epoch: 2.17 batch: 0.12\n",
            "Epoch: 17/20 loss: 0.2498 acc: 0.5894 val_loss: 0.3215 val_acc: 0.5906\tTime epoch: 2.16 batch: 0.12\n",
            "Epoch: 18/20 loss: 0.2365 acc: 0.5906 val_loss: 0.3182 val_acc: 0.5918\tTime epoch: 2.15 batch: 0.12\n",
            "Epoch: 19/20 loss: 0.2250 acc: 0.5916 val_loss: 0.3135 val_acc: 0.5925\tTime epoch: 2.17 batch: 0.12\n",
            "Epoch: 20/20 loss: 0.2141 acc: 0.5925 val_loss: 0.3138 val_acc: 0.5935\tTime epoch: 2.33 batch: 0.13\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8AAAAFPCAYAAACCr6e/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3jUZfb38fehSBcEFZWSoCISEGkC\nLrpUWWzYXSCoqIi6Kq783BUVG8qqa8GyrI/IWmm6tkVEsUBQd1ERRBAQQQxNVER6k5Dz/HFPYAhJ\nSMhMJuXzuq65zLedOTPBzJzv3czdERERERERESntyiU6AREREREREZGioAJYREREREREygQVwCIi\nIiIiIlImqAAWERERERGRMkEFsIiIiIiIiJQJKoBFRERERESkTFABLCWSmZU3s81m1jCW5yaSmR1r\nZjFfl8zMuptZetT2IjM7NT/nHsBzjTaz2w70+jzi3mdmz8c6roiIFF/6rC9Q3BL/WS9SVCokOgEp\nG8xsc9RmVWAHsCuyfbW7jy1IPHffBVSP9bllgbs3iUUcMxsA9HP3zlGxB8QitoiIlDz6rC8+9Fkv\nkjsVwFIk3H33h1LkruMAd/8gt/PNrIK7ZxRFbiIiIlJ4+qyXkkz/HssOdYGWYiHSxfVlMxtvZpuA\nfmZ2spl9ambrzWy1mT1hZhUj51cwMzez5Mj2mMjxd8xsk5nNMLNGBT03cvx0M/vWzDaY2ZNm9l8z\n659L3vnJ8WozW2Jm68zsiahry5vZCDNba2ZLgZ55vD+3m9mEbPtGmtmjkZ8HmNnCyOv5LnLHNrdY\nK82sc+Tnqmb2UiS3+UCbbOcONbOlkbjzzaxXZP8JwD+AUyNdzn6Jem/vjrr+mshrX2tmb5rZkfl5\nb/bHzM6L5LPezKaaWZOoY7eZ2Q9mttHMvol6rR3MbHZk/09m9lB+n09ERApPn/X6rM/rsz6v9zkr\nHzP7wMx+NbMfzeyvUc9zR+Q92WhmX5jZUZZDd3Mz+yTr9xx5Pz+KPM+vwFAza2xm0yLP8UvkfasZ\ndX1S5DWuiRx/3MwqR3JuGnXekWa21czq5PZ6JXFUAEtxch4wDqgJvAxkADcChwIdCR8aV+dxfV/g\nDqA2sBy4t6DnmtnhwCvAXyLP+z3QLo84+cnxDMKHTSvCh333yP5rgR7AicBJwMV5PM944CwzqxbJ\nswJwEeH9AvgJOBM4GLgKeNLMWuQRL8swoAFwdCTPy7Id/zbyumoCw4FxZlbX3ecB1wMfu3t1dz80\ne2Az6xGJfyFQD/gByN79Lbf3JleRD5iXgBuAw4APgIlmVtHMmhHe/9bufjBwOuH3C/Ak8FBk/7HA\nq/t7LhERiTl91ueurH/W5/o+R4rQD4C3gCOB44C0yHV/iTx/T6AWMADYntcbEuV3wELC94kHAQPu\nA44AUgjv2R2RHCoAbwNLgGTCe/qKu28n/HvqFxW3LzDF3dfmMw8pQiqApTj5xN3fcvdMd9/m7jPd\n/TN3z3D3pcAooFMe17/q7l+4+07CH9+WB3DuWcAcd/9P5NgI4JfcguQzx/vdfYO7pxP+WGc918XA\nCHdfGfkD+UAez7MU+Bo4J7LrNGCdu38ROf6Wuy/1YCrwIZDj5BfZXAzc5+7r3H0Z4U5v9PO+4u6r\nI7+TcUA60DYfcQFSgdHuPify4TAE6GRm9aPOye29yUtvYKK7T438jh4gfGi3J3x4VgaaWejK9H3k\nvQPYCTQ2szruvsndP8vn6xARkdjRZ33uz1OmP+v38z73Apa7++PuvsPdN7r755FjA4Db3H1x5DXM\ncfdf85n/cnd/yt13Rf49fuvuH7r7b+7+M+HfRlYOJxOK81vcfUvk/P9Gjr0A9DUzi2xfQrhZL8WQ\nCmApTlZEb5jZ8Wb2dqSby0bCHcZ97j5G+THq563kPRlGbuceFZ2HuzuwMrcg+cwxX88FLMsjXwh3\ngPtEfu7LnjvCmNlZZvZZpMvOesLd5rzeqyxH5pWDmfU3s68iXXvWA8fnMy6E17c7nrtvBNYR7hBn\nKcjvLLe4mYTfUT13XwT8H+H38LOFbnZHRE69nHA3d5GZfW5mZ+TzdYiISOzosz5vZfazfj/vcwPg\nu1xyyOvY/mT/93iEmb1iZqsiOTyfLYd0DxOu7SVSCGcAp5hZc6AhobVYiiEVwFKcZF8W4GnCndBj\nI91W7yR0TYmn1cDuu5aRO3n1cj+9UDmuJvwxzbK/pRteAbqbWT3C3eFxkRyrELrz3g/UdfdawHv5\nzOPH3HIws6OBpwjdt+pE4n4TFXd/yzj8ACRFxasBHAKsykdeBYlbjvA7WwXg7mPcvSPQCChPeF9w\n90Xu3hs4HHgEeM3MKhcyFxERKRh91uetLH/W5/U+rwCOyeW63I5tieRUNWrfEdnOyf76HiTMXn5C\nJIf+2XJIMrPyueTxIqEb9CWErtE7cjlPEkwFsBRnNYANwJbIuM+8xgTFyiSgtZmdHRnrcSNhXEg8\ncnwF+LOZ1YtMknBLXie7+4/AJ4S7kYvcfXHkUCXgIGANsMvMzgK6FSCH28ysloW1E6+POlad8MGw\nhvD94CrCXeEsPwH1LWqCimzGA1eaWQszq0T40P7Y3XO9y16AnHuZWefIc/8F2AR8ZmZNzaxL5Pm2\nRR6ZhBdwiZkdGmkx3hB5bZmFzEVERApHn/VRyvhnfV7v80SgoZldb2aVzOxgM8satz0auM/MjrGg\npZnVJhT+PxLGHZc3s4FEFet55LAF2GBmDYCbo47NANYCf7MwsVgVM+sYdfwlwljkvoRiWIopFcBS\nnP0fYaKGTYS7gi/H+wnd/Sfgj8CjhD9yxwBfEu4GxjrHpwjjd+YBM8nfpEzjgO5EdYly9/XATcAb\nwK+EP76T8pnDXYS70+nAO0T9wXb3uYSJoz6PnNMEiB43+z6wGPjJzKK7N2Vd/y6h+9IbkesbEsYK\nFYq7zye8508RPrB7Ar0i47gqAX8njOX6kXAX+vbIpWcACy3MPPow8Ed3/62w+YiISKHos35fZfWz\nPtf32d03EMZEX0Aoyr9lz9jch4A3Ce/zRsLY4cqRru1XAbcRvhccm+215eQuwoRoGwhF92tROWQQ\nxo83JbQGLyf8HrKOpxN+zzvc/X8FfO1ShCz82xCRnES6ufwAXOjuHyc6HxEREYktfdZLrJjZi8BS\nd7870blI7tQCLJKNmfWMdBOqRJj6fifhzqiIiIiUAvqsl1iLjKc+B3g20blI3lQAi+zrFGApoXvt\nH4DzNJGBiIhIqaLPeokZM7sf+Ar4m7svT3Q+kjd1gRYREREREZEyQS3AIiIiIiIiUiaoABYRERER\nEZEyoUKiEyioQw891JOTkwsdZ8uWLVSrVq3YxIllLOVUtHFiGUs5FW2cWMZSTkUbZ9asWb+4e17r\ndkoZpe8JRRcnlrGUU9HGiWUs5VS0cWIZqzTnlOf3BHcvUY82bdp4LEybNq1YxYllLOVUtHFiGUs5\nFW2cWMZSTkUbB/jCi8Fnkh7F76HvCUUXJ5axlFPRxollLOVUtHFiGas055TX9wR1gRYREREREZEy\nQQWwiIiIiIiIlAkqgEVERERERKRMiOskWGbWE3gcKA+MdvcHsh0fAXSJbFYFDnf3WvHMSUTKtp07\nd7Jy5Uq2b98OQM2aNVm4cGGh48YqTixjlYacKleuTP369alYsWKhn1tEREQkbgWwmZUHRgKnASuB\nmWY20d0XZJ3j7jdFnX8D0Cpe+YiIAKxcuZIaNWqQnJyMmbFp0yZq1KhR6LixihPLWCU9J3dn7dq1\nrFy5kkaNGhX6uUVERETi2QW6HbDE3Ze6+2/ABOCcPM7vA4yPYz4iImzfvp06depgZolORfbDzKhT\np87u1noRERGRwopnF+h6wIqo7ZVA+5xONLMkoBEwNZfjA4GBAHXr1iUtLa3QyW3evLlYxYllLOVU\ntHFiGUs5xT9OzZo12bx58+7tXbt2sWnTpkLnFKs4sYxVWnLavn17zP4NioiISNkW1zHABdAbeNXd\nd+V00N1HAaMA2rZt6507dz7gJxo7Fm6/HZYvdxo2NIYPh9TUAw5HWloahcknHrGUU9HGiWUs5RT/\nOAsXLtyrC25Rd+1du3Yt3bp1A+DHH3+kfPnyHHZYWKf9888/56CDDtpvrMsvv5whQ4bQpEmTXM8Z\nOXIklSpVYsCAAQV8Jfs65ZRTePDBB+nYsWOhYx3I+125cmVatdIIGRERESm8eBbAq4AGUdv1I/ty\n0hu4Lo65AKH4HTgQtm4FMJYtC9tQuCJYREqvPTfNoGFDCn3TrE6dOsyZMweAu+++m+rVq3PzzTfv\ndY67k5mZSblyOY9See655/b7PNddd13MWn9FRERESot4jgGeCTQ2s0ZmdhChyJ2Y/SQzOx44BJgR\nx1yA8CU2FL97bN0a9ouIZJd102zZMnBn902zsWNj/1xLliwhJSWF1NRU2rVrx+rVqxk4cCBt27al\nWbNmDBs2bPe5p5xyCnPmzCEjI4NatWoxZMgQTjzxRE4++WR+/vlnAIYOHcrIkSN3nz9kyBDatWtH\nkyZN+N///gfAli1buOCCC0hJSeHCCy+kbdu2u4vz3IwZM4YTTjiB5s2bc9tttwGQkZHBJZdcsnv/\nE088AcCIESNISUmhRYsW9OvXL+bvmYiIiJRc7vDjjzB1Kjz5JFx7Ldx4Y0tWrNj/tYURtxZgd88w\ns+uBKYRlkJ519/lmNgz4wt2ziuHewAR393jlkmX58pz3L1tW8Fh7WoU6xaRVSESKn7xumsXj//dv\nvvmGF198kSZNmlCjRg0eeOABateuTUZGBl26dOHCCy8kJSVlr2s2bNhAp06deOCBBxg8eDDPPvss\nQ4YM2Se2u/P5558zceJEhg0bxrvvvsuTTz7JEUccwWuvvcZXX31F69at88xv5cqVDB06lC+++IKa\nNWvSvXt3Jk2axGGHHcYvv/zCvHnzAFi/fj0Af//731m2bBkHHXTQ7n0iIiJStmQVugsWwPz5e//3\n11/3nFeuHGRm1qR9e3joofjVVnEdA+zuk4HJ2fbdmW377njmEK1hw9yL3RNPhHbt9jyaNYMKubw7\n6kotUjbkdtMst/2Fdcwxx9C2bdvdXZfHjx/Pv/71LzIyMvjhhx9YsGDBPgVwlSpVOP300wFo06YN\nH3/8cY6xzz///N3npKenA/DJJ59wyy23AHDiiSfSrFmzPPP77LPP6Nq1K4ceeigAffv25aOPPuKW\nW25h0aJFDBo0iDPPPJMePXoA0KxZM/r168c555zDueeeewDviIiIiJQU7rB6dc6F7rp1e8475JBQ\na110EaSkhGsefxy2bQMwVq+Ob21VXCbBKhLDh0cXrkGlSnD66eENf+01GD067K9SBVq33rsobtQI\nzIq+VUhEEiO3m2YNG8bn+apVq7b758WLF/P444/z+eefU6tWLfr165fjckAHHXTQ7p/Lly9PRkZG\njrErVaq033MOVJ06dZg7dy7vvPMOI0eO5LXXXmPUqFFMmTKF6dOnM3HiRP72t78xd+7cmD6viIiI\nFK0tW2DFitAYEP3fmTNbsXIlRHf4ql07FLp//GModJs1C/+tWzfUVFmSk7OK3z3iWVuVqQI46w3M\nbRZod/juO5g5Ez7/PDyeegpGjAjH69SBk07KvRU5Xq1CIpIYOd00q1o17I+3jRs3UqNGDQ4++GBW\nr17NlClT6NmzZ0yfo2PHjrzyyiuceuqpzJs3jwULFuR5fvv27bn55ptZu3YtNWvWZMKECdx8882s\nWbOGypUrc9FFF9G4cWMGDBjArl27WLlyJV27duWUU06hQYMGbM1+51BERESKjZ074Ycf9hS1ORW6\n0V2WIRSy5crBrl0HU706XHop9O8fCt3DD9+70M1NUfe4K1MFMIRiNzUV0tKm77OMihkce2x49OkT\n9u3cCV9/HYrhrMI4N/FqFRKRxNj7pllsZoHOr9atW5OSksLxxx9PUlJSTJYgyu6GG27g0ksvJSUl\nZfejZs2auZ5fv3597r33Xjp37oy7c/bZZ3PmmWcye/ZsrrzyStwdM+PBBx8kIyODvn37smnTJjIz\n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\nuxC+06emQlradDp37nxgQUQtwMVZixbw+eehGP7nP6F1a5g1K+dzY3mHSUTiq3r16nTp0oUrrrhi\nr8mvNmzYwOGHH07FihWZNm0ay5YtyzPO73//e8aNGwfA119/zdy5cwHYuHEj1apVo2bNmvz000+8\n8847u6+pUaNGjuNsTz31VN588022bt3Kli1beOONNzj11FML/Npq1qzJIYccsrv1+KWXXqJTp05k\nZmayYsUKfv/73/Pggw+yYcMGNm/ezHfffccJJ5zALbfcwkknncQ333xT4OcUERE5UL/9Flpxr7kG\n6tWDU04Jy5Ued1xYd3fChBmsWAETJsANN4Tv4/ntrKRxu8WTWoCLucqVQ3foM86Ayy6DDh3CWsK3\n3MJe4xZjfYdJROKrT58+nHfeeXvNCJ2amsrZZ59Nhw4daNeu3X5bQq+99louv/xymjZtStOmTXe3\nJJ944om0atWKNm3akJSURMeOHXdfM3DgQHr27MlRRx3FtGnTdu9v3bo1/fv3p127dgAMGDCAVq1a\n5dndOTcvvPAC11xzDVu3buXoo4/mueeeY9euXfTr149169ZhZgwaNIhatWpxxx13MG3aNMqVK0ez\nZs04/fTTC/x8IiIiBbF5M7z7bmjlfftt2LABqlUL37fPOy/8t2bNcG5a2o68g+VB43aLJxXAJUS3\nbmEcwjXXhFbdyZPhpZegUaNwvGFDyKmxSHeYRIqnc889N2ud090OPfRQZsyYwaZNm/bpTr1582Yg\nzNr89ddfA1ClSpV9llTK8vzzz+cY54YbbuCGG27YvR1d4A4ePJjBgwfvdX7W82W1Gt988805Pt/d\nd9+9++eWLVvy6aef7nPOJ598sk9OTz75ZI7xREREYmntWnjrrVD0vvcebN8OderA+eeHord7d6hS\nZc/5Y8eG79zLl3eiYcNQtBZ0WGHW+SGO07ChHVAciS11gS5BDjkkdL946aVQDJ94YhiE7x7+p8w+\nPlh3mERERESkrFqxIqzJ27Ur1K0Ll18OX34ZWmWnTYMff4Rnn4Wzz963+B04MDQuue+ZW+dAJpgt\n62vuFkcqgEsYszAx1ty50KoV9O8PF10EPXtqZjgRERERKdu++QbGjm1Iu3ahJ+SgQaHQveUWmDkz\nFLWPPw6dO+c+lldz65Ru6gJdQiUlwdSpYXzw0KHwv//B88+HO0yaGU5EREREygJ3+OKLPTM3h7kU\nj6ZdO7j//tC9uUmTgsXU3DqlmwrgEqx8efjrX+G000Kr8B/+EO5ynXGGGvZF8uLumFmi05B8yD5O\nWkREJCMDPvooFLxvvgkrV4bvxZ06wXXXQd26M7joopMPOL7m1indVCmVAq1ahTtfgwaFadv/9KfW\n/PRTorMSKZ4qV67M2rVrVQu7L1YAACAASURBVFiVAO7O2rVrqVy5cqJTERGRBNu2Df7znzD8r27d\nMEHs6NHQpk3oBfnTT3DFFfDww/DHP3YgOfnAxuyC5tYp7dQCXEpUqRLGM/TsCeefX4XOnUMX6SOP\nTHRmIsVL/fr1WblyJWvWrAFg+/btMSmwYhUnlrFKQ06VK1emfv36hX5eEREpedatC8sUvfFGWLZo\n61aoVQvOOit0bf7DH8LyRbBn4qowdnfPxFWg2ZtlbyqAS5nTT4cHH5zLbbe12l0E16uX6KxEio+K\nFSvSKGv9MCAtLY1WrVoVOm6s4sQyVmnPSURESp8ffggtvW+8EWZqzsgIDTqXXRaK3s6doWLFfa/L\na+KqAylcU1PDQ3PrlD4qgEuhFi02MGVKKIY7dQp/PBo0SHRWIiIiIiL7+uabUPS++GIrFiwI+xo3\nhsGDQ9Hbrh2U28/ATU1cJfmlAriU6tgxLPL9hz/sKYKTkhKdlYiIiIiUdbt2waefhqL3P/+Bb78N\n+xs3Lse994aiNyUlLP+ZX5q4SvJLk2CVYh06wPvvw6+/hiL4++8TnZGIiIiIlEXbtsHEiXDllXDU\nUXDKKTBiRGig+cc/QkvtqFGzGDoUmjUrWPELmrhK8k8twKVcu3bw4YdhqaSsMcHHHJPorERERESk\ntFuzBiZNCq28770XiuCDD4YzzoBevcJwvVq19pz/3XcH/lyauErySy3AZUCbNqEI3rw5FMFLliQ6\nIxEREREpjRYvDksRnXoqHHFEWJpo1qzw3/feC0Xx+PHQp8+e4nfsWEhOhq5dOxVq+aLUVEhPh6lT\np5OeruJXcqYCuIxo1Sq0/m7fHrpDZ421yE2s/hCJiIiISOmVmRnG8956axi3e9xx8Je/wKZNMHRo\nKH6XLw/dnE87DQ46aO/rs5YvWrYM3PcsX6TvnhIv6gJdhpx4YpgMq2vXPRNjHX/8vufFch01ERER\nESld3OHzz2HMGBg37mR+/RXKlw/fL6+5JnRvTk7OX6xYL18ksj9qAS5jmjeHtLTwh6tzZ5g/f99z\n8vpDJCIiIiJl07ffwl13hSWKOnSAZ56B5s03MmZM6Nr84YcwaFD+i1/Q8kVS9FQAl0EpKaEILlcO\nunSBefP2Pq4/RCIiIiIC8NNP8PjjYWLVJk3g3ntDgfvss+HYPffMJzUVDjnkwOLntkyRli+SeFEB\nXEYdfzxMnx7GYXTpAl99teeY/hCJiIiIlF2bNsFLL0HPnmHJoj//GTIywuRWK1bABx/A5ZdDzZqF\nfy4tXyRFTQVwGda4cSiCq1YN44Jnzw779YdIRERiycx6mtkiM1tiZkNyON7fzNaY2ZzIY0DUsb+b\n2XwzW2hmT5gVdHVQEcmPnTvh7bfD7Mx168Kll8KiRTBkSBgyN3s2/N//Qb164fxYztw8alRYD9jM\nSUoK2xr/K/GiSbDKuGOOCUVwly7QrRu8/77WURMRkdgxs/LASOA0YCUw08wmuvuCbKe+7O7XZ7v2\nd0BHoEVk1ydAJyAtrkmLlBHuMGNGKF5feQV++QVq14bLLoN+/eB3v4OcbjnFesLU1NTwSEubTufO\nnQvxikT2Ty3AQqNGYUxwrVrQvTt89pnWURMRkZhpByxx96Xu/hswATgnn9c6UBk4CKgEVAR+ikuW\nImXI4sXw7LPJHHssdOwYxvN27QoTJ8Lq1fDUU2F/bv0tNGGqlGQqgAUIXVimT4c6dcIabTNmJDoj\nEREpJeoBK6K2V0b2ZXeBmc01s1fNrAGAu88ApgGrI48p7r4w3gmLlFYzZsC554a1eseOTeKYY+D5\n58NkVi+/DGefve86vTnRhKlSkqkLtOzWsOGe7tA9esA77yQ6IxERKSPeAsa7+w4zuxp4AehqZscC\nTYH6kfPeN7NT3f3j6IvNbCAwEKBu3bqkpaUVOqHNmzcXqzixjKWcijZOLGMdSJzMTPj00zpMmNCA\nefNqcfDBO7n00lV067aYhg0rAnvmgcmvww/vwE8/Vc5h/3bS0j4tWLAo+t0VbazSnlNuVADLXurX\n31ME9+wJ999/MBqKISIihbAKaBC1XT+ybzd3Xxu1ORr4e+Tn84BP3X0zgJm9A5wMfJzt+lHAKIC2\nbdt6LMYQpqWlxWQsYqzixDKWciraOLGMVZA4v/0G48bBQw/BggWhoePxx+HKKytSrVoyaWnpB5zT\nI49EjwEOqlaFRx6pXKjXqd9d0cYq7TnlRl2gZR9HHRWK4Hr14PbbT+CbbxKdkYiIlGAzgcZm1sjM\nDgJ6AxOjTzCzI6M2ewFZ3ZyXA53MrIKZVSRMgKUu0CJ52LgxLFd09NFhqaKKFcOkVUuWwKBBUK1a\n4Z9DMzdLSRbXAnh/yx5EzrnYzBZEljgYF898JP+OOALefRcqVHB69oQff0x0RiIiUhK5ewZwPTCF\nULy+4u7zzWyYmfWKnDYo8j3gK2AQ0D+y/1XgO2Ae8BXwlbu/VaQvQKSEWL06LFnUoAH85S/QpEn4\nLvfll9C3byiEIbbLF2nCVCmJ4tYFOj/LHphZY+BWoKO7rzOzw+OVjxRco0Zw//3zGDy4DWeeGVqF\nq1dPdFYiIlLSuPtkYHK2fXdG/Xwr4ftA9ut2AVfHPUGREmzRotDi++KLkJEBF14YCuC2bfc9N9bL\nF4mURPFsAc7PsgdXASPdfR2Au/8cx3zkADRpsol//xu++gouuigski4iIiIiifXpp3D++dC0KYwZ\nA1deGYrhl1/OufgFLV8kAvGdBCunZQ/aZzvnOAAz+y9QHrjb3d/NHkizOyYmTlas6tXT+POfj+SR\nR5pw7rmrufnmRbmuC1dUORXH90k5FV0s5VS0cWIZqyhmdxQRKa0yM2HSJPj73+Hjj+GQQ2DoULj+\nejg8H/0otXyRSOJnga4ANAY6E2aF/MjMTnD39dEnaXbHxMSJjtW5M1SpAvfddyQdOhzJHXckPqfi\nEieWsZRT0caJZSzlVLRxRETKksxMeOUVuPXWk0hPDzM6P/ZYaPUtyPC0hg1h2bKc94uUFfHsAr3f\nZQ8IrcIT3X2nu38PfEsoiKUYGjYMLr0U7rwzLJouIiIiIvHjDm+9Ba1aQZ8+Yd9LL4UZnW+8seBz\nswwfHpYrila1atgvUlbEswDe77IHwJuE1l/M7FBCl+ilccxJCsEMnnkGuneHq66C995LdEYiIiIi\npdOHH8LJJ0OvXmGc7tixMHr0TPr12zOjc0Fp+SKROBbA+Vz2YAqw1swWANOAv7j72njlJIV30EHw\n2muQkgIXXABz5iQ6IxEREZHSY8YM6No1NDisWhUaHxYsCEsZlS9f+PhavkjKuriOAc7HsgcODI48\npIQ4+GCYPBk6dIAzzgizEGrsiIiIiMiB++qrMKHVpElhQqvHHoOrr4bKlROdmUjpEs8u0FKK1asH\n77wTuuScfjqsW5fzebFabF1ERESkNFq0CHr3hpYt4ZNPwnjc774LY3xV/IrEngpgOWDNm8Obb4aJ\nGM49F3bs2Pt41mLry5aB+57F1lUEi4iISFm3bBlccUUYVjZpUliL9/vv4bbb9p3cSg0KIrGjAlgK\npXPnMCP0Rx/BZZeFafqzaLF1ERERkb39+CPccAM0bgzjxsGgQbB0Kdx3H9Sqte/5alAQiS0VwFJo\nffrAgw/Cyy/DkCF79muxdREREZHg11/D96Sjj4annoLLL4fFi2HEiDDmNzdqUBCJrbhOgiVlx1/+\nEu5MPvQQNGgQ7mxqsXUREREp6zZtghdeSOL118PPffvC3XfDscfm73o1KIjEllqAJSbM4Ikn4Jxz\nwqQNb7yhxdZFRESk7NqxI3w3OvpoeP75RnTrBnPnwpgx+S9+IfeGAzUoiBwYFcASM+XLh7Es7dqF\nu5tHH63F1kVERKRsycwM34eaNg2NAi1awFNPzeL118MEogWlBgWR2FIBLDFVtSq89RbUrw9nnw0n\nnaTF1kVERKRseP99aNs2fN+pWROmTIEPPoDjj990wDFTU9WgIBJLKoAl5g47LKwRbBbWCP7550Rn\nJCIiIhI/s2dDjx7hsW5d6OY8a1bYNit8/NRUNSiIxIoKYImLY48Na9qtXg1nnQXbtumfmoiIiJQu\nS5eGYV9t2oQieMQI+OabUKCW01cfkWJJ/2tK3LRvDxMmhDug996bwq5dic5IREREpPDWrAnje48/\nHt58MyxJ9N138Oc/Q6VKic5ORPKiAljiqlevMAPijBmH7rVGsIiIiEhJs3kz3HsvHHMMjBwZ1vJd\nsgTuuy+M+c1u7FhIToauXTuRnBy2RSSxVABL3F13HZxzzioefhheeCHR2YiIiIgUzM6d8P/+Xxji\ndeed0L07fP01PP00HHVUzteMHQsDB8KyZeBuLFsWtlUEiySWCmApEtdfv4SuXcMf/v/9L9HZiIiI\niOyfO7z2Wli+6NproXHj8D3m9ddD9+e83H47bN26976tW8N+EUkcFcBSJCpUcP79b2jQAM47D5Yv\nT3RGIiIiIrmbM6cmHTrAhRdChQowcSJ89BGcfHL+rs/tu46+A4kklgpgKTK1a4c1grdvh3POgS1b\nEp2RiIjEm5n1NLNFZrbEzPaZDcLM+pvZGjObE3kMiOzvErVvjpltN7Nzi/4VSFmzeHH4nnLTTa34\n4Qd49lmYOxfOPrtgSxo1bFiw/SJSNFQAS5Fq2hTGj4evvoLLLoPMzERnJCIi8WJm5YGRwOlACtDH\nzFJyOPVld28ZeYwGcPdpWfuArsBW4L2iyl3KnnXrYPBgaNYMpk2Dq65ayrffhomuypcveLzhw6Fq\n1b33Va0a9otI4qgAliJ3xhnw0ENhTM2wYYnORkRE4qgdsMTdl7r7b8AE4JwDiHMh8I67b93vmSIF\nlJEB//xnGN/72GPhBv2330LfvsupUuXA46amwqhRkJQEZk5SUthOTY1d7iJScCqAJSEGD4b+/eGe\ne+Df/050NiIiEif1gBVR2ysj+7K7wMzmmtmrZtYgh+O9gfHxSFDKtilT4MQTw4oVJ5wAs2fDM8/A\nEUfEJn5qKqSnw9Sp00lPV/ErUhxUSHQCUjaZheUEvv023Gk95hho3TrRWYmISAK8BYx39x1mdjXw\nAqHLMwBmdiRwAjAltwBmNhAYCFC3bl3S0tIKndTmzZuLVZxYxlJOsHx5Vf75z2P47LM6HHXUNu69\n9zs6dvyF9esh61K9T0UbJ5axlFPRxollrFjmlBsVwJIwlSqFZQROOilMNjFzZuzuuIqISLGwCohu\n0a0f2bebu6+N2hwN/D1bjIuBN9x9Z25P4u6jgFEAbdu29c6dOxci5SAtLY3iFCeWscpyTr/+Gnqf\njRwJ1arBww/D9ddXoVKl5gnLKRFxYhlLORVtnFjGKu055UZdoCWh6tYNywr8+mtYHmn79kRnJCIi\nMTQTaGxmjczsIEJX5onRJ0RaeLP0AhZmi9EHdX+WQtq5E554Ao49Fv7xD7jqqjDb8//9X7ghLyJl\nhwpgSbiWLeHFF+HTT2HgwLDovIiIlHzungFcT+i+vBB4xd3nm9kwM+sVOW2Qmc03s6+AQUD/rOvN\nLJnQgjy9KPOW0sMdJk8O43tvvBHatIE5c+Cpp+Dww3O+ZuxYSE6Grl07kZwctkWk9FAXaCkWLrgg\ndEm66y5o3hz++tdEZyQiIrHg7pOBydn23Rn1863Arblcm07Ok2aJ7Nf8+aGFd8oUOO44eOstOPPM\nvNfyHTs23IzfuhXAWLYsbIMmsBIpLdQCLMXGHXfAxRfDkCEwadK+x3VHVkRERPZnw4aKXHddmN35\ns89gxAiYNw/OOivv4hfg9tuzit89tm4N+0WkdFALsBQbZvDcc7BkCfTpE7pEN2sWjumOrIiIiORl\nx44wudWdd7Zn+3a49lq4+26oUyf/MZYvL9h+ESl51AIsxUrVqvCf/0D16tCrF/zyS9ivO7IiIiKS\nk8zMcKP8+ONDl+dmzTYwdy48+WTBil+Ahg0Ltl9ESh4VwFLs1K8Pb74Jq1bBhRfCb7/pjqyIiIjs\n6/33oW1b6NcPDjkE3nsPHnxwHikpBxZv+PBwMz5a1aphv4iUDiqApVhq3x5Gj4bp02HQIGjQIOfz\ndEdWRESk7PnyS+jRIzzWrYMxY+CLL+C00woXNzUVRo2CpCQwc5KSwraGW4mUHiqApdjq1w9uuQWe\nfhq6dNEdWRERkbIuPR0uuQRat4ZZs+DRR+Gbb0KBWi5G32pTU8PzTJ06nfR0Fb8ipY0KYCnWhg8P\nszaOGRNagnVHVkREpOxZuzaM723SBF59NawY8d13cNNNUKlSorMTkZJEs0BLsVa+fJjY4ne/Cy3B\nn30Gq1ZNp3PnzolOTUREROJs2zZ44gm4/37YtAkuuwyGDQvzhYiIHAi1AEuxd/DBMHFi6Np09tmw\nebPu24iIiJRmu3aFpRGPOy609p5yCnz1FTz7rIpfESkcFcBSIhx9NLz2WujudPfdKezcmeiMRERE\nJNbcYfJkaNkSrrgCjjwS0tJg0iRo3jzva8eOheRk6Nq1E8nJYVtEJDsVwFJidOoUukHPmlWba68N\nH5IiIiJSOsycCV27wplnwvbt8MorYehTp077v3bsWBg4EJYtA3dj2bKwrSJYRLJTASwlyhVXwCWX\npPOvf4XxQCIiIlKyrVgB99yTQrt2MH8+PPlk+O9FF4FZ/mLcfjts3br3vq1bw34RkWgaTCklzuWX\np7NrVzK33x66OvXtm+iMRERE5EC89174HN+ypQ533AE33xzm/iio5csLtl9Eyi61AEuJYxYmwfj9\n7+Hyy+HjjxOdkYiIiBREZmaYzblnzzDOd9SoLxg27MCKX4CGDQu2X0TKLhXAUiJVqgRvvAGNGsG5\n58KiRYnOSERERPJj7dowzveuu6BfP/j0U2jQYFuhYg4fDlWr7r2vatWwX0QkmgpgKbFq1w4zRZYv\nD2ecAWvWJDojERERycvMmdC6NUydCv/v/8ELL0C1aoWPm5oKo0ZBUhKYOUlJYTs1tfCxRaR0UQEs\nJdrRR4c1gn/4AXr1gm2Fu4EsIiIiceAOTz0V1vM1g//+F66+Ov+TXOVHaiqkp8PUqdNJT1fxKyI5\nUwEsJV6HDjBmTFgq4ZJLwrgiERERKR62bAmfz3/6E3TrBrNmQdu2ic5KRMoqFcBSKlxwATz8MLz2\nGtxyS6KzEREREQhzdLRvD+PGwb33wqRJUKdOorMSkbIsrgWwmfU0s0VmtsTMhuRwvL+ZrTGzOZHH\ngHjmI6XbTTfBddeFQvippxKdjYiISNn26quhpfenn2DKFBg6FMqp6UVEEixuf4bMrDwwEjgdSAH6\nmFlKDqe+7O4tI4/R8cpHSj8zeOwxOOssuP76MEGWiIiIFK2dO8NN6YsugubNYfZsOO20nM8dOxaS\nk6Fr104kJ4dtEZF4iud9uHbAEndf6u6/AROAc+L4fCJUqADjx8OJJ8LFF8OXXyY6IxERkbJj1Sro\n0iXckL7hBpg+HRo0yPncsWNh4EBYtgzcjWXLwraKYBGJpwpxjF0PWBG1vRJon8N5F5jZ74FvgZvc\nfUX2E8xsIDAQoG7duqSlpRU6uc2bNxerOLGMpZzgttsO4rrrWnPaacY//zmbww/fkfCcijJOLGMp\np6KNE8tYpT0nKRnMrCfwOFAeGO3uD2Q73h94CFgV2fWPrB5hZtYQGA00ABw4w93TiyZzKaipU6FP\nnzDp1fjx0Lt33ufffjts3br3vq1bw37N4Cwi8RLPAjg/3gLGu/sOM7saeAHomv0kdx8FjAJo27at\nd+7cudBPnJaWRnGKE8tYyilo0iQst3DffSfzySdw8MGJz6mo4sQylnIq2jixjFXac5LiL2o41GmE\nG+EzzWyiuy/IdurL7n59DiFeBIa7+/tmVh3QPP/FUGYmPPhgGOPbpAmkpUHTpvu/bvnygu0XEYmF\neHaBXkW4Y5ulPnvu7gLg7mvdPatpbjTQJo75SBlzwglhVuiFC8M4pJ07E52RiEiZc8DDoSLzhlRw\n9/cB3H2zu2/dz2VSxDZtqsA558Btt4WhR59/nr/iF6Bhw4LtFxGJhXgWwDOBxmbWyMwOAnoDE6NP\nMLMjozZ7AQvjmI+UQd27w9NPw3vvhfUH3TXhhohIEcppOFS9HM67wMzmmtmrZpZ18/w4YL2ZvW5m\nX5rZQ5EWZSkmvvwSrr66DVOmwBNPhKWOqlfP//XDh0PVqnvvq1o17BcRiZe4dYF29wwzux6YQhj3\n86y7zzezYcAX7j4RGGRmvYAM4Fegf7zykbLriivg++/hvvtg48awBmEYc7Rnwg3QeCMRkbyY2Q3A\nGHdfF+PQuQ2HqgCcCrQClgMvE74n/CuH3DRXSBHH+eqrmtxySwtq1IDHHptNSspGpk8vWIx69eCm\nmw5n9Oij+fnnShx++A4GDFhKvXo/U5j0itP7FOtYyqlo48QylnIq2jh5iesYYHefDEzOtu/OqJ9v\nBW6NZw4iAMOGwdKl4e50dppwQ0QkX+oSxvDOBp4Fpri77+eafA2HitocDfw98vNKYI67LwUwszeB\nDuRQAGuukKKNM2NGGO/bqBEMHz6b88/veMCxOncON6j35JQSeRy44vI+xSOWciraOLGMpZyKNk5e\ntBy5lAlm8OyzuR/XhBsiInlz96FAY0IB2h9YbGZ/M7Nj8risMMOhZgK1zOywyHZXIPvkWVLEZs2C\n00+HI46ADz+E2rU1wYaIlCwqgKXMqFQJ6tfP+Zgm3BAR2b9Ii++PkUcGcAjwqpn9PZfzM4Cs4VAL\ngVeyhkNFhkBBGA4138y+AgYRGQ7l7ruAm4EPzWweYMAzcXtxsl9z50KPHnDIIWHJo6OOSnRGIiIF\nl+hlkESK1AMPwIABsH37nn2acENEZP/M7EbgUuAXQlflv7j7TjMrBywG/prTdYUZDhWZAbpFTF6A\nFMrChWFiySpVQvHboMH+rxERKY5UAEuZkjXO9+ab4ccfnQoVjPvv1/hfEZF8qA2c7+7Lone6e6aZ\nnZWgnKQILFkC3bpBuXKh+G3UKNEZiYgcOHWBljInNRVWr4aRI7+katWwdMOKFfu/TkSkjHuHsGID\nAGZ2sJm1B3B3LWNYSqWnQ9eusHNnGPN73HGJzkhEpHBUAEuZlZKykffegzVroEsXFcEiIvvxFLA5\nantzZJ+UUitXhpbfTZvg/fehWbNEZyQiUngqgKVMa9+e3UVw584qgkVE8mDRyx65eyYaSlVq/fhj\nKH7XrAmfky1bJjojEZHYUAEsZV779uHO9tq1oQjWkkgiIjlaamaDzKxi5HEjsDTRSUns/fJLmPBq\n1Sp45x046aREZyQiEjsqgEWAdu3CHW4VwSIiuboG+B2wClgJtAcGJjQjibl16+C00+C77+Ctt6Bj\nx0RnJCISWyqARSLatQstwb/+GorgZcv2e4mISJnh7j+7e293P9zd67p7X3f/OdF5Sexs3Ag9e8KC\nBfDmm2F+jNyMHQvJydC1ayeSk8O2iEhJkK+xO2Z2DLDS3XeYWWfCmnwvuvv6eCYnUtROOikUwaed\nForgtDRISkp0ViIiiWdmlYErgWZA5az97n5FwpKSmNm8Gc44A2bPhtdfhz/8Ifdzx46FgQNh61YA\nY9mysA1aVlBEir/8tgC/Buwys2OBUUADYFzcshJJoJNOgg8+gPXr1RIsIhLlJeAI4A/AdKA+sCmh\nGUlMbNsGvXrBjBkwfjycfXbe599+e1bxu8fWrWG/iEhxl98CONPdM4DzgCfd/S/AkfFLSySx2rbd\nuwhOT090RiIiCXesu98BbHH3F4AzCeOApQTbsQPOPz/0eHrxRbjwwv1fk9s8GZo/Q0RKgvwWwDvN\nrA9wGTApsq9ifFISKR7atAlF8IYNKoJFRICdkf+uN7PmQE3g8ATmI4W0cydcfDG8+y4880z+uy83\nbFiw/SIixUl+C+DLgZOB4e7+vZk1InSFEinVsorgjRtVBItImTfKzA4BhgITgQXAg4lNSQ5URkYo\neCdOhJEj4cor83/t8OFQtere+6pWDftFRIq7fBXA7r7A3Qe5+/jIh18Nd9eHnpQJrVvvKYI7dYLv\nv090RiIiRcvMygEb3X2du3/k7kdHZoN+OtG5ScHt2gWXXw7//jc88gj86U8Fuz41FUaNCpNEmjlJ\nSWFbE2CJSEmQrwLYzNLM7GAzqw3MBp4xs0fjm5pI8ZFVBG/aFFqCVQSLSFni7pnAXxOdhxReZiaM\nGHEcY8aEFtvBgw8sTmpq6BU1dep00tNV/IpIyZHfLtA13X0jcD5h+aP2QPf4pSVS/LRuDR9+GJaK\n6NwZli5NdEYiIkXqAzO72cwamFntrEeik5KC+etf4e23j+KOO+C22xKdjYhI0ctvAVzBzI4ELmbP\nJFgiZU6rViqCRaTM+iNwHfARMCvy+CKhGUmBjBwZujyfd95K7rkn0dmIiCRGfgvgYcAU4Dt3n2lm\nRwOL45eWSPHVsmUogrdsCUXwd98lOiMRkfhz90Y5PI5OdF6SP5MmwaBBYY3f665bglmiMxIRSYwK\n+TnJ3f8N/DtqeylwQbySEinuWraEqVPhlFOgSRPYtasTSUlhPJXGQYlIaWRml+a0391fLOpcpGBm\nz4bevUMvpvHjYebMRGckIpI4+SqAzaw+8CTQMbLrY+BGd18Zr8REiruvvw7LSOzaBWAsWwYDB4Zj\nKoJFpBQ6KernykA3wsSYKoCLsRUr4KyzoE4deOstqFYt0RmJiCRWvgpg4DlgHHBRZLtfZN9p8UhK\npCS4/XbYvn3vfVu3hv0qgEWktHH3G6K3zawWMCFB6Ug+bNgAZ5wRhuz8739w5JGJzkhEJPHyOwb4\nMHd/zt0zIo/ngcPimJdIsbd8ec77ly0r2jxERBJkC9Ao0UlIznbuhIsugm++gddfh2bNEp2RiEjx\nkN8CeK2Z9TOz8pFHP2BtPBMTKe4aNsz92I03ZnWNFhEpHczsLTObGHlMAhYBbyQ6L9mXO1x7Lbz/\nPowaBd26JTojEZHiFGYHkAAAIABJREFUI78F8BWEJZB+BFYDFwL945STSIkwfDhUrbr3vipV4PTT\n4Ykn4IILQpdoEZFS4mHgkcjjfuD37j5kfxeZWU8zW2RmS8xsn/PNrL+ZrTGzOZHHgKhju6L2T4zl\niynNHngA/vUvGDoULr880dmIiBQv+SqA3X2Zu/dy98Pc/XB3PxfNAi1lXGpquLOelARmTlISPPMM\nTJ4MTz4ZJhvp3Bl++inRmYqIxMRy4DN3n+7u/yX0DkvO6wIzKw+MBE4HUoA+ZpaSw6kvu3vLyGN0\n1P5tUft7xeZllG7jx8Ntt0HfvjBsWKKzEREpfvLbApyTwTHLQqSESk2F9HSYOnU66el7Jr+6/np4\n440wU/TJJ4cxWCLy/9u77/io6uz/469D6BCpgkoLa0F6C8VFJIAF1AXbrmDcFRvKigXLVxRXEWVl\nVRTbz12Wta1BdHVRWREbRGwooIICFtSAFBGxEQMoeH5/3AkMYQLJ1JT38/GYR+Z+5t4zZ8Jlcs+9\nn/v5SDn3H+DXsOUdhE2RWIyewEp3/9zdfyYYNGtogvKr9F57DUaMgKOOggceQHP9iohEEEsBrK9V\nkb0YMgRefTUYffO3v4X581OdkYhITKqGilgAQs+r72ObZsCXYctrQm1FnWpmS83sSTNrEdZe08wW\nmdkCMzsp6swrgU8+gZNOgtatgxOwNWqkOiMRkbKppNMgReJxy0KkgurRAxYsCKahOOYYeOghGD48\n1VmJiERlo5kNcfdnAcxsKPBNHOLOAh5z921mdgHwMDAg9Ford19rZr8B5prZB+7+WdEAZjYSGAnQ\ntGlTcnNzY04qPz+/TMXZW6zvv6/GRRd1Y8eONP7yl3dZunTrnhsDL7/chGnTfsPXX/ejSZOtnHfe\n5xx99NcJySlVceIZSzklN048Yymn5MaJZ6x45lScvRbAZraZyIWuAbUSkpFIBdO6NbzxBpx8cnBP\nVl4ejB2rrmkiUu5cCOSY2b2h5TXAn/axzVog/Ipu81DbTu4ePqvENODWsNfWhn5+bma5QFdgjwLY\n3acCUwEyMzM9Kytr359mH3JzcylLcYqLtWVLMMrzt9/C3LlwxBG9I26bkwN33rlrcMYNG2py553t\naNu2XUxz15eX31Mq48QzlnJKbpx4xlJOyY2zN3vtAu3u6e6+X4RHurvHcvVYpFJp2BBefDEogK+9\nFi64ALZvT3VWIiIl5+6fuXtvgsGs2rn7b9195T42Wwgcamatzaw6MAzYbTRnMzswbHEIsCLU3sDM\naoSeNwb6AMvj82kqhl9/hbPOgrfegn//Oxhzojjjxu05M0FBQdAuIlKZxHIPsIiUQo0awQHKtdcG\no0X/7neweXOqsxIRKRkz+6uZ1Xf3fHfPDxWoN+9tG3ffDowGXiAobJ9w92VmNsHMCkd1vsTMlpnZ\nEuASdk2z2BZYFGqfB0xydxXAYa65Bv7zH7jtNjjttL2vu3p16dpFRCoqXcUVSaIqVYL5gzMyYNSo\nYKTO//0PmkUaEkZEpGwZ7O7XFi64+3dmdjxw3d42cvfZwOwibdeHPb8GuCbCdm8CHWNNuqL6xz/g\n1luDvyVXXLHv9Vu2hFWrIreLiFQmugIskgLnnx8UvitXQu/e8MEHqc5IRGSf0gq7JAOYWS1AYw2n\nwJw5cNFFwQCLd99dsjElJk6E2rV3b6tdO2gXEalMVACLpMigQcGcjb/+Cn36wEsvpTojEZG9ygFe\nMbNzzew84CWCEZsliZYsgd//Hjp2hBkzoGoJ+/JlZ8PUqdCqFZg5rVoFy7EMgCUiUh6pABZJoS5d\ngmmSMjKCM/mzZx+Q6pRERCJy978BNxPcm9uG4L7eVilNqpLZuLEGJ5wA9eoFvYjS00u3fXZ2MBPB\n3Lmvkpen4ldEKicVwCIp1qJFcCW4f3+47bbDOess+PHHVGclIhLRBoLpEX9PMFfvitSmU3ls3gzX\nXNORH3+E2bM1doSISLRUAIuUAfXqBQc0Z52Vx6OPBleG33or1VmJiICZHWZmN5jZR8A9wGrA3L2/\nu9+7j80lDtxh2DD44os6/Oc/0KlTqjMSESm/VACLlBFVq8KIEXnMnx8c7PTtCzfeqPmCRSTlPiK4\n2nuiux/p7vcAO1KcU6Xy3HPBSdJRoz7juONSnY2ISPmmAlikjOnTJxjk5IwzYPz4YKqkzz9PdVYi\nUomdAqwH5pnZP81sIFCCcYclHtyDk6GtW8NJJ61NdToiIuWeCmCRMiAnJxgIa8CAfmRkwKxZ8Mgj\n8NhjsHx50CX6kUeCAyERkWRy96fdfRhwODAPuAxoYmb3m9mxqc2u4nv+eVi0CK69FqpW1R8BEZFY\nqQAWSbGcHBg5ElatAndj1apgOScnuOdr6VLo2hXOOguGD4fvvkt1xiJSGbn7T+4+3d1/BzQH3gOu\nTnFaFVrh1d9WreBPf0p1NiIiFUNCC2AzG2RmH5vZSjMbu5f1TjUzN7PMROYjUhaNGwcFBbu3FRQE\n7QAtW8LcufDXv8JTT0HnzpCbm/Q0RUR2cvfv3H2quw9MdS4V2YsvwjvvBFd/q1dPdTYiIhVDwgpg\nM0sD7gMGA+2A4WbWLsJ66cClwNuJykWkLFu9et/taWlwzTXByNA1a8KAAcHyzz8nJ0cREUmuwqu/\nLVrAiBGpzkZEpOJI5BXgnsBKd//c3X8GZgBDI6x3E/A3YGsCcxEps1q2LHl7Zia89x6cdx5MmgS/\n/S18/HFi8xMRkeR7+eXgpOc11+jqr4hIPFVNYOxmwJdhy2uAXuErmFk3oIW7P2dmVxUXyMxGAiMB\nmjZtSm4c+n/m5+eXqTjxjKWckhsn1lhnntmE229vw7ZtaTvbatTYwZlnfkxu7tcRtznjDGjRojG3\n396GLl2q8Oc/r+TEE9djYeOyVrTfUyLixDOWckpuHJGKrPDqb/PmcM45qc5GRKRiSWQBvFdmVgW4\nAxixr3XdfSowFSAzM9OzsrJifv/c3FzKUpx4xlJOyY0Ta6ysLGjbNrjnd/Vqp2VLY+LENLKz2xHc\nPVD8dueeG3SNu+OONnz2WRumTYPGjWPPKVxZ+T0lIk48Yymn5MYRqcjmzYM33oB774UaNVKdjYhI\nxZLILtBrgRZhy81DbYXSgQ5ArpnlAb2BZzUQllRG2dmQlwdz575KXl6wXBIHHQRz5sAddwRTZXTs\nGAyaIiIi5deNNwbf7+eem+pMREQqnkQWwAuBQ82stZlVB4YBzxa+6O4/uHtjd89w9wxgATDE3Rcl\nMCeRCqdKFRgzJhgptGFDOO64YPnnnzXLmYhIeZObC/Pnw9VXB4MeiohIfCXsCNndtwOjgReAFcAT\n7r7MzCaY2ZBEva9IZdW5MyxaBKNHw5Qp8Mc/9mTqVPjll1RnJiIiJTVhAhxwAJx/fqozERGpmBJ6\nicjdZ7v7Ye5+sLtPDLVd7+7PRlg3S1d/RWJTqxbcc08wb3Djxtu44AI4/HB4+GHYvj3V2YmIyN68\n9lpw/+/VVwff5yIiEn/qIylSAfXvD/fe+x7PPQf16gUDZXXoADNmwK+/pjo7ERGJ5MYboWlTGDky\n1ZmIiFRcKoBFKigzOP54WLwY/vtfqFoVhg+HLl1g5sxgmg0RESkb3ngDXnkFrroKatdOdTYiIhWX\nCmCRCs4MTj4ZliyB6dNh2zY45RTo0QNmz1YhLCJSFkyYAPvvDxdemOpMREQqNhXAIpVEWlpwBXjZ\nMnjwQdi0CU44Afr0Ce4ZFhGR1FiwIJjC7qqroE6dVGcjIlKxqQAWqWSqVg3uCf74Y/j73+HLL2Hg\nwOC+4ddfT3V2IlIRmdkgM/vYzFaa2dgIr48ws41m9n7ocV6R1/czszVmdm/ysk6eG2+Exo1h1KhU\nZyIiUvGpABappKpXhwsugE8/hbvughUroG9fGDQIFi5MdXYiUlGYWRpwHzAYaAcMN7N2EVZ93N27\nhB7Tirx2EzA/wammxDvvwJw5cMUVULduqrMREan4VACLVDA5OZCRAQMG9CMjI1jem5o14ZJL4PPP\n4dZbg7mEe/aEoUOD+4ZFRGLUE1jp7p+7+8/ADGBoSTc2s+5AU+DFBOWXUhMmQMOGcNFFqc5ERKRy\nUAEsUoHk5ATTZ6xaBe7GqlXB8r6KYAhGHb3qKvjiC7jpJnj11WDE6BtuaM/rr2uwLBGJWjPgy7Dl\nNaG2ok41s6Vm9qSZtQAwsyrAZODKxKeZfIsWwXPPBVd/09OLX6+0JzZFRKR4VVOdgIjEz7hxUFCw\ne1tBQdCenV2yGOnpcN11wdWIyZNhypQG9O0LnToFbWecoW56IhJ3s4DH3H2bmV0APAwMAP4MzHb3\nNWZW7MZmNhIYCdC0aVNyc3NjTig/Pz/hccaN60B6ej06d15Abu6OiOu8/HITbr+9Ddu2pQHBic1z\nz93BihUfc/TRX8c9p1TFUk7JjRPPWMopuXHiGaui51QcFcAiFcjq1aVr35sGDeDmm6FPnzdZs+Yo\n7rsvuGf4qqvg7LPhz3+Gww6LLV8RqRTWAi3ClpuH2nZy901hi9OAW0PPjwD6mtmfgbpAdTPLd/ex\nRbafCkwFyMzM9KysrJiTzs3NJZFx3n0X3nwz6AJ9wgl9i91+xIhg+rpw27al8eij7bj55ki3Ukef\nUypjKafkxolnLOWU3DjxjFXRcyqOukCLVCAtW5auvSRq1fqV88+H994LRok+4QT4f/8P2rSBY4+F\nZ56B7dujjy8iFd5C4FAza21m1YFhwLPhK5jZgWGLQ4AVAO6e7e4t3T2DoBv0I0WL3/Lqppugfv1g\nDIa9ieeJTRERUQEsUqFMnBjcyxuudu2gPVZmwZzB06cHB1433QTLl8NJJ8HBB8Mtt8DGjbG/j4hU\nLO6+HRgNvEBQ2D7h7svMbIKZDQmtdomZLTOzJcAlwIjUZJscS5bA00/DZZdBvXp7XzcRJzZFRCoz\nFcAiFUh2NkydCq1agZnTqlWwXNL7f0vqgAOC+4Tz8uCpp+CQQ+Daa6F5c/jjH2HBAg2aJSK7uPts\ndz/M3Q9294mhtuvd/dnQ82vcvb27d3b3/u7+UYQYD7n76GTnnggTJsB++8Gll+573USe2BQRqYxU\nAItUMNnZQWE6d+6r5OXFv/gNV7UqnHIKvPJKcDV45MigS/QRR0D37vDAA3sOyiUiUpl98AH8979B\n8Vu//r7XT9aJTRGRykIFsIjERdu2cM89sHZtcI/wzz/DuecGV4WvvBJWrkx1hiIiqXfTTcFo+5dd\nVvJtknliU0SkolMBLCJxlZ4Oo0YFVznmzYOBA2HKFDj0ULj88s48+CD8+GOqsxQRSb5ly+DJJ4OB\nrxo2THU2IiKVkwpgEUkIM8jKgv/8B1atgvHjYcOGmpxzDjRtCqefDrNmBVeKRUQqg5tugjp1YMyY\nVGciIlJ5qQAWkYRr1gxuuAEeffRt3nor6Br9yiswZAgceGAwp/Cbb2rgLBGpuFasgCeegNGjoVGj\nVGcjIlJ5qQAWkaQxg9694d57Yf364ArwscfCgw8GUywdcghcfz18/HGqMxURia+bbw5Gb77iilRn\nIiJSuakAFpGUqFYNTjwRHnsMNmyAhx4K5hOeOBEOPxx69IC77gpeExEpzz7+GGbMgIsugsaNU52N\niEjlpgJYRFJuv/3grLPgxRfhyy9h8mTYsSMYJbVZMxg8GB59FPLzU52piEjp3Xwz1Kypq78iImWB\nCmARKVMOOgguvxzefTcYMfXqq4N75/74x2DwrDPPhLfeasiWLanOVERk39asqcX06cHo+E2apDob\nERFRASwiEeXkQEYGDBjQj4yMYDnZ2rULukR//jnMnx8UwbNnw7XXdqJhw+DK8F13Bd0LNYCWiJRF\njz7aiho14KqrUp2JiIgAVE11AiJS9uTkwMiRUFAAYKxaFSwDZGcnP58qVaBv3+Bx111w111LWbeu\nE3PmBN2kISjWBw0KHgMGBPMRi4ik0mefwUsvNeXSS4MeLCIiknq6Aiwiexg3rrD43aWgIGhPtRo1\noGfPb5kyBT76KLg6fP/90LlzcJ/wSSdBw4bQvz/87W+wZImuDotIavzlL1C16q+6+isiUoaoABaR\nPaxeXbr2VGrdGi68EJ5+GjZtgnnzgoFmvvsOxo6FLl2C+4rPPhsefzxYR0Qk0V57LRjl/vTTv+TA\nA1OdjYiIFFIXaBHZQ8uWsGpV5PayrHp1yMoKHpMmwbp1wcjSc+bAM88EUy1VqQI9e8JxxwXdpXfs\nsBRnLSIVzY4dcPHFwXfmGWesBjJSnZKIiIToCrCI7GHiRKhde/e22rWD9vLkoINgxIhg/s2NG+Gt\nt4Iuie4wYQIccQSccMKR/Pa3wcHqww/Dhx/C9u2pzlxEyrOpU4PbLyZPhpo1f011OiIiEkYFsIjs\nITs7OIBr1QrMnFatguVUDIAVL2lp0Ls3jB8PCxYEBfGMGfC7362jalV48MGgWO7YEerVgz594NJL\n4ZFHYPny4IqOiMi+bNoE110XjENw6qmpzkZERIpSF2gRiSg7O3jk5r5KVlZWqtOJu0aN4PTToWnT\nz8jKasGOHfDJJ7BoESxeHPycNg3uvjtYv04d6NoVuneHzMzg52GHBYW1iEih666DH34IvjtMd1iI\niJQ5KoBFRAgK2bZtg8cf/xi07dgRjDRdWBAvXhxcCb/rruD1unWDojgzE2rXbkLz5nDwwTroFams\n3nsP/vGP4JaKDh1SnY2IiESiAlhEpBhpadC+ffD405+Ctu3b9yyK778ftm5tx8SJ0KBBMMhWr17B\nz549Yf/9U/s5RCTx3OGSS6BxY7jxxlRnIyIixVEBLCJSClWrBld2OnSAs84K2rZvh4ceWoh7D955\nB95+G26+GX4NjX3TuvWugrhXr+Cqca1aqfsMIhJ/06fD668Ht07Ur5/qbEREpDgqgEVEYlS1Khxy\nyE9kZcH55wdt+fnw7rtBMfzOO/DGG8GgW4Xrd+q0+5Xiww8PpmgSkfJn82a46qrgdoizz051NiIi\nsjcqgEUk4XJyYNw4WL26Hy1bBtMplecRpUuibl046qjgUWj9+qAYLrxKPH06/P3vwWvp6dCjR1AM\nux/Ali1wwAHQtCk0aRIUzSJSNk2cGPz/njlTJ7JERMo6HVKJSELl5MDIkVBQAGCsWhUsQ8Uvgos6\n8EAYOjR4QNBF+uOPdy+Kb78dtm8/nL/9bdd2ZsGo1YUFcfjPom2NG2tkail7zGwQcBeQBkxz90lF\nXh8B3AasDTXd6+7TzKwVMJNg2sZqwD3u/vekJV4Cn3wCd9wRTKPWq1eqsxERkX1RASwiCTVuXGHx\nu0tBQdBe2QrgoqpU2TXydOH9xNu2wX//u4CMjN5s2ABffRU8Cp9v2ABvvhk837Ilcsz99w8K4ho1\nOtK9O/zmN8F9yL/5TfCoVy+5n1MqNzNLA+4DjgHWAAvN7Fl3X15k1cfdfXSRtvXAEe6+zczqAh+G\ntl2X+MxLZswYqFkTbrkl1ZmIiEhJqAAWkYRavbp07ZVdjRpw4IFbOeKIva/nHtxnXLQ4Dv/50UfV\nefxx+Pbb3bdt2HBXMVz4KCyQW7SAatUS9/mkUuoJrHT3zwHMbAYwFChaAO/B3X8OW6xBcCW4zPjf\n/2D2bJg8OTjpJCIiZZ8KYBFJqJYtYdWqyO0SPbPgvuH0dDj00Mjr5OYuJisri++/hy++gM8/3/X4\n4otgztKZM+GXX3Ztk5YW/NsULY7z8hry009B4f3rr6V/FG730UcH0blzMF2UVBrNgC/DltcAkToL\nn2pmRwGfAGPc/UsAM2sBPAccAlwV6eqvmY0ERgI0bdqU3NzcmJPOz8/fa5yffzYuuKAnLVv+SseO\ni8jN9ajixDOnZMeJZyzllNw48YylnJIbJ56xKnpOxVEBLCIJNXFi+D3Agdq1g3ZJjvr1g6mXunbd\n87UdO2Dt2j2L488/h2eega+/LlyzU5yyOYw//1kFsOxhFvBYqKvzBcDDwACAUCHcycwOAp42syfd\nfUP4xu4+FZgKkJmZ6VlZWTEnlJuby97i3HILrFsHL74IxxzTL+o48cwp2XHiGUs5JTdOPGMpp+TG\niWesip5TcVQAi0hCFd7nG4wC7bRsaZViFOjyovCKb8uWEOnvTX5+UBC/9tpievTojllwn3FpHuHb\nvPXWGxx8cJ+kf05JqbVAi7Dl5uwa7AoAd98UtjgNuLVoEHdfZ2YfAn2BJxOQZ4mtWRPM9X3yyXDM\nManMRERESksFsIgkXHZ28MjNfTXhZ/UkvurWhY4dYdOmzfToEXu8+vV/0ZROlc9C4FAza01Q+A4D\nzghfwcwOdPf1ocUhwIpQe3Ngk7tvMbMGwJHAnUnLvBj/939Bl/7Jk1OdiYiIlJYOQ0RERCRh3H27\nmY0GXiCYBukBd19mZhOARe7+LHCJmQ0BtgPfAiNCm7cFJpuZAwbc7u4fJP1DhJk/Hx57DK6/Prg/\nXkREypeEFsAlmPfvQuAiYAeQD4yMMC2CiIiIlGPuPhuYXaTt+rDn1wDXRNjuJeJ3A3rMtm+Hiy8O\nbhm4+upUZyMiItFI2HQCYfP+DQbaAcPNrF2R1aa7e0d370Jwv88dicpHREREJBZTp8LSpUHX59q1\nU52NiIhEI5Hz6e2c9y80j1/hvH87ufuPYYt1gMhzCIiIADk5kJEBAwb0IyMjWBYRSYZvvoHrroMB\nA+DUU1OdjYiIRCuRXaBLNO+fmV0EXA5UJzTlgYhIUTk54dMpGatWBcugEaVFJPGuuw5+/BHuvjsY\n2VxERMqnlA+C5e73AfeZ2RnAdcBZRddJxQT3yY4Tz1jKKblx4hlLORXviit6U1BQc7e2ggK44oqt\nNGu2ICU5JSJOPGNV9JxEkuW994Luz5dcAu3bpzobERGJRSIL4H3O+1fEDOD+SC+kYoL7ZMeJZyzl\nlNw48YylnIr39dfFtdeMKb+K9ntKRJx4xkrGBPci8eQeDHzVuDGMH5/qbEREJFaJvAd457x/Zlad\nYN6/Z8NXMLNDwxZPAD5NYD4iUo61bFm6dhGReMjJgTfegFtugfr1U52NiIjEKmEFsLtvBwrn/VsB\nPFE4719orj+A0Wa2zMzeJ7gPeI/uzyIiABMn7jnqau3aQbuISCJs3gz/93/QowecfXaqsxERkXhI\n6D3AJZj379JEvr+IVByFA12NGwerVzstWxoTJ2oALBFJnJtvhvXrYeZMqJLIPnMiIpI0+joXkXIj\nOxvy8mDu3FfJy1PxKyKJ8+WXtbjzThgxAnrtMYeFiIiUVyqARURERMK4w333HUKtWjBpUqqzERGR\neEr5NEgiIiIiZcn//gdvv92IyZOhadNUZyMiIvGkK8AiUinl5EBGBgwY0I+MjGBZRGTrVrjsMmjV\n6icuvjjV2YiISLzpCrCIVDo5OTByJBQUABirVgXLoPuKRSq777+H3/wGjjtuJdWqdU51OiIiEme6\nAiwilc64cYXF7y4FBUG7iFRuBxwAL74ImZnfpToVERFJABXAIlLprF5dunYRqVzMUp2BiIgkigpg\nEal0WrYsXbuIiIiIVAwqgEWk0pk4EWrX3r2tdu2gXUQkHjTQnohI2aQCWEQqnexsmDoVWrUCM6dV\nq2BZA2CJSDwUDrS3ahW47xpoT0WwiEjqqQAWkUopOxvy8mDu3FfJy1PxKyLxo4H2RETKLhXAIiIx\nUDdHESlKA+2JiJRdKoBFRKKkbo4iEokG2hMRKbtUAIuIREndHEUkEg20JyJSdlVNdQIiIuWVujmK\n7JuZDQLuAtKAae4+qcjrI4DbgLWhpnvdfZqZdQHuB/YDdgAT3f3xpCUeg8IxBcaNg9WrnZYtjYkT\nNdaASHnyyy+/sGbNGurVq8eKFStijhevOPGMVRFyqlmzJs2bN6datWol3kYFsIhIlFq2DLo/R2oX\nETCzNOA+4BhgDbDQzJ519+VFVn3c3UcXaSsA/uTun5rZQcBiM3vB3b9PfOaxy84OHrm5r5KVlZXq\ndESklNasWUN6ejqNGjViv/32izne5s2bSU9Pj0Nm8YtV3nNydzZt2sSaNWto3bp1id9DXaBFRKKk\nbo4i+9QTWOnun7v7z8AMYGhJNnT3T9z909DzdcDXwP4Jy1REJMzWrVtp1KgRZpbqVKQYZkajRo3Y\nunVrqbbTFWARkSipm6PIPjUDvgxbXgP0irDeqWZ2FPAJMMbdw7fBzHoC1YHPIr2JmY0ERgI0bdqU\n3NzcmBPPz88vU3HiGUs5JTdOPGMpp+TFqVevHvn5+ezYsYPNmzfHnFO84sQzVkXJaevWraX691YB\nLCISg3h2c8zJKSym+9GyJSqmpbKYBTzm7tvM7ALgYWBA4YtmdiDwb+Asd/81UgB3nwpMBcjMzPR4\ndDnOzc2NS9fleMWJZyzllNw48YylnJIXZ8WKFaSnp6esu/GmTZsYOHAgAF999RVpaWnsv3/QCeaV\nV16hfv36+4xx9tlnM3bsWNq0aVNsTo888gj169cnO8YDjlR2y65ZsyZdu3Yt8foqgEVEyoDCKZWC\nUaV3TakEKoKlXFsLtAhbbs6uwa4AcPdNYYvTgFsLF8xsP+A5YJy7L0hgniIiMdl1Epu4nMRu1KgR\n77//PgDjx4+nbt26XHnllQA7r5C6O+5OlSqR72p98MEH9/k+F110UfRJllO6B1hEpAzQlEpSQS0E\nDjWz1mZWHRgGPBu+QugKb6EhwIpQe3VgJvCIuz+ZpHxFREqt8CT2qlXgzs6T2Dk58X+vlStX0qNH\nD7Kzs2nfvj3r169n5MiRZGZm0r59eyZMmLBz3SOPPJL333+f7du3U79+fcaOHUvnzp054ogj+Prr\nrwG47rrrmDJlys71x44dS8+ePWnTpg1vvvkmAD/99BOnnnoq7dq147TTTiMzM3NncR7uhhtuoEeP\nHnTo0IELL7wQdwfgk08+YcCAAXTu3Jlu3bqRl5cHwF//+lc6duxI586dGZfEAx4VwCIiZYCmVJKK\nyN23A6OBFwj095wZAAAXgElEQVQK2yfcfZmZTTCzIaHVLjGzZWa2BLgEGBFq/wNwFDDCzN4PPbok\n+SOIiOxTsk9if/LJJ4wZM4bly5fTrFkzJk2axKJFi1iyZAkvvfQSy5cXHWgffvjhB/r168eSJUs4\n4ogjeOCBByLGdnfeeecdbrvttp3F9D333MMBBxzA8uXL+ctf/sJ7770XcdtLL72UhQsX8sEHH/DD\nDz8wZ84cAIYPH86YMWNYsmQJb775Jk2aNGHWrFk8//zzvPPOOyxZsoQrrrgiTr+dfVMXaBGRMkBT\nKklF5e6zgdlF2q4Pe34NcE2E7R4FHk14giIiMUr2SezWrVuTmZm5c/mxxx7jX//6F9u3b2fdunUs\nX76cdu3a7bZNrVq1GDx4MADdu3fntddeixj7lFNO2blO4ZXa119/nauvvhqAzp070759+4jbvvLK\nK9x2221s3bqVb775hu7du9O7d2+++eYbfve73wHB/boAL7/8Mueccw61atUCoGHDhtH8KqKiK8Ai\nImWAplQSEREpn4o7WZ2ok9h16tTZ+fzTTz/lrrvuYu7cuSxdupRBgwZFnBaoevXqO5+npaWxffv2\niLFr1Kixz3UiKSgoYPTo0cycOZOlS5dyzjnnlHp6omRRASwiUgZkZ8PUqdCqFZg5rVoFyxoAS0RE\npGxL5UnsH3/8kfT0dPbbbz/Wr1/PCy+8EPf36NOnD0888QQAH3zwQcQu1lu2bKFKlSo0btyYzZs3\n89RTTwHQoEED9t9/f2bNmgUEUxYVFBRwzDHH8MADD7BlyxYAvv3227jnXRwVwCIiZUR2NuTlwdy5\nr5KXF33xm5MDGRkwYEA/MjISMwiHiIiIBHY/iU1ST2J369aNdu3acfjhh/OnP/2JPn36xP09Lr74\nYtauXUu7du248cYbadeuHfXq1dttnUaNGnHWWWfRrl07Bg8eTK9eu6Z8z8nJYfLkyXTq1IkjjzyS\njRs3cuKJJzJo0CAyMzPp0qULd955Z9zzLo7uARYRqUA0nZKIiEjyZWcn7u/s+PHjdz4/5JBDeOON\nN3Yumxn//ve/I273+uuv73z+/fff73w+bNgwhg0bxubNm7n55psjrn/AAQewcuVKILhvd/r06dSs\nWZNPP/2UY489lhYtwme4C0yaNIlJkybt0d6mTRtyc3P3aB83blxSR38upAJYRKQC2dtIlCqARURE\npLTy8/MZOHAg27dvx935xz/+QdWq5beMLL+Zi4jIHjSdkoiIiMRT/fr1Wbx4carTiBvdAywiUoEk\neyRKERERkfJEBbCISAWi6ZREREREiqcCWESkAon3dEoaUVpEREQqEhXAIiIVTDynUxo5ElatAvdd\nI0qrCBYREZHySgWwiIhEtLcRpUVERCRx+vfvzwsvvLBb25QpUxg1atRet6tbty4A69at47TTTou4\nTlZWFosWLdprnClTplAQdhBw/PHH7zaVUnmmAlhERCLSiNIiIiKpMXz4cGbMmLFb24wZMxg+fHiJ\ntj/ooIN48skno37/ogXw7NmzqV+/ftTxyhIVwCIiEpFGlBYREUmN0047jeeee46ff/4ZgLy8PNat\nW0ffvn13zsvbrVs3OnbsyDPPPLPH9nl5eXTo0AGALVu2MGzYMNq2bcvJJ5/Mli1bdq43atQoMjMz\nad++PTfccAMAd999N+vWraN///70798fgIyMDL755hsA7rjjDjp06ECHDh2YMmUKAKtWraJt27ac\nf/75tG/fnmOPPXa39yk0a9YsevXqRdeuXTn66KPZsGEDEMw1fPbZZ9O7d286derEU089BcCcOXPo\n1q0bnTt3ZuDAgXH53WoeYBERiWjixOCe3/Bu0NGOKJ2TE3SdXr26Hy1bBjGivTdZJJG0r4pIUZdd\nBu+/H1uMHTtqkZa2a7lLFwjVjhE1bNiQnj178vzzzzN06FBmzJjBH/7wB8yMmjVrMnPmTPbbbz++\n+eYbevfuzZAhQzCziLHuv/9+ateuzYoVK1i6dCndunXb+drEiRNp2LAhO3bsYODAgSxdupRLLrmE\nO+64g3nz5tG4cePdYi1evJgHH3yQt99+G3enV69e9OvXj2rVqvHpp5/y2GOP8c9//pM//OEPPPXU\nU5x55pm7bX/kkUeyYMECzIxp06Zx6623MnnyZG666Sbq1avHggULSE9P57vvvmPjxo2cf/75zJ8/\nn9atW/Ptt9+W/hcfga4Ai4hIRPEaUVqDaUl5oX1VRMqS8G7Q4d2f3Z1rr72WTp06cfTRR7N27dqd\nV1IjmT9//s5CtFOnTnTq1Gnna0888QTdunWja9euLFu2jOXLl+81p9dff52TTz6ZOnXqULduXU45\n5RRee+01AFq3bk2XLl0A6N69O3l5eXtsv2bNGo477jg6duzIbbfdxrJlywB4+eWXueiii3au16BB\nAxYsWMBRRx1F69atgeCkQDzoCrCIiBQrOzt45Oa+SlZWVlQx9jaYlq6sSVmifVVEItnbldqS2rx5\nC+np6aXaZujQoYwZM4Z3332XgoICunfvDgRF68aNG1m8eDHVqlUjIyODrVu3ljqnvLw8br/9dhYu\nXEiDBg0YMWJEVHEK1ahRY+fztLS0iF2gL774Yi6//HKGDBlCbm4u48ePj/r9oqUrwCIiklAaTEvK\nC+2rIlKW1K1bl/79+3POOefsNvjVDz/8QJMmTahWrRrz5s1j1apVe41z1FFHMX36dAA+/PBDli5d\nCsDmzZupU6cO9erVY8OGDTz//PM7t0lPT2fz5s17xOrbty9PP/00BQUF/PTTT8ycOZO+ffuW+DP9\n8MMPNGvWDICHH354Z/sxxxzDfffdt3P5u+++o3fv3syfP58vvvgCQF2gRUSkfNBgWlJeaF8VkbJm\n+PDhLFmyZLcC+PTTT2fRokV07NiRRx55hMMPP3yvMUaNGkV+fj5t27bl+uuv33kluWPHjnTt2pXD\nDz+cM844gz59+uzcZuTIkQwaNGjnIFiFunXrxogRI+jZsye9evXivPPOo2vXriX+POPHj+f3v/89\n3bt33+3+4uuuu47vvvuOXr160blzZ+bNm8f+++/P1KlTOeWUU+jcuTOnn356id9nb9QFWkREEiqe\ng2mJJJL2VREpa0466STcfbe2Ro0a8dZbb0VcPz8/HwhGbf7www8BqFWr1h5TKkFwBfihhx6KGOfi\niy/m4osv3rkcfj/v5ZdfzuWXX77b+q1atdr5fgBXXnllxLhDhw5l6NChe7TXrVuXhx9+mM2bN+/W\nVXzw4MEMHjw4Yqxo6QqwiIgkVLwG0xJJNO2rIiIVX0ILYDMbZGYfm9lKMxsb4fXLzWy5mS01s1fM\nrFUi8xERkdTIzoa8PJg791Xy8lRQSNmlfVVEpGJLWAFsZmnAfcBgoB0w3MzaFVntPSDT3TsBTwK3\nJiofERERERERqdwSeQW4J7DS3T9395+BGcBuHb7dfZ67F95pswBonsB8REREJMlK0BtshJltNLP3\n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\nAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.86      0.85      0.86     12500\n",
            "           1       0.85      0.87      0.86     12500\n",
            "\n",
            "    accuracy                           0.86     25000\n",
            "   macro avg       0.86      0.86      0.86     25000\n",
            "weighted avg       0.86      0.86      0.86     25000\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "l2ckMqF_IxOG",
        "colab_type": "text"
      },
      "source": [
        "#### Separate Models + gradient tape\n",
        "\n",
        "Need signature if each batch different shape:\n",
        "```python\n",
        "@tf.function(input_signature=[\n",
        "     tf.TensorSpec(shape=[None, None], dtype=tf.int64),\n",
        "     tf.TensorSpec(shape=[None,], dtype=tf.int64)])\n",
        "```"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "WgZWrhuZI2EP",
        "colab_type": "code",
        "outputId": "76ca3968-2580-4e19-bb90-25f697e0a971",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 867
        }
      },
      "source": [
        "class Embed(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, emb_size):\n",
        "    super(Embed, self).__init__()\n",
        "    self.emb_layer = tf.keras.layers.Embedding(vocab_size, emb_size)\n",
        "    self.avg_layer = tf.keras.layers.GlobalAveragePooling1D()\n",
        "    return\n",
        "\n",
        "  def call(self, input_batch):\n",
        "    output_batch = self.emb_layer(input_batch)\n",
        "    output_batch = self.avg_layer(intermediate_value)\n",
        "    return output_batch\n",
        "\n",
        "class Prediction(tf.keras.Model):\n",
        "  def __init__(self):\n",
        "    super(Prediction, self).__init__()\n",
        "    self.l1 = tf.keras.layers.Dense(units=16, activation=tf.nn.relu)\n",
        "    self.l2 = tf.keras.layers.Dense(units=1, activation=tf.nn.sigmoid)\n",
        "    return\n",
        "\n",
        "  def call(self, input_batch):\n",
        "    intermediate_value = self.l1(input_batch)\n",
        "    output_batch = self.l2(intermediate_value)\n",
        "    return output_batch\n",
        "\n",
        "\n",
        "def loss_func(target, logits):\n",
        "  bce = tf.losses.BinaryCrossentropy(from_logits=False)\n",
        "  return bce(y_true=target, y_pred=logits)\n",
        "\n",
        "\n",
        "@tf.function\n",
        "def train_batch(input_batch, labels_batch):\n",
        "  # use global scope variables\n",
        "  global model_embed, model_dens, model_optimizer\n",
        "  with tf.GradientTape() as tape:\n",
        "    preds_batch = model_embed(input_batch)\n",
        "    preds_batch = model_dens(preds_batch)\n",
        "\n",
        "    loss = loss_func(labels_batch, preds_batch)\n",
        "    acc = model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "  variables = model_embed.variables + model_dens.variables\n",
        "  gradients = tape.gradient(loss, variables)\n",
        "  model_optimizer.apply_gradients(zip(gradients, variables))\n",
        "  return loss, acc\n",
        "\n",
        "\n",
        "\n",
        "def model_predicitons(data_generator):\n",
        "  \"\"\"Predict on test data.\n",
        "  Make sure train_generator is already batched formatted.\n",
        "  \"\"\"\n",
        "  # models used\n",
        "  global model\n",
        "  y_pred = []\n",
        "  y_true = []\n",
        "  # make predicitons\n",
        "  for batch, (inputs_batch, labels_batch) in enumerate(data_generator):\n",
        "    preds_batch = model_embed(inputs_batch)\n",
        "    preds_batch = model_dens(preds_batch)\n",
        "\n",
        "    preds_batch = tf.keras.backend.round(preds_batch)\n",
        "    [y_pred.append(val[0]) for val in preds_batch]\n",
        "    [y_true.append(val) for val in labels_batch]\n",
        "  return np.array(y_true), np.array(y_pred)\n",
        "\n",
        "EPOCHS = 20\n",
        "history_dict = {'accuracy':[],\n",
        "                'val_accuracy':[], \n",
        "                'loss':[], \n",
        "                'val_loss':[]}\n",
        "\n",
        "with tf.device('/device:GPU:0'):\n",
        "  \n",
        "    model_embed = Classification(vocab_size=text_encoder.vocab_size, emb_size=EMBEDDING_SIZE)\n",
        "    model_dens = Prediction()\n",
        "    model_optimizer = tf.optimizers.Adam()\n",
        "    model_metrics = tf.metrics.Accuracy()\n",
        "\n",
        "    for epoch in range(EPOCHS):\n",
        "      epoch_time = 0\n",
        "\n",
        "      # train data\n",
        "      loss_epoch = 0\n",
        "      acc_epoch = 0\n",
        "\n",
        "      for batch, (encodings_batch, labels_batch) in enumerate(train_batches, start=1):\n",
        "        start_time = time.time()\n",
        "        # train on batch\n",
        "        loss_batch, acc_batch = train_batch(encodings_batch, labels_batch)\n",
        "        # keep track of loss and accuracy\n",
        "        loss_epoch += loss_batch\n",
        "        acc_epoch += acc_batch\n",
        "        end_time = time.time()\n",
        "        epoch_time += (end_time - start_time)\n",
        "          \n",
        "      batch_time = epoch_time / batch\n",
        "      loss_epoch = tf.get_static_value(loss_epoch) / batch\n",
        "      history_dict['loss'].append(loss_epoch)\n",
        "      acc_epoch = tf.get_static_value(acc_epoch) / batch\n",
        "      history_dict['accuracy'].append(acc_epoch)\n",
        "\n",
        "      # validation data\n",
        "      val_acc_epoch = 0\n",
        "      val_loss_epoch = 0\n",
        "\n",
        "      for batch, (encodings_bacth, labels_batch) in enumerate(valid_batches, start=1):\n",
        "        preds_batch = model_embed(encodings_bacth)\n",
        "        preds_batch = model_dens(preds_batch)\n",
        "\n",
        "        val_loss_epoch += loss_func(labels_batch, preds_batch)\n",
        "        val_acc_epoch += model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "      val_loss_epoch = tf.get_static_value(val_loss_epoch) / batch\n",
        "      history_dict['val_loss'].append(val_loss_epoch)\n",
        "\n",
        "      val_acc_epoch = tf.get_static_value(val_acc_epoch) / batch\n",
        "      history_dict['val_accuracy'].append(val_acc_epoch)\n",
        "\n",
        "      print('Epoch: %s/%s loss: %.4f acc: %.4f val_loss: %.4f val_acc: %.4f\\tTime epoch: %.2f batch: %.2f'%(epoch+1, \n",
        "                                                                                                          EPOCHS, \n",
        "                                                                                                          loss_epoch, \n",
        "                                                                                                          acc_epoch, \n",
        "                                                                                                          val_loss_epoch, \n",
        "                                                                                                          val_acc_epoch,\n",
        "                                                                                                          epoch_time,\n",
        "                                                                                                          batch_time))    \n",
        "plt_history(history_dict)\n",
        "\n",
        "# evaluate\n",
        "y_true, y_pred = model_predicitons(test_data.batch(15000))\n",
        "print(classification_report(y_true, y_pred))"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 1/20 loss: 0.6933 acc: 0.5001 val_loss: 0.6932 val_acc: 0.5003\tTime epoch: 2.96 batch: 0.16\n",
            "Epoch: 2/20 loss: 0.6931 acc: 0.5007 val_loss: 0.6931 val_acc: 0.5003\tTime epoch: 2.15 batch: 0.12\n",
            "Epoch: 3/20 loss: 0.6931 acc: 0.5007 val_loss: 0.6931 val_acc: 0.5069\tTime epoch: 2.17 batch: 0.12\n",
            "Epoch: 4/20 loss: 0.6930 acc: 0.5100 val_loss: 0.6929 val_acc: 0.5090\tTime epoch: 2.24 batch: 0.12\n",
            "Epoch: 5/20 loss: 0.6928 acc: 0.5112 val_loss: 0.6925 val_acc: 0.5142\tTime epoch: 2.15 batch: 0.12\n",
            "Epoch: 6/20 loss: 0.6920 acc: 0.5184 val_loss: 0.6912 val_acc: 0.5231\tTime epoch: 2.20 batch: 0.12\n",
            "Epoch: 7/20 loss: 0.6894 acc: 0.5243 val_loss: 0.6866 val_acc: 0.5284\tTime epoch: 2.16 batch: 0.12\n",
            "Epoch: 8/20 loss: 0.6818 acc: 0.5344 val_loss: 0.6752 val_acc: 0.5417\tTime epoch: 2.19 batch: 0.12\n",
            "Epoch: 9/20 loss: 0.6654 acc: 0.5498 val_loss: 0.6546 val_acc: 0.5586\tTime epoch: 2.15 batch: 0.12\n",
            "Epoch: 10/20 loss: 0.6386 acc: 0.5674 val_loss: 0.6248 val_acc: 0.5762\tTime epoch: 2.17 batch: 0.12\n",
            "Epoch: 11/20 loss: 0.6025 acc: 0.5853 val_loss: 0.5888 val_acc: 0.5944\tTime epoch: 2.20 batch: 0.12\n",
            "Epoch: 12/20 loss: 0.5616 acc: 0.6037 val_loss: 0.5530 val_acc: 0.6128\tTime epoch: 2.21 batch: 0.12\n",
            "Epoch: 13/20 loss: 0.5228 acc: 0.6217 val_loss: 0.5226 val_acc: 0.6304\tTime epoch: 2.17 batch: 0.12\n",
            "Epoch: 14/20 loss: 0.4863 acc: 0.6387 val_loss: 0.4943 val_acc: 0.6468\tTime epoch: 2.13 batch: 0.12\n",
            "Epoch: 15/20 loss: 0.4533 acc: 0.6547 val_loss: 0.4666 val_acc: 0.6622\tTime epoch: 2.18 batch: 0.12\n",
            "Epoch: 16/20 loss: 0.4216 acc: 0.6695 val_loss: 0.4462 val_acc: 0.6765\tTime epoch: 2.17 batch: 0.12\n",
            "Epoch: 17/20 loss: 0.3925 acc: 0.6832 val_loss: 0.4250 val_acc: 0.6896\tTime epoch: 2.20 batch: 0.12\n",
            "Epoch: 18/20 loss: 0.3641 acc: 0.6958 val_loss: 0.4078 val_acc: 0.7016\tTime epoch: 2.16 batch: 0.12\n",
            "Epoch: 19/20 loss: 0.3385 acc: 0.7073 val_loss: 0.3913 val_acc: 0.7127\tTime epoch: 2.16 batch: 0.12\n",
            "Epoch: 20/20 loss: 0.3137 acc: 0.7180 val_loss: 0.3778 val_acc: 0.7229\tTime epoch: 2.13 batch: 0.12\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n2jxBAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.86      0.86      0.86     12500\n",
            "           1       0.86      0.86      0.86     12500\n",
            "\n",
            "    accuracy                           0.86     25000\n",
            "   macro avg       0.86      0.86      0.86     25000\n",
            "weighted avg       0.86      0.86      0.86     25000\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pK_U_qFXQgGX",
        "colab_type": "text"
      },
      "source": [
        "### Attention Classification"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fMxXI9RnwtrQ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "rnn_units = 32\n",
        "attention_dim = 10"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6zZvSqCpH_Qy",
        "colab_type": "text"
      },
      "source": [
        "#### CustomAttention - Separate Models"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fW3dHMWXQ0Bz",
        "colab_type": "code",
        "outputId": "9bb64566-6548-40ca-d53f-61fcdf2c4045",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 867
        }
      },
      "source": [
        "class CustomAttention(tf.keras.layers.Layer):\n",
        "  \"\"\"Implements CustomAttention attention scoring using small neural networks.\n",
        "  Works great for single classificaiton prediciton.\n",
        "  Add multiple dense layer to increase attention neural netowrk (a1, a2, etc.).\n",
        "\n",
        "  Temrinology:\n",
        "    'max_len' refers to sequence maximum length\n",
        "    'hidden_size' / 'query_depth' / 'alignments_size' refers to rnn_size.\n",
        "    'key' / 'keys' are 'encoder outputs' related values with \n",
        "      shape `[batch_size x max_len x hidden size]`\n",
        "    'query' / 'value'(s) refers to decoder values with \n",
        "      shape `[batch_size x hidden size]`\n",
        "\n",
        "  Source:\n",
        "  https://github.com/conversationai/conversationai-models/blob/master/attention-tutorial/Attention_Model_Tutorial.ipynb\n",
        "  \"\"\"\n",
        "  def __init__(self, max_len, rnn_size, attention_size):\n",
        "    \"\"\"Construct the AttentionMechanism.\n",
        "\n",
        "    Args:\n",
        "      max_len: sequence maximum length.\n",
        "      rnn_size: number of hidden units in rnn cell.\n",
        "      attention_size: The size of layer for neural network scoring prediciton.\n",
        "    \"\"\"\n",
        "\n",
        "    super(CustomAttention, self).__init__()\n",
        "    self.max_len = max_len\n",
        "    self.rnn_size = rnn_size\n",
        "    # attention layer\n",
        "    self.a1 = tf.keras.layers.Dense(units=attention_size, activation=tf.nn.relu)\n",
        "    # last layer that outputs scoring value\n",
        "    self.V = tf.keras.layers.Dense(1, activation=None)\n",
        "\n",
        "  def call(self, encoder_output):\n",
        "    \"\"\"Score based on the decoder and encoder outputs.\n",
        "\n",
        "    Args:\n",
        "      encoder_output: Tensor with shape `[batch_size, rnn_size]`\n",
        "    Returns:\n",
        "      context: The weighted average sum of encoder output with \n",
        "        shape `[batch_size, rnn_size]`\n",
        "      alignment: The attention with shape `[batch_size, max_len]`\n",
        "    \"\"\"\n",
        "    # concatenate sequences vertically\n",
        "    encoder_output = tf.concat(encoder_output, axis = 2)\n",
        "    # reshape to [batch_size*max_len, rnn_size]\n",
        "    intermediate_values = tf.reshape(encoder_output, [-1, self.rnn_size])\n",
        "    # feed to each layer\n",
        "    intermediate_values = self.a1(intermediate_values)\n",
        "    intermediate_values = self.V(intermediate_values)\n",
        "    # reshape to [batch_size, max_len, 1]\n",
        "    scores = tf.reshape(intermediate_values, [-1, self.max_len, 1])\n",
        "    alignment = tf.nn.softmax(logits=scores, axis=1)\n",
        "    context_vector = tf.reduce_sum(encoder_output * alignment, 1)\n",
        "    # match shape [batch_size, max_len]\n",
        "    alignment = tf.squeeze(alignment)\n",
        "    return context_vector, alignment\n",
        "\n",
        "\n",
        "class Encoder(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, embedding_dim, rnn_size):\n",
        "    super(Encoder, self).__init__()\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    self.gru = tf.keras.layers.GRU(rnn_size,\n",
        "                                  return_sequences=True,\n",
        "                                  return_state=True,\n",
        "                                  recurrent_initializer='glorot_uniform')\n",
        "  def call(self, input_batch):\n",
        "    intermediate_value = self.embedding(input_batch)\n",
        "    # not used initial_state = hidden\n",
        "    encoder_outputs, last_output = self.gru(intermediate_value)\n",
        "    return encoder_outputs, last_output\n",
        "\n",
        "\n",
        "class Prediction(tf.keras.Model):\n",
        "  def __init__(self):\n",
        "    super(Prediction, self).__init__()\n",
        "    # self.l1 = tf.keras.layers.Dense(units=units, activation=tf.nn.relu)\n",
        "    self.l2 = tf.keras.layers.Dense(units=1, activation=tf.nn.sigmoid)\n",
        "    return\n",
        "\n",
        "  def call(self, input_batch):\n",
        "    # intermediate_value = self.l1(input_batch)\n",
        "    output_batch = self.l2(input_batch)\n",
        "    return output_batch\n",
        "\n",
        "\n",
        "def loss_func(target, logits):\n",
        "  bce = tf.losses.BinaryCrossentropy(from_logits=False)\n",
        "  return bce(y_true=target, y_pred=logits)\n",
        "\n",
        "\n",
        "# need signature becuase each batch different shape\n",
        "# @tf.function(input_signature=[\n",
        "#     tf.TensorSpec(shape=[None, None], dtype=tf.int64),\n",
        "#     tf.TensorSpec(shape=[None,], dtype=tf.int64)])\n",
        "@tf.function\n",
        "def train_batch(input_batch, labels_batch):\n",
        "  # use global scope variables\n",
        "  global encoder, custom_attn, pred_decoder, model_optimizer\n",
        "  loss = 0\n",
        "  with tf.GradientTape() as tape:\n",
        "    encoder_outputs, last_output = encoder(input_batch)    \n",
        "    context_vector, attention_weights = custom_attn(encoder_outputs)\n",
        "    preds_batch = pred_decoder(context_vector)\n",
        "\n",
        "    loss = loss_func(labels_batch, preds_batch)\n",
        "    acc = model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "  variables = encoder.variables + custom_attn.variables + pred_decoder.variables\n",
        "  gradients = tape.gradient(loss, variables)\n",
        "  model_optimizer.apply_gradients(zip(gradients, variables))\n",
        "  return loss, acc, attention_weights\n",
        "\n",
        "def model_predicitons(data_generator):\n",
        "  \"\"\"Predict on test data.\n",
        "  Make sure train_generator is already batched formatted.\n",
        "  \"\"\"\n",
        "  # models used\n",
        "  global encoder, custom_attn, pred_decoder\n",
        "  y_pred = []\n",
        "  y_true = []\n",
        "  attentions = []\n",
        "  # make predicitons\n",
        "  for batch, (inputs_batch, labels_batch) in enumerate(data_generator):\n",
        "    encoder_outputs, _ = encoder(inputs_batch)    \n",
        "    context_vector, attention_batch = custom_attn(encoder_outputs)\n",
        "    preds_batch = pred_decoder(context_vector)\n",
        "    preds_batch = tf.keras.backend.round(preds_batch)\n",
        "    [y_pred.append(val[0]) for val in preds_batch]\n",
        "    [y_true.append(val) for val in labels_batch]\n",
        "    [attentions.append(val) for val in attention_batch]\n",
        "  return np.array(y_true), np.array(y_pred), np.array(attentions)\n",
        "\n",
        "EPOCHS = 20\n",
        "history_dict = {'accuracy':[],\n",
        "                'val_accuracy':[], \n",
        "                'loss':[], \n",
        "                'val_loss':[]}\n",
        "\n",
        "with tf.device('/device:GPU:0'):\n",
        "  \n",
        "  encoder = Encoder(vocab_size=text_encoder.vocab_size, \n",
        "                    embedding_dim=EMBEDDING_SIZE, \n",
        "                    rnn_size=rnn_units)\n",
        "  custom_attn = CustomAttention(max_len=MAX_LEN, \n",
        "                                rnn_size=rnn_units, \n",
        "                                attention_size=attention_dim)\n",
        "  pred_decoder = Prediction()\n",
        "  model_optimizer = tf.optimizers.Adam()\n",
        "  model_metrics = tf.metrics.Accuracy()\n",
        "\n",
        "  for epoch in range(EPOCHS):\n",
        "    epoch_time = 0\n",
        "\n",
        "    # train data\n",
        "    loss_epoch = 0\n",
        "    acc_epoch = 0\n",
        "\n",
        "    for batch, (encodings_batch, labels_batch) in enumerate(train_batches, start=1):\n",
        "      start_time = time.time()\n",
        "      # train on batch\n",
        "      loss_batch, acc_batch, attention_batch = train_batch(encodings_batch, labels_batch)\n",
        "      # keep track of loss and accuracy\n",
        "      loss_epoch += loss_batch\n",
        "      acc_epoch += acc_batch\n",
        "      end_time = time.time()\n",
        "      epoch_time += (end_time - start_time)\n",
        "        \n",
        "    batch_time = epoch_time / batch\n",
        "    loss_epoch = tf.get_static_value(loss_epoch) / batch\n",
        "    history_dict['loss'].append(loss_epoch)\n",
        "    acc_epoch = tf.get_static_value(acc_epoch) / batch\n",
        "    history_dict['accuracy'].append(acc_epoch)\n",
        "\n",
        "    # validation data\n",
        "    val_acc_epoch = 0\n",
        "    val_loss_epoch = 0\n",
        "\n",
        "    for batch, (encodings_bacth, labels_batch) in enumerate(valid_batches, start=1):\n",
        "      encoder_outputs, _ = encoder(encodings_bacth)    \n",
        "      context_vector, attention_weights = custom_attn(encoder_outputs)\n",
        "      preds_batch = pred_decoder(context_vector)\n",
        "\n",
        "      val_loss_epoch += loss_func(labels_batch, preds_batch)\n",
        "      val_acc_epoch += model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "    val_loss_epoch = tf.get_static_value(val_loss_epoch) / batch\n",
        "    history_dict['val_loss'].append(val_loss_epoch)\n",
        "\n",
        "    val_acc_epoch = tf.get_static_value(val_acc_epoch) / batch\n",
        "    history_dict['val_accuracy'].append(val_acc_epoch)\n",
        "\n",
        "    print('Epoch: %s/%s loss: %.4f acc: %.4f val_loss: %.4f val_acc: %.4f\\tTime epoch: %.2f batch: %.2f'%(epoch+1, \n",
        "                                                                                                        EPOCHS, \n",
        "                                                                                                        loss_epoch, \n",
        "                                                                                                        acc_epoch, \n",
        "                                                                                                        val_loss_epoch, \n",
        "                                                                                                        val_acc_epoch,\n",
        "                                                                                                        epoch_time,\n",
        "                                                                                                        batch_time))    \n",
        "plt_history(history_dict)\n",
        "\n",
        "# test model\n",
        "y_true, y_pred, attentions = model_predicitons(test_data.batch(15000))\n",
        "print(classification_report(y_true, y_pred))"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 1/20 loss: 0.6917 acc: 0.5310 val_loss: 0.6888 val_acc: 0.5808\tTime epoch: 11.43 batch: 0.63\n",
            "Epoch: 2/20 loss: 0.6812 acc: 0.6142 val_loss: 0.6654 val_acc: 0.6390\tTime epoch: 9.64 batch: 0.54\n",
            "Epoch: 3/20 loss: 0.6077 acc: 0.6577 val_loss: 0.5243 val_acc: 0.6718\tTime epoch: 9.59 batch: 0.53\n",
            "Epoch: 4/20 loss: 0.4563 acc: 0.6859 val_loss: 0.4156 val_acc: 0.7022\tTime epoch: 9.61 batch: 0.53\n",
            "Epoch: 5/20 loss: 0.3274 acc: 0.7189 val_loss: 0.3576 val_acc: 0.7339\tTime epoch: 9.54 batch: 0.53\n",
            "Epoch: 6/20 loss: 0.2667 acc: 0.7477 val_loss: 0.3467 val_acc: 0.7593\tTime epoch: 9.73 batch: 0.54\n",
            "Epoch: 7/20 loss: 0.2620 acc: 0.7695 val_loss: 0.3568 val_acc: 0.7777\tTime epoch: 9.70 batch: 0.54\n",
            "Epoch: 8/20 loss: 0.2324 acc: 0.7857 val_loss: 0.3361 val_acc: 0.7929\tTime epoch: 9.63 batch: 0.53\n",
            "Epoch: 9/20 loss: 0.1972 acc: 0.8000 val_loss: 0.3509 val_acc: 0.8060\tTime epoch: 9.68 batch: 0.54\n",
            "Epoch: 10/20 loss: 0.1749 acc: 0.8119 val_loss: 0.3920 val_acc: 0.8171\tTime epoch: 9.82 batch: 0.55\n",
            "Epoch: 11/20 loss: 0.1681 acc: 0.8220 val_loss: 0.3934 val_acc: 0.8263\tTime epoch: 9.61 batch: 0.53\n",
            "Epoch: 12/20 loss: 0.1549 acc: 0.8306 val_loss: 0.4048 val_acc: 0.8343\tTime epoch: 9.51 batch: 0.53\n",
            "Epoch: 13/20 loss: 0.1473 acc: 0.8381 val_loss: 0.3730 val_acc: 0.8412\tTime epoch: 9.74 batch: 0.54\n",
            "Epoch: 14/20 loss: 0.1387 acc: 0.8445 val_loss: 0.3763 val_acc: 0.8473\tTime epoch: 9.76 batch: 0.54\n",
            "Epoch: 15/20 loss: 0.1366 acc: 0.8503 val_loss: 0.3993 val_acc: 0.8527\tTime epoch: 9.66 batch: 0.54\n",
            "Epoch: 16/20 loss: 0.1374 acc: 0.8552 val_loss: 0.4317 val_acc: 0.8573\tTime epoch: 9.44 batch: 0.52\n",
            "Epoch: 17/20 loss: 0.1334 acc: 0.8596 val_loss: 0.4508 val_acc: 0.8613\tTime epoch: 9.62 batch: 0.53\n",
            "Epoch: 18/20 loss: 0.1290 acc: 0.8634 val_loss: 0.4965 val_acc: 0.8650\tTime epoch: 9.67 batch: 0.54\n",
            "Epoch: 19/20 loss: 0.2129 acc: 0.8665 val_loss: 0.5611 val_acc: 0.8667\tTime epoch: 9.70 batch: 0.54\n",
            "Epoch: 20/20 loss: 0.2177 acc: 0.8671 val_loss: 0.5297 val_acc: 0.8677\tTime epoch: 9.58 batch: 0.53\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8AAAAFPCAYAAACCr6e/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeZyO9f7H8denscuuKHtSliJLqiNZ\nkshEi0pGEXLqtB2OTk5U6qTTdkocdZJKpKScOpLSr8NYSqFCZY8hW4uUGbvx/f3xvYfbmBkz5r7v\na5b38/G4HzP3dX+vz/257+G+7s91fRdzziEiIiIiIiJS0J0UdAIiIiIiIiIisaACWERERERERAoF\nFcAiIiIiIiJSKKgAFhERERERkUJBBbCIiIiIiIgUCiqARUREREREpFBQASz5kpnFmVmKmdWMZNsg\nmdmZZhbxdcnMrIOZJYXdX2VmrbPT9gSea5yZ3X+i+2cR91EzGx/puCIiknfpWJ+juPn+WC8SK0WC\nTkAKBzNLCbtbCtgHpIbu/9E5Nykn8ZxzqcDJkW5bGDjnzo5EHDPrD/RyzrUNi90/ErFFRCT/0bE+\n79CxXiRzKoAlJpxzhw9KobOO/Z1zn2TW3syKOOcOxiI3ERERyT0d6yU/07/HwkNdoCVPCHVxfcvM\n3jSzZKCXmV1kZp+b2W9mttXMRplZ0VD7ImbmzKx26P7rocc/NLNkM1tgZnVy2jb0eGczW21mv5vZ\naDP71Mz6ZJJ3dnL8o5mtNbMdZjYqbN84M3vWzLab2TqgUxbvz1Azm5xu2xgzeyb0e38zWxF6Pd+H\nzthmFmuTmbUN/V7KzCaGcvsOaJ6u7TAzWxeK+52ZdQ1tPxf4F9A61OXsl7D3dnjY/reFXvt2M3vP\nzE7LzntzPGZ2dSif38xslpmdHfbY/Wa2xcx2mtnKsNd6oZl9Fdr+o5k9ld3nExGR3NOxXsf6rI71\nWb3PafmY2Sdm9quZbTOzv4Y9zwOh92SnmS02s9Mtg+7mZjY/7e8cej/nhp7nV2CYmdUzs9mh5/gl\n9L6VC9u/Vug1/hx6/DkzKxHKuUFYu9PMbLeZVcrs9UpwVABLXnI18AZQDngLOAjcA1QGWuEPGn/M\nYv+ewANARWAj8PectjWzU4EpwL2h510PtMwiTnZyvAJ/sGmKP9h3CG2/HegINAHOB67P4nneBOLN\n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\nwJVmZhcAPYH+Zd3u7lOBqQA9e/b0AQMGxP2YhYWFZFKcRMZSTqmJ8+WX5e2vH3Pcmvg8JSOWckpt\nnETGSmROIiIiIlWVzCHQq4B2UdttI/t2Y2YnAuOBoe6+OYn5iCRUopaIERERERGR1EhmATwX6Ghm\nHcysLnA+MDP6ADPrDtxLKH7L6U8TyUyJXCJGRERERESSL2kFsLtvA64AXgCWADPcfZGZ3WRmQyOH\n3QY0Bv5mZvPNbGY54UQyjpaIERERERGpXpJ6DrC7Pws8u8e+66Oun5jMxxdJtvz8cCksnK3zGkVE\nREREMlxGTIIlIiIiIiKSKbZu3crKlStp2rQpS5YsiTteouIkMlZNyKl+/fq0bduWOnXqVPo+KoBF\nRERERESirFy5kiZNmtCyZUv233//uONt2LCBJk2aJCCzxMWq7jm5O2vXrmXlypV06NCh0o+RzEmw\nRKSSCgqgfXsYNKg/7duHbRERERFJj02bNtGyZUvMLN2pSDnMjJYtW7Jp06Yq3U89wCJpVlAAI0dC\nSQmAsXx52AZNqCUiIiKSLip+M18sfyP1AIuk2fjxpcXvLiUlYb+IiIiIZJ+1a9fSrVs3unXrxkEH\nHUSbNm12bm/ZsqVSMS666CI+/PDDCo+ZMmUKBVk29FAFsEiarVhRtf37ouHUIiIiIqlV2v7abz8S\n0v5q2bIl8+fPZ/78+Vx22WWMHj1653bdunWBcA7sjh07yo3x4IMPcvjhh1f4OJdffjn5WTbkUAWw\nSJrl5FRtf0VKh1MvXw7uu4ZTqwgWERERSY7d218ktf21bNkyjjnmGPLz8zn66KP57LPPGDlyJD17\n9uToo4/mpptu2nns8ccfz/z589m2bRvNmjVj7NixdO3alWOPPZYvv/wSgOuuu45JkybtPH7s2LH0\n6tWLww8/nDfeeAOA7777jrPOOoujjjqKs88+m549ezJ//vy9crvhhhs45phj6NSpE5dddhnuDsDS\npUsZNGgQXbt2JS8vj6KiIgB+97vf0blzZ7p27cr4FA59VAEskmYTJ0LDhrvva9gw7K8qDacWERER\nSa1Ut7+WLl3K6NGjWbx4MW3atOHmm29m3rx5LFiwgJdeeonFixfvdZ/169fTv39/FixYwLHHHsu0\nadPKjO3uvP3229x22207i+m77rqLgw46iMWLF/Ob3/yG9957r8z7Xn311cydO5f333+f9evX8/zz\n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\nvXrx3HPPMWzYMKZPn865556LmVG/fn2eeuop9t9/f9asWUOfPn0YOnQoZlZmrHvuuYeGDRuyZMkS\nFi5cSF5e3s7bJk6cSIsWLdi+fTuDBw9m4cKFXHXVVdxxxx3MmjWLVq1a7RbrnXfe4cEHH+Stt97C\n3enduzf9+/enTp06fPTRRzz66KPcd999nHvuuTzxxBNccMEFu93/+OOP580338TMuP/++7n11lv5\n/e9/z4QJE2jatClvvvkmTZo0Yd26dXz11VdceumlzJkzhw4dOvD1119X/Ykvg3qARaRaSNS5xJC4\nibkSOcFXoopp9SSLxE7/PyKSSaKHQUcPf3Z3xo0bR5cuXTjxxBNZtWrVzp7UssyZM2dnIdqlSxe6\ndOmy87YZM2aQl5dH9+7dWbRoEYsXV7zc+muvvcYZZ5xBo0aNaNy4MWeeeSb/+te/AOjQoQPdunUD\noEePHhQVFe11/5UrV/KDH/yAzp07c9ttt7Fo0SIAXn75ZS6//PKdxzVv3pw333yTE044gQ4dOgDh\nS4FEUA+wiFQLpT0woWfGycmxmHtmErXOcSLXS05UD7fWXRaJnf5/RKQsFfXUVtaGDRtp0qRJle4z\nbNgwRo8ezbvvvktJSQk9evQAQtH61Vdf8c4771CnTh3at2/Ppk2bqpxTUVERt99+O3PnzqV58+aM\nGDEipjil6tWrt/N6rVq1yhwCfeWVVzJmzBiGDh1KYWEhN954Y8yPFyv1AItItZGopZkSNTFXItdL\nTlQPt9ZdFomd/n9EJJM0btyYgQMHcvHFF+82+dX69es58MADqVOnDrNmzWJ5Wd+gRznhhBN45JFH\nAPjggw9YuHAhABs2bKBRo0Y0bdqUL774gueee27nfZo0acKGDRv2itWvXz+efvppSkpK+O6773jq\nqafo169fpX+n9evX06ZNGwAeeuihnftPOukkpkyZsnN73bp19OnThzlz5vDJJ58AaAi0iEg8EllM\nZ1JRnshh2SLZRv8/IpJphg8fzoIFC3YrgM877zzmzZtH586d+ctf/sIRRxxRYYxRo0ZRXFzMkUce\nyfXXX7+zJ7lz5850796dI444gh//+Mf07dt3531GjhzJkCFDdk6CVSovL48RI0bQq1cvevfuzSWX\nXEL37t0r/fvceOONnHPOOfTo0WO384uvu+461q1bR+/evenatSuzZs3igAMOYOrUqZx55pl07dqV\n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\n2YbenjqYnAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.79      0.85      0.82     12500\n",
            "           1       0.84      0.77      0.80     12500\n",
            "\n",
            "    accuracy                           0.81     25000\n",
            "   macro avg       0.81      0.81      0.81     25000\n",
            "weighted avg       0.81      0.81      0.81     25000\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YiPXQ4TSTQpm",
        "colab_type": "text"
      },
      "source": [
        "#### CustomAttention - Whole Models"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gzJHHxeLc09I",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 867
        },
        "outputId": "e6420145-5656-4f77-dde5-ecd06f3f0e84"
      },
      "source": [
        "class AttentionBinaryModel(tf.keras.Model):\n",
        "  def __init__(self, max_len, vocab_size, embedding_dim, rnn_size, attention_size):\n",
        "    super(AttentionBinaryModel, self).__init__()\n",
        "    self.rnn_size = rnn_size\n",
        "    self.max_len = max_len\n",
        "    # embedding layer\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    # rnn layers\n",
        "    self.gru = tf.keras.layers.GRU(self.rnn_size,\n",
        "                                  return_sequences=True,\n",
        "                                  return_state=True,\n",
        "                                  recurrent_initializer='glorot_uniform')\n",
        "    # attention layers\n",
        "    self.a1 = tf.keras.layers.Dense(units=attention_size, activation=tf.nn.relu)\n",
        "    # last layer that outputs scoring value\n",
        "    self.V = tf.keras.layers.Dense(1, activation=None)\n",
        "\n",
        "    # prediciton layers\n",
        "    # self.l1 = tf.keras.layers.Dense(units=16, activation=tf.nn.relu)\n",
        "    self.l2 = tf.keras.layers.Dense(units=1, activation=tf.nn.sigmoid)\n",
        "\n",
        "    return\n",
        "\n",
        "  def call(self, input_batch):\n",
        "    intermediate_values = self.embedding(input_batch)\n",
        "    encoder_outputs, last_output = self.gru(intermediate_values)\n",
        "\n",
        "    # concatenate sequences vertically\n",
        "    encoder_outputs = tf.concat(encoder_outputs, axis = 2)\n",
        "    # reshape to [batch_size*max_len, rnn_size]\n",
        "    intermediate_values = tf.reshape(encoder_outputs, [-1, self.rnn_size])\n",
        "    # feed to each layer\n",
        "    intermediate_values = self.a1(intermediate_values)\n",
        "    intermediate_values = self.V(intermediate_values)\n",
        "    # reshape to [batch_size, max_len, 1]\n",
        "    scores = tf.reshape(intermediate_values, [-1, self.max_len, 1])\n",
        "    alignment = tf.nn.softmax(logits=scores, axis=1)\n",
        "    context_vector = tf.reduce_sum(encoder_outputs * alignment, 1)\n",
        "    # match shape [batch_size, max_len]\n",
        "    alignment = tf.squeeze(alignment)\n",
        "\n",
        "    # predicitons\n",
        "    # intermediate_values = self.l1(context_vector)\n",
        "    output_batch = self.l2(context_vector)\n",
        "\n",
        "    return output_batch, alignment\n",
        "\n",
        "def loss_func(target, logits):\n",
        "  bce = tf.losses.BinaryCrossentropy(from_logits=False)\n",
        "  return bce(y_true=target, y_pred=logits)\n",
        "\n",
        "@tf.function\n",
        "def train_batch(input_batch, labels_batch):\n",
        "  # use global scope variables\n",
        "  global whole_model, model_optimizer, model_optimizer\n",
        "\n",
        "  with tf.GradientTape() as tape:\n",
        "    preds_batch, attention = whole_model(input_batch)\n",
        "    loss = loss_func(labels_batch, preds_batch)\n",
        "    acc = model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "  variables = whole_model.variables\n",
        "  gradients = tape.gradient(loss, variables)\n",
        "  model_optimizer.apply_gradients(zip(gradients, variables))\n",
        "  return loss, acc, attention\n",
        "\n",
        "def model_predicitons(data_generator):\n",
        "  \"\"\"Predict on test data.\n",
        "  Make sure train_generator is already batched formatted.\n",
        "  \"\"\"\n",
        "  # models used\n",
        "  global whole_model\n",
        "  y_pred = []\n",
        "  y_true = []\n",
        "  attentions = []\n",
        "  # make predicitons\n",
        "  for batch, (inputs_batch, labels_batch) in enumerate(data_generator):\n",
        "    preds_batch, attention_batch = whole_model(inputs_batch)\n",
        "    preds_batch = tf.keras.backend.round(preds_batch)\n",
        "    [y_pred.append(val[0]) for val in preds_batch]\n",
        "    [y_true.append(val) for val in labels_batch]\n",
        "    [attentions.append(val) for val in attention_batch]\n",
        "  return np.array(y_true), np.array(y_pred), np.array(attentions)\n",
        "\n",
        "# model history\n",
        "history_dict = {'accuracy':[],\n",
        "                'val_accuracy':[], \n",
        "                'loss':[], \n",
        "                'val_loss':[]}\n",
        "\n",
        "with tf.device('/device:GPU:0'):\n",
        "  # create whole model\n",
        "  whole_model = AttentionBinaryModel(max_len=MAX_LEN, \n",
        "                                      vocab_size=text_encoder.vocab_size,\n",
        "                                      embedding_dim=EMBEDDING_SIZE,\n",
        "                                      rnn_size=rnn_units,\n",
        "                                      attention_size=attention_dim)\n",
        "  # loss function\n",
        "  model_optimizer = tf.optimizers.Adam()\n",
        "  # metrics to monitor\n",
        "  model_metrics = tf.metrics.Accuracy()\n",
        "\n",
        "  EPOCHS = 20\n",
        "\n",
        "  for epoch in range(EPOCHS):\n",
        "    epoch_time = 0\n",
        "\n",
        "    # train data\n",
        "    loss_epoch = 0\n",
        "    acc_epoch = 0\n",
        "\n",
        "    for batch, (encodings_batch, labels_batch) in enumerate(train_batches, start=1):\n",
        "      start_time = time.time()\n",
        "      # train on batch\n",
        "      loss_batch, acc_batch, attention_batch = train_batch(encodings_batch, labels_batch)\n",
        "      # keep track of loss and accuracy\n",
        "      loss_epoch += loss_batch\n",
        "      acc_epoch += acc_batch\n",
        "      end_time = time.time()\n",
        "      epoch_time += (end_time - start_time)\n",
        "        \n",
        "    batch_time = epoch_time / batch\n",
        "    loss_epoch = tf.get_static_value(loss_epoch) / batch\n",
        "    history_dict['loss'].append(loss_epoch)\n",
        "    acc_epoch = tf.get_static_value(acc_epoch) / batch\n",
        "    history_dict['accuracy'].append(acc_epoch)\n",
        "\n",
        "    # validation data\n",
        "    val_acc_epoch = 0\n",
        "    val_loss_epoch = 0\n",
        "\n",
        "    for batch, (encodings_bacth, labels_batch) in enumerate(valid_batches, start=1):\n",
        "      preds_batch, attention = whole_model(encodings_bacth)\n",
        "      val_loss_epoch += loss_func(labels_batch, preds_batch)\n",
        "      val_acc_epoch += model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "    val_loss_epoch = tf.get_static_value(val_loss_epoch) / batch\n",
        "    history_dict['val_loss'].append(val_loss_epoch)\n",
        "\n",
        "    val_acc_epoch = tf.get_static_value(val_acc_epoch) / batch\n",
        "    history_dict['val_accuracy'].append(val_acc_epoch)\n",
        "\n",
        "    print('Epoch: %s/%s loss: %.4f acc: %.4f val_loss: %.4f val_acc: %.4f Time epoch: %.2f batch: %.2f'%(epoch+1, \n",
        "                                                                                                        EPOCHS, \n",
        "                                                                                                        loss_epoch, \n",
        "                                                                                                        acc_epoch, \n",
        "                                                                                                        val_loss_epoch, \n",
        "                                                                                                        val_acc_epoch,\n",
        "                                                                                                        epoch_time,\n",
        "                                                                                                        batch_time))    \n",
        "plt_history(history_dict)\n",
        "\n",
        "# test model\n",
        "y_true, y_pred, attentions = model_predicitons(test_data.batch(15000))\n",
        "print(classification_report(y_true, y_pred))"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 1/20 loss: 0.6918 acc: 0.5131 val_loss: 0.6891 val_acc: 0.5410 Time epoch: 10.90 batch: 0.61\n",
            "Epoch: 2/20 loss: 0.6823 acc: 0.5819 val_loss: 0.6681 val_acc: 0.6163 Time epoch: 9.50 batch: 0.53\n",
            "Epoch: 3/20 loss: 0.6163 acc: 0.6398 val_loss: 0.5279 val_acc: 0.6584 Time epoch: 9.74 batch: 0.54\n",
            "Epoch: 4/20 loss: 0.4363 acc: 0.6759 val_loss: 0.3922 val_acc: 0.6950 Time epoch: 9.69 batch: 0.54\n",
            "Epoch: 5/20 loss: 0.3078 acc: 0.7138 val_loss: 0.3408 val_acc: 0.7304 Time epoch: 9.48 batch: 0.53\n",
            "Epoch: 6/20 loss: 0.2403 acc: 0.7455 val_loss: 0.3220 val_acc: 0.7585 Time epoch: 9.59 batch: 0.53\n",
            "Epoch: 7/20 loss: 0.1966 acc: 0.7704 val_loss: 0.3348 val_acc: 0.7806 Time epoch: 9.36 batch: 0.52\n",
            "Epoch: 8/20 loss: 0.1714 acc: 0.7901 val_loss: 0.3653 val_acc: 0.7980 Time epoch: 9.59 batch: 0.53\n",
            "Epoch: 9/20 loss: 0.1543 acc: 0.8056 val_loss: 0.3734 val_acc: 0.8121 Time epoch: 9.50 batch: 0.53\n",
            "Epoch: 10/20 loss: 0.1442 acc: 0.8183 val_loss: 0.3912 val_acc: 0.8234 Time epoch: 9.76 batch: 0.54\n",
            "Epoch: 11/20 loss: 0.1431 acc: 0.8284 val_loss: 0.4874 val_acc: 0.8323 Time epoch: 9.77 batch: 0.54\n",
            "Epoch: 12/20 loss: 0.1694 acc: 0.8359 val_loss: 0.4759 val_acc: 0.8389 Time epoch: 9.44 batch: 0.52\n",
            "Epoch: 13/20 loss: 0.1498 acc: 0.8422 val_loss: 0.4279 val_acc: 0.8449 Time epoch: 9.49 batch: 0.53\n",
            "Epoch: 14/20 loss: 0.1332 acc: 0.8479 val_loss: 0.4541 val_acc: 0.8504 Time epoch: 9.35 batch: 0.52\n",
            "Epoch: 15/20 loss: 0.1293 acc: 0.8529 val_loss: 0.4250 val_acc: 0.8552 Time epoch: 10.41 batch: 0.58\n",
            "Epoch: 16/20 loss: 0.1195 acc: 0.8576 val_loss: 0.4540 val_acc: 0.8596 Time epoch: 9.66 batch: 0.54\n",
            "Epoch: 17/20 loss: 0.3438 acc: 0.8600 val_loss: 0.5752 val_acc: 0.8576 Time epoch: 9.86 batch: 0.55\n",
            "Epoch: 18/20 loss: 0.3608 acc: 0.8562 val_loss: 0.4116 val_acc: 0.8559 Time epoch: 9.88 batch: 0.55\n",
            "Epoch: 19/20 loss: 0.2878 acc: 0.8563 val_loss: 0.3827 val_acc: 0.8568 Time epoch: 9.79 batch: 0.54\n",
            "Epoch: 20/20 loss: 0.2307 acc: 0.8577 val_loss: 0.3854 val_acc: 0.8585 Time epoch: 9.42 batch: 0.52\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\ns2fPpkOHDsyZM4eGDRvmOVYREcmbffv83N1582D+fD+HNy3NJ7QdO8KgQdC1q1+OKOiycBytuSsF\ngXqAQyB9CST1AotITpQrV46uXbtyww03HO39Bd97esopp1CiRAnmz5/P+swWNAxywQUXMHXqVAC+\n/fZbli9fDsDvv/9O2bJlqVixIlu3buX9998/ekz58uUznWfbqVMn3n77bfbv38++fft466236NSp\n0wn7nUzFihWpXLny0d7jl19+mc6dO5OWlsYvv/zCBRdcwCOPPMKePXtITk7mp59+olmzZtx1112c\nc845/PDDD7k+p4iI5N7hw8VISoJ774VOnaByZejZE8aN80nv6NF+yPPu3fDhh/D3v0P79n6os+bt\nSkGmHuAQaNDAV7d7910YPjza0YhIQTBo0CD69+9/dCg0QGJiIr1796Z9+/a0a9fupD2hN998M3/8\n4x9p1KgRjRo1OtqT3KJFC1q1akWbNm2oXbs2HTp0OHrMsGHD6NmzJ6eddhrz588/ur1169Zcf/31\ntAsUMxgyZAitWrXKdrhzVl588UVuuukm9u/fT7169Xj++edJTU1l8ODB7Nq1CzPj1ltvpVKlStxz\nzz3Mnz+fYsWK0aRJEy6++OJcn09ERHJm1y546y2YMQPmz+/A4cN+FZO2beGOOyAhwVdqLls2+3Y0\nb1cKMiXAIdKnj79j9vvvUKFCtKMRkVjXr18/nHPHbatWrRqfffYZe/fuPWE4dXJyMuCrNn/77bcA\nlC5d+rgEOtgLL7yQaTvDhw9neNCduuAE94477uCOO+44bv/086X3Go8YMSLT840ZM+bozy1btuTz\nzz8/YZ9FixadENOECRMybU9EREIjOdnP5Z0+HT74wM/VLV4cUlKKUb26T1qHDs1dm+nzc0eNgg0b\nHLVqGWPHat6uFAwaAh0ivXv7Pyhz5kQ7EhEREREpyg4cgDff9EWrTjnFJ6Zffw0XXujn76akABjb\ntvkiV1Om5P4ciYm+/s28eQtYt07JrxQcSoBD5LzzoGpVf4dNRERERCSSjhyB2bPh2muhRg24/HJY\nsABuuAEWLoT16+G77+DQoeOP27/f9+SKFBUaAh0icXHQq5efB5yS4oeWiIiIiIiES2qqT3KnT4c3\n3oCdO6FSJd/zO3AgdOly/GfSrKo057V6s0hBpDQthPr08eufffopXHBBtKMRkaw45zCzaIchOZBx\n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\n7z73HJg5Q4fqwFcknan4TX2R/I50BVjSSmZm1drTlU4UiEi6codnn4UuXdbRqqLxqkVEEmD16tV0\n796d7t2707JlS1q1arVjecuWLWHFuOCCC/jyyy93u86ECRPIS7MufiqAJa2MHw/165dtq18/aJed\ndKJARNLVt9/CsmXQv//3yU5FRKqRvLxgzIC99gq+RltTNm/enLlz5zJ37lwuueQSRo8evWO5Tp06\nQHAP7M8//1xpjCeeeIJD9zCP26WXXkpumnXvUwEsaSU3FyZOhLZtg+5tbdsGy2n2d79HOlEgIumq\nVSv4/ns44YT/JTsVEakmyo6dQlzHTlm8eDGHH344ubm5dOrUie+++44RI0aQk5NDp06duOWWW3as\ne/TRRzN37ly2bdtGkyZNuO666+jWrRtHHnkk338fnOS78cYbuf/++3esf91119GrVy8OPfRQPvzw\nQwB++uknzjjjDDp27MiZZ55JTk4Oc+fO3SW3m2++mcMPP5zOnTtzySWX4O4ALFq0iP79+9OtWzey\ns7MpLCwE4E9/+hNdunShW7dujEnggDwqgCXt5OZCYSG8++57FBZGV/yWnO3r379PTM72pQqdKBCR\ndFavHtStW/lVFRGR0hI9yOqiRYsYPXo0CxcupFWrVtx+++3Mnj2befPm8dZbb7Fw4a7jBa5bt44+\nffowb948jjzySB5//PEKY7s7H3/8MXfdddeOYvqhhx6iZcuWLFy4kJtuuolPPvmkwm2vuOIKZs2a\nxaeffsq6det44403ABg+fDijR49m3rx5fPjhh+y///68+uqrvP7663z88cfMmzePq6++OkY/nT1T\nASwSoZo+UnIsTxSIiIiI1FSJHjulXbt25OTk7Fh+9tlnyc7OJjs7m88//7zCArhevXoMGjQIgJ49\ne+64Clve6aefvss6M2bMYFhoWPxu3brRqVOnCrd955136NWrF926deO9995jwYIFrFmzhlWrVnHK\nKacAwby99evX5+233+bCCy+kXr16ADRr1qzqP4gIqQAWiZCmVApfTb1SLiIiIpLosVMaNGiw4/lX\nX33FAw88wLvvvsv8+fM58cQTK5wWqOS+YYCMjAy2bdtWYey99957j+tUZMOGDYwaNYrJkyczf/58\nLrzwwipPT5QoKoBFIqSRksNT06+Ui4iISHpL5tgpP/74I40aNWKfffbhu+++Y9q0aTF/j6OOOopJ\nkyYB8Omnn1Z4hXnjxo3stdde7Lvvvqxfv54XX3wRgKZNm7Lffvvx6quvAsH8yhs2bOD444/n8ccf\nZ+PGjQD88MMPMc+7MiqARSKkkZLDoyvlIiIiUpOVHTuFhI6dkp2dTceOHTnssMP49a9/zVFHHRXz\n97jssstYvnw5HTt25I9//CMdO3akcePGZdZp3rw55513Hh07dmTQoEH07t17x2t5eXncc889dO3a\nlaOPPpqVK1dy8sknc+KJJ5KTk0P37t257777Yp53ZWol7J1Eapjx44MrmaWLu0jP9uXlBQXh0qV9\nyMwMYkT6oRnLWLGgK+UiIiJS0+Xmxu94a9y4cTue/+IXv+Bf//rXjmUz4+mnn65wuxkzZux4vnbt\n2h3Phw0bxrBhw1i/fj233XZbheu3bNmSxYsXA8F9u8888wx169blq6++YuDAgbRp02aX97v99tu5\n/fbbd2k/9NBDKSgo2KV9zJgxCR39uYQKYJEIlXzIBcWmk5lpERWbJV2Eg0J6Zxfh0u+RjFixkpkZ\ndH+uqF1EREREUltxcTEDBgxg27ZtuDuPPPIItWpV3zJSXaBFohCLkZJj2UU4Fbsba05hERERkeqr\nSZMmzJkzh3nz5jF//nwGDhyY7JSiogJYJMli2UU4Fbsba05hEREREUkVKoBFkiyWg2ml6sBcsZpT\nWNMpiYiIiEg0VACLJFksuwjX5O7Gmk5JRERERKKlAlgkyWLZRbgmdzeO9f3NuposIiIikn5UAIuk\ngFh1EY51rFQSy/ubdTVZREREUlm/fv2YNm1ambb777+fkSNH7na7hg0bAvDtt99y5plnVrhO3759\nmT179m7j3H///WwodeXhpJNOKjOVUnWmAlhEqoVY3t+ciqNli4iIiJQYPnw4+fn5Zdry8/MZPnx4\nWNsfeOCBvPDCCxG/f/kCeOrUqTRp0iTieKlEBbCIVAuxvL85FUfLFhERESlx5pln8s9//pMtW7YA\nUFhYyLfffssxxxyzY17e7OxsunTpwiuvvLLL9oWFhXTu3BmAjRs3MmzYMDp06MBpp53Gxo0bd6w3\ncuRIcnJy6NSpEzfffDMADz74IN9++y39+vWjX79+AGRlZbFq1SoA7r33Xjp37kznzp25//77AViy\nZAkdOnTg4osvplOnTgwcOLDM+5R49dVX6d27Nz169OC4445jxYoVQDDX8AUXXMARRxxB165defHF\nFwF44403yM7Oplu3bgwYMCAmP9vqO4OxiKSVkq7cY8bA0qVOZqYxfnxkXbwzM4PuzxW1V1VeXklO\nfcjMJOKcRCQ16G9aRMq78kqYOze6GNu31yMjY+dy9+4Qqh0r1KxZM3r16sXrr7/OkCFDyM/P56yz\nzsLMqFu3LpMnT2afffZh1apVHHHEEQwePBgzqzDWww8/TP369fn888+ZP38+2dnZO14bP348zZo1\nY/v27QwYMID58+dz+eWXc++99zJ9+nT23XffMrHmzJnDE088wUcffYS707t3b/r06UPt2rX56quv\nePbZZ3n00Uc566yzePHFFzn33HPLbH/00Uczc+ZMzIzHHnuMO++8k3vuuYdbb72Vxo0bM3PmTBo1\nasSaNWtYuXIlF198Me+//z7t2rXjhx9+qPoPvgK6Aiwi1Uas7m+O1dVk3UssUrPob1pEUknpbtCl\nuz+7OzfccANdu3bluOOOY/ny5TuupFbk/fff31GIdu3ala5du+54bdKkSWRnZ9OjRw8WLFjAwoUL\nd5vTjBkzOO2002jQoAENGzbk9NNP54MPPgCgXbt2dO/eHYCePXtSWFi4y/ZFRUWccMIJdOnShbvu\nuosFCxYA8Pbbb3PppZfuWK9p06bMnDmTY489lnbt2gHBSYFY0BVgEUk7sbqavLt7iXXFSKT60d+0\niFRkd1dqw7V+/UYaNWpUpW2GDBnC6NGj+c9//sOGDRvo2bMnEBStK1euZM6cOdSuXZusrCw2bdpU\n5ZwKCwu5++67mTVrFk2bNuX888+PKE6Jvffee8fzjIyMCrtAX3bZZVx11VUMHjyYgoICxo0bF/H7\nRUpXgEUkLcXiarLuJRapWfQ3LSKppGHDhvTr148LL7ywzOBX69atY//996d27dpMnz6dJRXd11XK\nscceyzPPPAPAZ599xvz58wFYv349DRo0oHHjxqxYsYLXX399xzaNGjVi/fr1u8Q65phjePnll9mw\nYQM//fQTkydP5phjjgn7e1q3bh2tWrUC4KmnntrRfvzxxzNhwoQdy2vWrOGII47g/fff57///S+A\nukCLiCRbLEemFpHk09+0iKSa4cOHM2/evDIF8Nlnn83s2bPp0qULf//73znssMN2G2PkyJEUFxfT\noUMHxo4du+NKcpcuXejRoweHHXYY55xzDkcdddSObUaMGMGJJ564YxCsEtnZ2Zx//vn06tWL3r17\n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\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.81      0.82      0.82     12500\n",
            "           1       0.82      0.81      0.82     12500\n",
            "\n",
            "    accuracy                           0.82     25000\n",
            "   macro avg       0.82      0.82      0.82     25000\n",
            "weighted avg       0.82      0.82      0.82     25000\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XHQ8aRXg9Jdm",
        "colab_type": "text"
      },
      "source": [
        "#### BahdanauAttention - Separate Models"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ihvziLxN9Ll_",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 867
        },
        "outputId": "8b8af653-1098-4199-9479-8fdfd4f1b801"
      },
      "source": [
        "class BahdanauAttention(tf.keras.layers.Layer):\n",
        "  \"\"\"Implements BahdanauAttention attention scoring.\n",
        "\n",
        "  Temrinology:\n",
        "    'max_len' refers to sequence maximum length\n",
        "    'rnn_size' / 'hidden_size' / 'query_depth' / 'alignments_size' refers \n",
        "      to RNN size.\n",
        "    'key' / 'keys' are 'encoder outputs' related values with \n",
        "      shape `[batch_size x max_len x hidden size]`\n",
        "    'query' / 'value'(s) refers to decoder values with \n",
        "      shape `[batch_size x hidden size]`\n",
        "\n",
        "  Source:\n",
        "  https://github.com/tensorflow/docs/blob/master/site/en/tutorials/text/nmt_with_attention.ipynb\n",
        "  \"\"\"\n",
        "  def __init__(self, units):\n",
        "    \"\"\"Construct the AttentionMechanism.\n",
        "\n",
        "    Args:\n",
        "      units: number of neurons in layer of neural network scoring aproximation.\n",
        "    \"\"\"\n",
        "    super(BahdanauAttention, self).__init__()\n",
        "    self.W1 = tf.keras.layers.Dense(units)\n",
        "    self.W2 = tf.keras.layers.Dense(units)\n",
        "    self.V = tf.keras.layers.Dense(1)\n",
        "\n",
        "  def call(self, encoder_output):\n",
        "    \"\"\"Score the query based on the decoder and encoder outputs.\n",
        "\n",
        "    Args:\n",
        "      decoder_input: Tensor with shape `[batch_size, rnn_size]`.\n",
        "      encoder_output: Tensor with shape `[batch_size, max_len, rnn_size]`\n",
        "    Returns:\n",
        "      context: The weighted average sum of encoder output with \n",
        "        shape `[batch_size, rnn_size]`\n",
        "      alignment: The attention with shape `[batch_size, max_len]`\n",
        "    \"\"\"\n",
        "    \n",
        "    # score shape == (batch_size, max_length, 1)\n",
        "    # we get 1 at the last axis because we are applying score to self.V\n",
        "    # the shape of the tensor before applying self.V is (batch_size, max_length, units)\n",
        "    score = self.V(tf.nn.tanh(self.W1(encoder_output)))\n",
        "    # alignment shape == (batch_size, max_length, 1)\n",
        "    alignment = tf.nn.softmax(score, axis=1)\n",
        "    # context_vector shape after sum == (batch_size, hidden_size)\n",
        "    context_vector = alignment * encoder_output\n",
        "    context_vector = tf.reduce_sum(context_vector, axis=1)\n",
        "    # match shape [batch_size, max_len]\n",
        "    alignment = tf.squeeze(alignment)\n",
        "    return context_vector, alignment\n",
        "\n",
        "\n",
        "class Encoder(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, embedding_dim, rnn_size):\n",
        "    super(Encoder, self).__init__()\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    self.gru = tf.keras.layers.GRU(rnn_size,\n",
        "                                  return_sequences=True,\n",
        "                                  return_state=True,\n",
        "                                  recurrent_initializer='glorot_uniform')\n",
        "  def call(self, input_batch):\n",
        "    intermediate_value = self.embedding(input_batch)\n",
        "    # not used initial_state = hidden\n",
        "    encoder_outputs, last_output = self.gru(intermediate_value)\n",
        "    return encoder_outputs, last_output\n",
        "\n",
        "\n",
        "class Prediction(tf.keras.Model):\n",
        "  def __init__(self):\n",
        "    super(Prediction, self).__init__()\n",
        "    # self.l1 = tf.keras.layers.Dense(units=units, activation=tf.nn.relu)\n",
        "    self.l2 = tf.keras.layers.Dense(units=1, activation=tf.nn.sigmoid)\n",
        "    return\n",
        "\n",
        "  def call(self, input_batch):\n",
        "    # intermediate_value = self.l1(input_batch)\n",
        "    output_batch = self.l2(input_batch)\n",
        "    return output_batch\n",
        "\n",
        "\n",
        "def loss_func(target, logits):\n",
        "  bce = tf.losses.BinaryCrossentropy(from_logits=False)\n",
        "  return bce(y_true=target, y_pred=logits)\n",
        "\n",
        "\n",
        "# need signature becuase each batch different shape\n",
        "# @tf.function(input_signature=[\n",
        "#     tf.TensorSpec(shape=[None, None], dtype=tf.int64),\n",
        "#     tf.TensorSpec(shape=[None,], dtype=tf.int64)])\n",
        "@tf.function\n",
        "def train_batch(input_batch, labels_batch):\n",
        "  # use global scope variables\n",
        "  global encoder, custom_attn, pred_decoder, model_optimizer\n",
        "  loss = 0\n",
        "  with tf.GradientTape() as tape:\n",
        "    encoder_outputs, last_output = encoder(input_batch)    \n",
        "    context_vector, attention_weights = custom_attn(encoder_outputs)\n",
        "    preds_batch = pred_decoder(context_vector)\n",
        "\n",
        "    loss = loss_func(labels_batch, preds_batch)\n",
        "    acc = model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "  variables = encoder.variables + custom_attn.variables + pred_decoder.variables\n",
        "  gradients = tape.gradient(loss, variables)\n",
        "  model_optimizer.apply_gradients(zip(gradients, variables))\n",
        "  return loss, acc, attention_weights\n",
        "\n",
        "def model_predicitons(data_generator):\n",
        "  \"\"\"Predict on test data.\n",
        "  Make sure train_generator is already batched formatted.\n",
        "  \"\"\"\n",
        "  # models used\n",
        "  global encoder, custom_attn, pred_decoder\n",
        "  y_pred = []\n",
        "  y_true = []\n",
        "  attentions = []\n",
        "  # make predicitons\n",
        "  for batch, (inputs_batch, labels_batch) in enumerate(data_generator):\n",
        "    encoder_outputs, _ = encoder(inputs_batch)    \n",
        "    context_vector, attention_batch = custom_attn(encoder_outputs)\n",
        "    preds_batch = pred_decoder(context_vector)\n",
        "    preds_batch = tf.keras.backend.round(preds_batch)\n",
        "    [y_pred.append(val[0]) for val in preds_batch]\n",
        "    [y_true.append(val) for val in labels_batch]\n",
        "    [attentions.append(val) for val in attention_batch]\n",
        "  return np.array(y_true), np.array(y_pred), np.array(attentions)\n",
        "\n",
        "EPOCHS = 20\n",
        "history_dict = {'accuracy':[],\n",
        "                'val_accuracy':[], \n",
        "                'loss':[], \n",
        "                'val_loss':[]}\n",
        "\n",
        "with tf.device('/device:GPU:0'):\n",
        "  \n",
        "  encoder = Encoder(vocab_size=text_encoder.vocab_size, \n",
        "                    embedding_dim=EMBEDDING_SIZE, \n",
        "                    rnn_size=rnn_units)\n",
        "  custom_attn = BahdanauAttention(units=10)\n",
        "  pred_decoder = Prediction()\n",
        "  model_optimizer = tf.optimizers.Adam()\n",
        "  model_metrics = tf.metrics.Accuracy()\n",
        "\n",
        "  for epoch in range(EPOCHS):\n",
        "    epoch_time = 0\n",
        "\n",
        "    # train data\n",
        "    loss_epoch = 0\n",
        "    acc_epoch = 0\n",
        "\n",
        "    for batch, (encodings_batch, labels_batch) in enumerate(train_batches, start=1):\n",
        "      start_time = time.time()\n",
        "      # train on batch\n",
        "      loss_batch, acc_batch, attention_batch = train_batch(encodings_batch, labels_batch)\n",
        "      # keep track of loss and accuracy\n",
        "      loss_epoch += loss_batch\n",
        "      acc_epoch += acc_batch\n",
        "      end_time = time.time()\n",
        "      epoch_time += (end_time - start_time)\n",
        "        \n",
        "    batch_time = epoch_time / batch\n",
        "    loss_epoch = tf.get_static_value(loss_epoch) / batch\n",
        "    history_dict['loss'].append(loss_epoch)\n",
        "    acc_epoch = tf.get_static_value(acc_epoch) / batch\n",
        "    history_dict['accuracy'].append(acc_epoch)\n",
        "\n",
        "    # validation data\n",
        "    val_acc_epoch = 0\n",
        "    val_loss_epoch = 0\n",
        "\n",
        "    for batch, (encodings_bacth, labels_batch) in enumerate(valid_batches, start=1):\n",
        "      encoder_outputs, _ = encoder(encodings_bacth)    \n",
        "      context_vector, attention_weights = custom_attn(encoder_outputs)\n",
        "      preds_batch = pred_decoder(context_vector)\n",
        "\n",
        "      val_loss_epoch += loss_func(labels_batch, preds_batch)\n",
        "      val_acc_epoch += model_metrics(labels_batch, tf.keras.backend.round(preds_batch))\n",
        "\n",
        "    val_loss_epoch = tf.get_static_value(val_loss_epoch) / batch\n",
        "    history_dict['val_loss'].append(val_loss_epoch)\n",
        "\n",
        "    val_acc_epoch = tf.get_static_value(val_acc_epoch) / batch\n",
        "    history_dict['val_accuracy'].append(val_acc_epoch)\n",
        "\n",
        "    print('Epoch: %s/%s loss: %.4f acc: %.4f val_loss: %.4f val_acc: %.4f\\tTime epoch: %.2f batch: %.2f'%(epoch+1, \n",
        "                                                                                                        EPOCHS, \n",
        "                                                                                                        loss_epoch, \n",
        "                                                                                                        acc_epoch, \n",
        "                                                                                                        val_loss_epoch, \n",
        "                                                                                                        val_acc_epoch,\n",
        "                                                                                                        epoch_time,\n",
        "                                                                                                        batch_time))    \n",
        "plt_history(history_dict)\n",
        "\n",
        "# test model\n",
        "y_true, y_pred, attentions = model_predicitons(test_data.batch(15000))\n",
        "print(classification_report(y_true, y_pred))"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 1/20 loss: 0.6916 acc: 0.5340 val_loss: 0.6883 val_acc: 0.5832\tTime epoch: 10.91 batch: 0.61\n",
            "Epoch: 2/20 loss: 0.6786 acc: 0.6199 val_loss: 0.6576 val_acc: 0.6402\tTime epoch: 9.01 batch: 0.50\n",
            "Epoch: 3/20 loss: 0.5786 acc: 0.6559 val_loss: 0.4928 val_acc: 0.6721\tTime epoch: 9.12 batch: 0.51\n",
            "Epoch: 4/20 loss: 0.3888 acc: 0.6905 val_loss: 0.3754 val_acc: 0.7101\tTime epoch: 8.98 batch: 0.50\n",
            "Epoch: 5/20 loss: 0.2737 acc: 0.7283 val_loss: 0.3329 val_acc: 0.7444\tTime epoch: 9.07 batch: 0.50\n",
            "Epoch: 6/20 loss: 0.2103 acc: 0.7590 val_loss: 0.3255 val_acc: 0.7714\tTime epoch: 8.86 batch: 0.49\n",
            "Epoch: 7/20 loss: 0.1677 acc: 0.7830 val_loss: 0.3402 val_acc: 0.7927\tTime epoch: 8.86 batch: 0.49\n",
            "Epoch: 8/20 loss: 0.1358 acc: 0.8022 val_loss: 0.3842 val_acc: 0.8099\tTime epoch: 9.09 batch: 0.51\n",
            "Epoch: 9/20 loss: 0.1130 acc: 0.8175 val_loss: 0.4681 val_acc: 0.8236\tTime epoch: 9.13 batch: 0.51\n",
            "Epoch: 10/20 loss: 0.1031 acc: 0.8296 val_loss: 0.5219 val_acc: 0.8344\tTime epoch: 8.88 batch: 0.49\n",
            "Epoch: 11/20 loss: 0.1077 acc: 0.8391 val_loss: 0.4270 val_acc: 0.8430\tTime epoch: 8.88 batch: 0.49\n",
            "Epoch: 12/20 loss: 0.0835 acc: 0.8473 val_loss: 0.4854 val_acc: 0.8508\tTime epoch: 9.07 batch: 0.50\n",
            "Epoch: 13/20 loss: 0.0612 acc: 0.8548 val_loss: 0.5422 val_acc: 0.8580\tTime epoch: 8.93 batch: 0.50\n",
            "Epoch: 14/20 loss: 0.0517 acc: 0.8615 val_loss: 0.5788 val_acc: 0.8642\tTime epoch: 9.03 batch: 0.50\n",
            "Epoch: 15/20 loss: 0.0431 acc: 0.8673 val_loss: 0.6333 val_acc: 0.8696\tTime epoch: 8.87 batch: 0.49\n",
            "Epoch: 16/20 loss: 0.0410 acc: 0.8723 val_loss: 0.6448 val_acc: 0.8743\tTime epoch: 8.95 batch: 0.50\n",
            "Epoch: 17/20 loss: 0.0365 acc: 0.8767 val_loss: 0.6813 val_acc: 0.8784\tTime epoch: 8.87 batch: 0.49\n",
            "Epoch: 18/20 loss: 0.0327 acc: 0.8806 val_loss: 0.6902 val_acc: 0.8821\tTime epoch: 9.01 batch: 0.50\n",
            "Epoch: 19/20 loss: 0.0334 acc: 0.8840 val_loss: 0.7447 val_acc: 0.8853\tTime epoch: 9.15 batch: 0.51\n",
            "Epoch: 20/20 loss: 0.0331 acc: 0.8870 val_loss: 0.7711 val_acc: 0.8882\tTime epoch: 9.06 batch: 0.50\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\ntW3bloKCgr3LTz75JD169KBHjx4sX748bgFcp04dBg4cCMDJJ5+89yxsWeeff/4B67z++usMGTIE\ngK5du9KxY/xzlnPnzqVnz5507dqVV155haVLl7Jx40bWr1/P97//fSCYt7du3bq8+OKLXHHFFdSp\nUweAJk2aVPyNSFKlGAVaRDJL8wmLiIiIJCbTx0316tXbe3/FihXce++9vP322zRq1IhLL7007rRA\npdcNA+Tl5bFr1664sWvVqnXIdeLZtm0b1113HYsWLaJFixbccsstFZ6eKFN0BlhEDqD5hEVEREQS\nk83jpq+//poGDRpwxBFH8OmnnzJ79uzQn6NPnz5Mnz4dgPfeey/uGebt27dTo0YNmjVrxpYtW5gx\nYwYAjRs35sgjj+TZZ58FgvmVt23bxtlnn82UKVPYvn07AF999VXoeZdHBbCIHCBXR6YWkcrHzAaY\n2X/MbKWZjYrz+OVm9qWZLY7erox5bHdMu2aSEJGctP9xExk9burRowcdOnTgpJNO4sc//jF9+vQJ\n/TmGDx/O2rVr6dChA7/5zW/o0KEDDRs23G+dpk2bctlll9GhQwcGDhxIr1699j42depUJkyYQJcu\nXTjttNP48ssv+d73vseAAQMoKCigW7du3HPPPaHnXR51gRaRuIqKglsk8ormbRWRpJhZHjAJOBtY\nA8w3s5nuXvb0wd/c/bo4Iba7e7d05ykikqrS46Z0uP322/feP/744/nXv/61d9nMePzxx+Nu9/rr\nr++9v2nTpr33hwwZwpAhQ9iyZQu//e1v465/9NFHs3LlSiC4bveJJ56gdu3arFixgnPOOYdWrVod\n8Hzjxo1j3LhxB7SfeOKJRCKRA9pHjx6d0dGfS+kMsIikneYUFqm2egIr3f0jd98JTAMGZzknERGp\ngJKSEvr06UPXrl254IILeOCBBzjssMp7HrXyZi4ilULp3HjB9AD75hQGdakWqQZaAJ/ELK8BesVZ\n7wIzOwP4ABjp7qXb1DazBcAuYJy7PxPvScxsGDAMoHnz5nHPNFRUSUlJTsUJM5ZyymycMGMpp8zF\nadiwIVu2bGH37t1s2bIl5ZzCihNmrETj5OXlHfB+lt0um+/Tjh07KvT/rQJYRNLqYHPjqQAWEeBZ\n4El3/8bMrgIeBfpFH8t397Vmdhzwkpm95+4flg3g7pOByQAFBQUexmUbkUgklMs/wooTZizllNk4\n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\nAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.83      0.77      0.80     12500\n",
            "           1       0.78      0.85      0.81     12500\n",
            "\n",
            "    accuracy                           0.81     25000\n",
            "   macro avg       0.81      0.81      0.81     25000\n",
            "weighted avg       0.81      0.81      0.81     25000\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    }
  ]
}