{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"FINAL-ensemble_fc_predictions_v2-with-laugh-with-boost-with-TEST.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU","widgets":{"application/vnd.jupyter.widget-state+json":{"71c781a6e1f949dc988c795e1cbed930":{"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_815ccf4c91104e0db1a4065a7f943725","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_41caaab83dc44ea9923817256beeea60","IPY_MODEL_d3dd8f3c8b154cc39338fb8ad1b11e74"]}},"815ccf4c91104e0db1a4065a7f943725":{"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}},"41caaab83dc44ea9923817256beeea60":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_581232e286c04db4989bdbe11f119e49","_dom_classes":[],"description":"Processing 2661 examples on 2 cores: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":2661,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":2661,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_2dd5f4b0fb4643cab2f7d8b2932f7d81"}},"d3dd8f3c8b154cc39338fb8ad1b11e74":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_6c9d548da24541aa8eada24a5b5985d6","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 2661/2661 [05:31&lt;00:00,  8.04it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_d73d30e03fd84384a2a6f5e88b8d371e"}},"581232e286c04db4989bdbe11f119e49":{"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"}},"2dd5f4b0fb4643cab2f7d8b2932f7d81":{"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}},"6c9d548da24541aa8eada24a5b5985d6":{"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"}},"d73d30e03fd84384a2a6f5e88b8d371e":{"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}},"db9f9863216b4616a4f8d46bbfa7c3ce":{"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_c32e02a584554cada71c0529d1eeeb58","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_ba25bd32b1ed460aa025d3a4dbc628c1","IPY_MODEL_e8486c84c97d4db383515c5207c1790e"]}},"c32e02a584554cada71c0529d1eeeb58":{"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}},"ba25bd32b1ed460aa025d3a4dbc628c1":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_92799b3ca797492f83ad922eda616a88","_dom_classes":[],"description":"Processing 766 examples on 2 cores: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":766,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":766,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_ea273c48ba6846508cf8c013a2018c66"}},"e8486c84c97d4db383515c5207c1790e":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_9f279e4610cd4e208e7e333f44474461","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 766/766 [02:36&lt;00:00,  4.88it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_1c7d408c45844205b2d85d5b3d7ba48f"}},"92799b3ca797492f83ad922eda616a88":{"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"}},"ea273c48ba6846508cf8c013a2018c66":{"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}},"9f279e4610cd4e208e7e333f44474461":{"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"}},"1c7d408c45844205b2d85d5b3d7ba48f":{"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/kevincong95/cs231n-emotiw/blob/master/notebooks/2.4-tj-la-ak-kc-vl-FINAL-ensemble_fc_predictions.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"]},{"cell_type":"markdown","metadata":{"id":"0rWTS99OI8l-","colab_type":"text"},"source":["## Video Sentiment Analysis in the Wild\n","Ensembling Notebook (with BOOST) | FC | CS231n\n","\n","### Modalities Used\n","- Scene (ResNet - three LSTM heads) [model](https://storage.googleapis.com/cs231n-emotiw/models/scene-classifier-resnet-lstm-x3.h5)\n","- Pose [model](https://storage.googleapis.com/cs231n-emotiw/models/pose-classifier-64lstm-0.01reg.h5)\n","- Audio [model](https://storage.googleapis.com/cs231n-emotiw/models/openl3-cnn-lstm-tuned-lr.h5)\n","- Image Captioning [model](https://storage.googleapis.com/cs231n-emotiw/models/sentiment-transformer_sentiment-transformer_756.pth) and [model metadata](https://storage.googleapis.com/cs231n-emotiw/models/sentiment-transformer-16.metadata.bin)\n","\n","Test Accuracy = **61.6%**\n","\n","FC Model [model](https://storage.googleapis.com/cs231n-emotiw/models/ensemble-fc-laugh-boost-final-v2.h5)"]},{"cell_type":"markdown","metadata":{"id":"AKBv4jZKrhQ0","colab_type":"text"},"source":["### Copy Pre-Processed Files"]},{"cell_type":"code","metadata":{"id":"QdlpDjXpdiqz","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"executionInfo":{"status":"ok","timestamp":1593061101124,"user_tz":420,"elapsed":1384,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"69c30f32-cd9b-4164-b15a-f102ca4cf22c"},"source":["!ls"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sample_data\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"C40EhGh9kopZ","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":357},"executionInfo":{"status":"ok","timestamp":1593061103542,"user_tz":420,"elapsed":1370,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"3ab2dbcb-3bb1-4b89-b3cf-b8cde8912b18"},"source":["!nvidia-smi"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Thu Jun 25 04:58:22 2020       \n","+-----------------------------------------------------------------------------+\n","| NVIDIA-SMI 450.36.06    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","|                               |                      |               MIG M. |\n","|===============================+======================+======================|\n","|   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 |\n","| N/A   37C    P0    25W / 250W |      0MiB / 16280MiB |      0%      Default |\n","|                               |                      |                 ERR! |\n","+-------------------------------+----------------------+----------------------+\n","                                                                               \n","+-----------------------------------------------------------------------------+\n","| Processes:                                                                  |\n","|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |\n","|        ID   ID                                                   Usage      |\n","|=============================================================================|\n","|  No running processes found                                                 |\n","+-----------------------------------------------------------------------------+\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"XQnFc3BdeCVL","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":513},"executionInfo":{"status":"ok","timestamp":1592690537191,"user_tz":420,"elapsed":235759,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"2a1c8c64-618c-4a6c-b729-f83849e1df83"},"source":["\n","# FULL_PATH = 'My Drive/Machine-Learning-Projects/cs231n-project/datasets/emotiw'\n","FULL_PATH = 'My Drive/cs231n-project/datasets/emotiw'\n","\n","print(\"Using final dataset...\")\n","!cp /content/drive/'$FULL_PATH'/train-final-* .\n","!cp /content/drive/'$FULL_PATH'/val-final-* .\n","\n","!wget https://storage.googleapis.com/cs231n-emotiw/data/Train_labels.txt\n","!wget https://storage.googleapis.com/cs231n-emotiw/data/Val_labels.txt\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n","\n","Enter your authorization code:\n","··········\n","Mounted at /content/drive\n","Using final dataset...\n","--2020-06-20 22:02:14--  https://storage.googleapis.com/cs231n-emotiw/data/Train_labels.txt\n","Resolving storage.googleapis.com (storage.googleapis.com)... 64.233.189.128, 2404:6800:4008:c03::80\n","Connecting to storage.googleapis.com (storage.googleapis.com)|64.233.189.128|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 21653 (21K) [text/plain]\n","Saving to: ‘Train_labels.txt’\n","\n","Train_labels.txt    100%[===================>]  21.15K  --.-KB/s    in 0s      \n","\n","2020-06-20 22:02:14 (99.3 MB/s) - ‘Train_labels.txt’ saved [21653/21653]\n","\n","--2020-06-20 22:02:15--  https://storage.googleapis.com/cs231n-emotiw/data/Val_labels.txt\n","Resolving storage.googleapis.com (storage.googleapis.com)... 64.233.189.128, 2404:6800:4008:c06::80\n","Connecting to storage.googleapis.com (storage.googleapis.com)|64.233.189.128|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 6265 (6.1K) [text/plain]\n","Saving to: ‘Val_labels.txt’\n","\n","Val_labels.txt      100%[===================>]   6.12K  --.-KB/s    in 0s      \n","\n","2020-06-20 22:02:16 (52.0 MB/s) - ‘Val_labels.txt’ saved [6265/6265]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"yXxCkE_DUvEv","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":104},"outputId":"9812567a-52b0-43ce-e203-74cb990d8404"},"source":["!ls"],"execution_count":null,"outputs":[{"output_type":"stream","text":["drive\t\t       train-final-frames.zip  val-final-fer.zip\n","sample_data\t       train-final-pose.zip    val-final-frames.zip\n","train-final-audio.zip  Train_labels.txt        val-final-pose.zip\n","train-final-faces.zip  val-final-audio.zip     Val_labels.txt\n","train-final-fer.zip    val-final-faces.zip\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"sqHRPvB5Cm4F","colab_type":"code","colab":{}},"source":["# RUN THIS FOR FINAL FILES (zip includes root folder)\n","\n","!unzip train-final-audio.zip\n","!unzip train-final-faces.zip\n","!unzip train-final-frames.zip\n","!unzip train-final-pose.zip\n","!unzip -d train-final-fer train-final-fer.zip\n","\n","!unzip val-final-audio.zip\n","!unzip val-final-faces.zip\n","!unzip val-final-frames.zip\n","!unzip val-final-pose.zip\n","!unzip -d val-final-fer val-final-fer.zip\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"gF6Fy4-SLJVP","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":170},"executionInfo":{"status":"ok","timestamp":1592691050508,"user_tz":420,"elapsed":3599,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"87905680-7a90-4957-8a5c-23d4b0f9e198"},"source":["!ls"],"execution_count":null,"outputs":[{"output_type":"stream","text":["drive\t\t\t  train-final-frames\t  val-final-faces.zip\n","sample_data\t\t  train-final-frames.zip  val-final-fer\n","train-final-audio\t  train-final-pose\t  val-final-fer.zip\n","train-final-audio.zip\t  train-final-pose.zip\t  val-final-frames\n","train-final-captions.pkl  Train_labels.txt\t  val-final-frames.zip\n","train-final-faces\t  val-final-audio\t  val-final-pose\n","train-final-faces.zip\t  val-final-audio.zip\t  val-final-pose.zip\n","train-final-fer\t\t  val-final-captions.pkl  Val_labels.txt\n","train-final-fer.zip\t  val-final-faces\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"0jEaDQAsS8XQ","colab_type":"text"},"source":["### Run Classifiers"]},{"cell_type":"code","metadata":{"id":"w0_gfpBjXP6S","colab_type":"code","colab":{}},"source":["%tensorflow_version 2.x"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"dPXBx950Xd8z","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"executionInfo":{"status":"ok","timestamp":1593061444738,"user_tz":420,"elapsed":1595,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"3e966e59-6423-4cc4-d0fa-90f3589ee79f"},"source":["import tensorflow\n","print(tensorflow.__version__)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["2.2.0\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"pp_USHxwRAVB","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"executionInfo":{"status":"ok","timestamp":1593061445517,"user_tz":420,"elapsed":2107,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"d5598b6b-e77c-47c7-e65c-7f84417947b4"},"source":["!pwd"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/content\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"_Nybv6fMJV4X","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":51},"executionInfo":{"status":"ok","timestamp":1593061465377,"user_tz":420,"elapsed":21530,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"991026cd-79db-49a9-bca4-8bd07c038149"},"source":["import urllib\n","from getpass import getpass\n","import os\n","user = input('User name: ')\n","password = getpass('Password: ')\n","password = urllib.parse.quote(password) # your password is converted into url format\n","\n","cmd_string = 'git clone https://{0}:{1}@github.com/kevincong95/cs231n-emotiw.git'.format(user, password)\n","\n","os.system(cmd_string)\n","cmd_string, password = \"\", \"\" # removing the password from the variable"],"execution_count":null,"outputs":[{"output_type":"stream","text":["User name: tbj128\n","Password: ··········\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Z7kRhNvrVnbt","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":51},"executionInfo":{"status":"ok","timestamp":1592980340742,"user_tz":420,"elapsed":12876,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"112cc328-561c-4d2c-953f-e64c9747d55b"},"source":["!mv train-* cs231n-emotiw\n","!mv val-* cs231n-emotiw"],"execution_count":null,"outputs":[{"output_type":"stream","text":["mv: cannot stat 'train-*': No such file or directory\n","mv: cannot stat 'val-*': No such file or directory\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"tauiFf5eVtpP","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":51},"executionInfo":{"status":"ok","timestamp":1592980342470,"user_tz":420,"elapsed":14279,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"34e2e143-8e02-4caf-b001-8f858e18e565"},"source":["!mv Train* cs231n-emotiw\n","!mv Val* cs231n-emotiw"],"execution_count":null,"outputs":[{"output_type":"stream","text":["mv: cannot stat 'Train*': No such file or directory\n","mv: cannot stat 'Val*': No such file or directory\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"qiVbcNhfVwa2","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"executionInfo":{"status":"ok","timestamp":1592980343244,"user_tz":420,"elapsed":12548,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"9a8bc85c-a5c1-4e1f-ca9d-dc9c4a7e1f81"},"source":["!pwd"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/content\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"hPM9Vm7gVxuR","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"executionInfo":{"status":"ok","timestamp":1593061466498,"user_tz":420,"elapsed":14327,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"9bd291d2-a67a-4fe4-8b7e-1b643f7c44a6"},"source":["import os\n","os.chdir('/content/cs231n-emotiw')\n","!pwd"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/content/cs231n-emotiw\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"oxC5BZIRKyrq","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":632},"executionInfo":{"status":"ok","timestamp":1593061472155,"user_tz":420,"elapsed":16478,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"75e6acd2-72ac-4d65-ed84-b70d3ada50ed"},"source":["!pip install pytorch-transformers"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Collecting pytorch-transformers\n","\u001b[?25l  Downloading https://files.pythonhosted.org/packages/a3/b7/d3d18008a67e0b968d1ab93ad444fc05699403fa662f634b2f2c318a508b/pytorch_transformers-1.2.0-py3-none-any.whl (176kB)\n","\u001b[K     |████████████████████████████████| 184kB 3.4MB/s \n","\u001b[?25hRequirement already satisfied: regex in /usr/local/lib/python3.6/dist-packages (from pytorch-transformers) (2019.12.20)\n","Requirement already satisfied: boto3 in /usr/local/lib/python3.6/dist-packages (from pytorch-transformers) (1.14.5)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from pytorch-transformers) (1.18.5)\n","Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from pytorch-transformers) (2.23.0)\n","Requirement already satisfied: torch>=1.0.0 in /usr/local/lib/python3.6/dist-packages (from pytorch-transformers) (1.5.1+cu101)\n","Collecting sacremoses\n","\u001b[?25l  Downloading https://files.pythonhosted.org/packages/7d/34/09d19aff26edcc8eb2a01bed8e98f13a1537005d31e95233fd48216eed10/sacremoses-0.0.43.tar.gz (883kB)\n","\u001b[K     |████████████████████████████████| 890kB 8.6MB/s \n","\u001b[?25hRequirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from pytorch-transformers) (4.41.1)\n","Collecting sentencepiece\n","\u001b[?25l  Downloading https://files.pythonhosted.org/packages/d4/a4/d0a884c4300004a78cca907a6ff9a5e9fe4f090f5d95ab341c53d28cbc58/sentencepiece-0.1.91-cp36-cp36m-manylinux1_x86_64.whl (1.1MB)\n","\u001b[K     |████████████████████████████████| 1.1MB 17.0MB/s \n","\u001b[?25hRequirement already satisfied: jmespath<1.0.0,>=0.7.1 in /usr/local/lib/python3.6/dist-packages (from boto3->pytorch-transformers) (0.10.0)\n","Requirement already satisfied: s3transfer<0.4.0,>=0.3.0 in /usr/local/lib/python3.6/dist-packages (from boto3->pytorch-transformers) (0.3.3)\n","Requirement already satisfied: botocore<1.18.0,>=1.17.5 in /usr/local/lib/python3.6/dist-packages (from boto3->pytorch-transformers) (1.17.5)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->pytorch-transformers) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->pytorch-transformers) (2.9)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->pytorch-transformers) (2020.4.5.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->pytorch-transformers) (1.24.3)\n","Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from torch>=1.0.0->pytorch-transformers) (0.16.0)\n","Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from sacremoses->pytorch-transformers) (1.12.0)\n","Requirement already satisfied: click in /usr/local/lib/python3.6/dist-packages (from sacremoses->pytorch-transformers) (7.1.2)\n","Requirement already satisfied: joblib in /usr/local/lib/python3.6/dist-packages (from sacremoses->pytorch-transformers) (0.15.1)\n","Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python3.6/dist-packages (from botocore<1.18.0,>=1.17.5->boto3->pytorch-transformers) (2.8.1)\n","Requirement already satisfied: docutils<0.16,>=0.10 in /usr/local/lib/python3.6/dist-packages (from botocore<1.18.0,>=1.17.5->boto3->pytorch-transformers) (0.15.2)\n","Building wheels for collected packages: sacremoses\n","  Building wheel for sacremoses (setup.py) ... \u001b[?25l\u001b[?25hdone\n","  Created wheel for sacremoses: filename=sacremoses-0.0.43-cp36-none-any.whl size=893260 sha256=20809d1e9e8974e576c67497eb62ae2c0e2836c4bfc42d7d8074fd8524334765\n","  Stored in directory: /root/.cache/pip/wheels/29/3c/fd/7ce5c3f0666dab31a50123635e6fb5e19ceb42ce38d4e58f45\n","Successfully built sacremoses\n","Installing collected packages: sacremoses, sentencepiece, pytorch-transformers\n","Successfully installed pytorch-transformers-1.2.0 sacremoses-0.0.43 sentencepiece-0.1.91\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"9xwIeRF_x40m","colab_type":"code","colab":{}},"source":["# Create the concatenated input layer to feed into FC\n","\n","from src.classifiers.audio_classifier import AudioClassifier\n","from src.classifiers.frames_classifier import FramesClassifier\n","from src.classifiers.pose_classifier import PoseClassifier\n","from src.classifiers.face_classifier import FaceClassifier\n","from src.classifiers.image_captioning_classifier import ImageCaptioningClassifier, FineTuningConfig\n","from src.classifiers.utils import get_num_samples\n","import numpy as np\n","\n","IS_TINY = False\n","def run_classifier(layers_to_extract, audio_folder='train-final-audio', frames_folder='train-final-frames', pose_folder='train-final-pose', face_folder='train-final-fer', image_caption_pkl=\"train-final-captions.pkl\", image_caption_prefix=\"train_\", labels_file=\"Train_labels.txt\"):\n","    audio_classifier = AudioClassifier(audio_folder, model_location='https://storage.googleapis.com/cs231n-emotiw/models/openl3-cnn-lstm-tuned-lr.h5', is_test=False)\n","    frames_classifier = FramesClassifier(frames_folder, model_location='https://storage.googleapis.com/cs231n-emotiw/models/scene-classifier-resnet-lstm-x3.h5', is_test=False)\n","    frames_classifier_vgg = FramesClassifier(frames_folder, location_prefix=\"vgg\", model_location='https://storage.googleapis.com/cs231n-emotiw/models/vgg19-lstm-cp-0003.h5', is_test=False, batch_size=4)\n","    pose_classifier = PoseClassifier(pose_folder, model_location='https://storage.googleapis.com/cs231n-emotiw/models/pose-classifier-64lstm-0.01reg.h5', is_test=False)\n","    face_classifier = FaceClassifier(face_folder, model_location='/content/drive/My Drive/cs231n-project/models/face-classifier-playground/cp-0001.h5', is_test=False)\n","    image_captioning_classifier = ImageCaptioningClassifier(image_caption_pkl, image_caption_prefix, model_metadata_location=\"https://storage.googleapis.com/cs231n-emotiw/models/sentiment-transformer-16.metadata.bin\", model_location='https://storage.googleapis.com/cs231n-emotiw/models/sentiment-transformer_sentiment-transformer_756.pth', is_test=False)\n","    \n","    # classifiers = [audio_classifier, frames_classifier, pose_classifier] # face_classifier]\n","    classifiers = [audio_classifier, frames_classifier, frames_classifier_vgg, pose_classifier, face_classifier, image_captioning_classifier]\n","    # classifiers = [frames_classifier_vgg]\n","    \n","    sample_to_true_label = {}\n","    with open(labels_file) as f:\n","        l = 0\n","        for line in f:\n","            if l == 0:\n","                # Skip headers\n","                l += 1\n","                continue\n","            line_arr = line.split(\" \")\n","            sample_to_true_label[line_arr[0].strip()] = int(line_arr[1].strip()) - 1 # subtract one to make labels from 0 to 2\n","            l += 1\n","\n","    classifier_outputs = []\n","    classifier_samples = []\n","    classifier_dim_sizes = []\n","    output_dim_size = 0\n","    num_samples = 0\n","    sample_to_row = {}\n","\n","    for i, classifier in enumerate(classifiers):\n","        output, samples = classifier.predict(layers_to_extract[i])\n","        output_dim_size += output.shape[1]\n","        classifier_dim_sizes.append(output.shape[1])\n","        num_samples = len(samples)\n","        classifier_outputs.append(output)\n","        classifier_samples.append(samples)\n","\n","\n","    X_train = np.zeros(shape=(num_samples, output_dim_size))\n","    y_train = []\n","\n","    print(f\"Number of samples: {num_samples}\")\n","    print(f\"Dim shapes: \")\n","    print(classifier_dim_sizes)\n","\n","    for i, sample in enumerate(classifier_samples[0]):\n","        sample_to_row[sample] = i\n","        y_train.append(sample_to_true_label[sample])\n","\n","    last_classifier_index = 0\n","    for c, output in enumerate(classifier_outputs):\n","        samples = classifier_samples[c]\n","        print(len(output))\n","        for i, row in enumerate(output):\n","            sample = samples[i]\n","            X_train[sample_to_row[sample], last_classifier_index:last_classifier_index+classifier_dim_sizes[c]] += row\n","        last_classifier_index += classifier_dim_sizes[c]\n","\n","    return X_train, tf.keras.utils.to_categorical(y_train, num_classes=3)\n","\n","\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"1VGA1fl2pNvE","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":1000,"referenced_widgets":["71c781a6e1f949dc988c795e1cbed930","815ccf4c91104e0db1a4065a7f943725","41caaab83dc44ea9923817256beeea60","d3dd8f3c8b154cc39338fb8ad1b11e74","581232e286c04db4989bdbe11f119e49","2dd5f4b0fb4643cab2f7d8b2932f7d81","6c9d548da24541aa8eada24a5b5985d6","d73d30e03fd84384a2a6f5e88b8d371e","db9f9863216b4616a4f8d46bbfa7c3ce","c32e02a584554cada71c0529d1eeeb58","ba25bd32b1ed460aa025d3a4dbc628c1","e8486c84c97d4db383515c5207c1790e","92799b3ca797492f83ad922eda616a88","ea273c48ba6846508cf8c013a2018c66","9f279e4610cd4e208e7e333f44474461","1c7d408c45844205b2d85d5b3d7ba48f"]},"executionInfo":{"status":"ok","timestamp":1592703526102,"user_tz":420,"elapsed":661289,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"e435e8ea-241c-4e11-d9ef-b60855f0d3d6"},"source":["import tensorflow as tf\n","# For each classifier, extract the specific desired layer \n","# (refer to the model summary for the layer names)\n","\n","layers_to_extract = [\n","    \"dense\", # Audio\n","    \"concatenate_5\", # ResNet\n","    \"global_average_pooling3d_1\", # VGG\n","    \"bidirectional_1\", # Pose\n","    \"dense_27\", # FER\n","    \"classification_head\" # Image Caption\n","]\n","\n","prefix = \"final\"\n","if IS_TINY:\n","    prefix = \"tiny\"\n","\n","# X_train, y_train = run_classifier(layers_to_extract, audio_folder=f\"train-{prefix}-audio\", frames_folder=f\"train-{prefix}-frames\", pose_folder=f\"train-{prefix}-pose\", face_folder=f\"train-{prefix}-fer\" ,labels_file=\"Train_labels.txt\")\n","# X_valid, y_valid = run_classifier(layers_to_extract, audio_folder=f\"val-{prefix}-audio\", frames_folder=f\"val-{prefix}-frames\", pose_folder=f\"val-{prefix}-pose\", face_folder=f\"val-{prefix}-fer\" , labels_file=\"Val_labels.txt\")\n","\n","\n","X_train, y_train = run_classifier(layers_to_extract, audio_folder=f\"train-{prefix}-audio\", frames_folder=f\"train-{prefix}-frames\", pose_folder=f\"train-{prefix}-pose\" , face_folder=f\"train-{prefix}-fer\" , image_caption_pkl=\"train-final-captions.pkl\", image_caption_prefix=\"train_\", labels_file=\"Train_labels.txt\")\n","X_valid, y_valid = run_classifier(layers_to_extract, audio_folder=f\"val-{prefix}-audio\", frames_folder=f\"val-{prefix}-frames\", pose_folder=f\"val-{prefix}-pose\" , face_folder=f\"val-{prefix}-fer\" , image_caption_pkl=\"val-final-captions.pkl\", image_caption_prefix=\"val_\", labels_file=\"Val_labels.txt\")\n","\n","print(X_train.shape)\n","print(y_train.shape)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["AudioClassifier created with audio_folder = train-final-audio , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/openl3-cnn-lstm-tuned-lr.h5\n","WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n","WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n","WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n","FramesClassifier created with frames_folder = train-final-frames , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/scene-classifier-resnet-lstm-x3.h5\n","FramesClassifier created with frames_folder = train-final-frames , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/vgg19-lstm-cp-0003.h5\n","PoseClassifier created with pose_folder = train-final-pose , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/pose-classifier-64lstm-0.01reg.h5\n","load data\n","FacesClassifier created with face_folder = train-final-fer , is_test = False , model_location = /content/drive/My Drive/cs231n-project/models/face-classifier-playground/cp-0001.h5\n","ImageCaptioningClassifier created with caption_pkl = train-final-captions.pkl , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/sentiment-transformer_sentiment-transformer_756.pth\n","Skipping unzipping files as input is a folder\n","Customizing model by returning layer dense\n","Skipping unzipping files as input is a folder\n","Found 2661 frames belonging to 2661 videos belonging to 3 classes.\n","Min frames determined to be 7\n","Customizing model by returning layer concatenate_5\n","Skipping unzipping files as input is a folder\n","Found 2661 frames belonging to 2661 videos belonging to 3 classes.\n","Min frames determined to be 7\n","Customizing model by returning layer global_average_pooling3d_1\n","Skipping unzipping files as input is a folder\n","['3', '2', '1']\n","Found 2661 frames belonging to 2661 videos belonging to 3 classes.\n","Min frames determined to be 7\n","Customizing model by returning layer bidirectional_1\n"],"name":"stdout"},{"output_type":"stream","text":["/content/cs231n-emotiw/src/generators/pose_generator.py:135: RuntimeWarning: invalid value encountered in double_scalars\n","  x_new.append((lx[i] - origin_x) / len_x)\n","/content/cs231n-emotiw/src/generators/pose_generator.py:136: RuntimeWarning: invalid value encountered in double_scalars\n","  x_new.append((ly[i] - origin_y) / len_y)\n"],"name":"stderr"},{"output_type":"stream","text":["Customizing model by returning layer dense_27\n"],"name":"stdout"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"71c781a6e1f949dc988c795e1cbed930","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Processing 2661 examples on 2 cores', max=2661.0, style=P…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["\n","Number of samples: 2661\n","Dim shapes: \n","[32, 30, 40, 128, 8, 16]\n","2661\n","2661\n","2661\n","2661\n","2661\n","2661\n","AudioClassifier created with audio_folder = val-final-audio , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/openl3-cnn-lstm-tuned-lr.h5\n","WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n","WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n","WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n","FramesClassifier created with frames_folder = val-final-frames , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/scene-classifier-resnet-lstm-x3.h5\n","FramesClassifier created with frames_folder = val-final-frames , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/vgg19-lstm-cp-0003.h5\n","PoseClassifier created with pose_folder = val-final-pose , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/pose-classifier-64lstm-0.01reg.h5\n","load data\n","FacesClassifier created with face_folder = val-final-fer , is_test = False , model_location = /content/drive/My Drive/cs231n-project/models/face-classifier-playground/cp-0001.h5\n","ImageCaptioningClassifier created with caption_pkl = val-final-captions.pkl , is_test = False , model_location = https://storage.googleapis.com/cs231n-emotiw/models/sentiment-transformer_sentiment-transformer_756.pth\n","Skipping unzipping files as input is a folder\n","Customizing model by returning layer dense\n","Skipping unzipping files as input is a folder\n","Found 766 frames belonging to 766 videos belonging to 3 classes.\n","Min frames determined to be 7\n","Customizing model by returning layer concatenate_5\n","Skipping unzipping files as input is a folder\n","Found 766 frames belonging to 766 videos belonging to 3 classes.\n","Min frames determined to be 7\n","Customizing model by returning layer global_average_pooling3d_1\n","Skipping unzipping files as input is a folder\n","['3', '2', '1']\n","Found 766 frames belonging to 766 videos belonging to 3 classes.\n","Min frames determined to be 7\n","Customizing model by returning layer bidirectional_1\n"],"name":"stdout"},{"output_type":"stream","text":["/content/cs231n-emotiw/src/generators/pose_generator.py:135: RuntimeWarning: invalid value encountered in double_scalars\n","  x_new.append((lx[i] - origin_x) / len_x)\n","/content/cs231n-emotiw/src/generators/pose_generator.py:136: RuntimeWarning: invalid value encountered in double_scalars\n","  x_new.append((ly[i] - origin_y) / len_y)\n"],"name":"stderr"},{"output_type":"stream","text":["Customizing model by returning layer dense_27\n"],"name":"stdout"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"db9f9863216b4616a4f8d46bbfa7c3ce","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Processing 766 examples on 2 cores', max=766.0, style=Pro…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["\n","Number of samples: 766\n","Dim shapes: \n","[32, 30, 40, 128, 8, 16]\n","766\n","766\n","766\n","766\n","766\n","766\n","(2661, 254)\n","(2661, 3)\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"kXNhfFvFho1Q","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":295},"outputId":"d6a8b8c7-224d-484e-b907-57dd86d0bd8c"},"source":["!ls"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" data\t\t\t\t\t     train-final-frames\n"," LICENSE\t\t\t\t     train-final-frames.zip\n"," models\t\t\t\t\t     train-final-pose\n"," notebooks\t\t\t\t     train-final-pose.zip\n"," README.md\t\t\t\t     Train_labels.txt\n"," reports\t\t\t\t     val-final-audio\n"," requirements-predictions.txt\t\t     val-final-audio.zip\n"," requirements.txt\t\t\t     val-final-faces\n","'Screen Shot 2020-05-26 at 8.53.32 PM.png'   val-final-faces.zip\n"," src\t\t\t\t\t     val-final-fer\n"," train-final-audio\t\t\t     val-final-fer.zip\n"," train-final-audio.zip\t\t\t     val-final-frames\n"," train-final-faces\t\t\t     val-final-frames.zip\n"," train-final-faces.zip\t\t\t     val-final-pose\n"," train-final-fer\t\t\t     val-final-pose.zip\n"," train-final-fer.zip\t\t\t     Val_labels.txt\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"G0zv6L6hhzsP","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":102},"executionInfo":{"status":"ok","timestamp":1592703596350,"user_tz":420,"elapsed":7264,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"e5ae6b5c-4d00-405d-8233-b7590b7f3a24"},"source":["!rm -rf ensemble-scene-scene-pose-audio-face-caption-v1\n","!mkdir ensemble-scene-scene-pose-audio-face-caption-v1\n","np.save(\"ensemble-scene-scene-pose-audio-face-caption-v1/X_train.npy\", X_train)\n","np.save(\"ensemble-scene-scene-pose-audio-face-caption-v1/y_train.npy\", y_train)\n","np.save(\"ensemble-scene-scene-pose-audio-face-caption-v1/X_valid.npy\", X_valid)\n","np.save(\"ensemble-scene-scene-pose-audio-face-caption-v1/y_valid.npy\", y_valid)\n","!zip -r ensemble-scene-scene-pose-audio-face-caption-v1.zip ensemble-scene-scene-pose-audio-face-caption-v1\n","# !cp ensemble-scene-pose-audio-v1.zip ../drive/'My Drive/Machine-Learning-Projects'/cs231n-project/datasets/emotiw\n","!cp ensemble-scene-scene-pose-audio-face-caption-v1.zip ../drive/'My Drive'/cs231n-project/datasets/emotiw\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["updating: ensemble-scene-scene-pose-audio-face-caption-v1/ (stored 0%)\n","updating: ensemble-scene-scene-pose-audio-face-caption-v1/X_train.npy (deflated 49%)\n","updating: ensemble-scene-scene-pose-audio-face-caption-v1/y_valid.npy (deflated 96%)\n","updating: ensemble-scene-scene-pose-audio-face-caption-v1/y_train.npy (deflated 97%)\n","updating: ensemble-scene-scene-pose-audio-face-caption-v1/X_valid.npy (deflated 49%)\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"xGS2rrUIZ_YX","colab_type":"text"},"source":["## START HERE IF YOU DON'T WANT TO REMAKE THE CONCAT ABOVE"]},{"cell_type":"code","metadata":{"id":"EkbMvFKG4IvD","colab_type":"code","colab":{}},"source":["!cp ../drive/'My Drive'/cs231n-project/datasets/emotiw/train-final-audio.zip .\n","!unzip -q -d train-final-audio train-final-audio.zip\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"4t07onWM4QIZ","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":187},"executionInfo":{"status":"ok","timestamp":1593061756804,"user_tz":420,"elapsed":982,"user":{"displayName":"Tom Jin","photoUrl":"","userId":"10159799883240069996"}},"outputId":"c40cb00a-50ae-47ef-f548-aafee9c347d3"},"source":["!ls train-final-audio/train-final-audio/audio-pickle | head"],"execution_count":null,"outputs":[{"output_type":"stream","text":["10_10.mp4-openl3.pkl\n","101_10.mp4-openl3.pkl\n","101_11.mp4-openl3.pkl\n","101_12.mp4-openl3.pkl\n","101_13.mp4-openl3.pkl\n","101_14.mp4-openl3.pkl\n","101_15.mp4-openl3.pkl\n","101_16.mp4-openl3.pkl\n","101_17.mp4-openl3.pkl\n","101_18.mp4-openl3.pkl\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"t74F7g-72k8U","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":72},"executionInfo":{"status":"ok","timestamp":1593133564739,"user_tz":240,"elapsed":5070,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"63477d0e-e7fc-418a-d5d8-56e7008635ec"},"source":["!cp /content/drive/'My Drive/Machine-Learning-Projects'/cs231n-project/datasets/emotiw/train-final-laugh-prob.pkl .\n","!cp /content/drive/'My Drive/Machine-Learning-Projects'/cs231n-project/datasets/emotiw/val-final-laugh-prob.pkl ."],"execution_count":null,"outputs":[{"output_type":"stream","text":["cp: cannot stat '/content/drive/My Drive/Machine-Learning-Projects/cs231n-project/datasets/emotiw/train-final-laugh-prob.pkl': No such file or directory\n","cp: cannot stat '/content/drive/My Drive/Machine-Learning-Projects/cs231n-project/datasets/emotiw/val-final-laugh-prob.pkl': No such file or directory\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"I_XuLCf_3SzK","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":52},"executionInfo":{"status":"ok","timestamp":1593107304591,"user_tz":240,"elapsed":269,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"49e7e998-b1d6-423c-db03-fe4372b4bfff"},"source":["import pickle\n","train_vid_to_laugh = {}\n","val_vid_to_laugh = {}\n","train_laugh_vec = []\n","val_laugh_vec = []\n","with open('train-final-laugh-prob.pkl', 'rb') as handle:\n","    train_laugh_obj = pickle.load(handle)\n","    i = 0\n","    for vid in train_laugh_obj[\"vids\"]:\n","        train_vid_to_laugh[vid] = train_laugh_obj[\"actual_preds\"][i]\n","        i += 1\n","    \n","    for vid in sorted(train_laugh_obj[\"vids\"]):\n","        train_laugh_vec.append(train_vid_to_laugh[vid])\n","\n","import pickle\n","with open('val-final-laugh-prob.pkl', 'rb') as handle:\n","    val_laugh_obj = pickle.load(handle)\n","    i = 0\n","    for vid in val_laugh_obj[\"vids\"]:\n","        val_vid_to_laugh[vid] = val_laugh_obj[\"actual_preds\"][i]\n","        i += 1\n","    for vid in sorted(val_laugh_obj[\"vids\"]):\n","        val_laugh_vec.append(val_vid_to_laugh[vid])\n","\n","print(len(train_laugh_vec))\n","print(len(val_laugh_vec))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["2661\n","766\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"SvJo_G-jp8Au","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":139},"executionInfo":{"status":"ok","timestamp":1593107314361,"user_tz":240,"elapsed":8115,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"b855de8e-3234-4042-9c0c-bf53e91d50a5"},"source":["import numpy as np\n","\n","!cp /content/drive/'My Drive/Machine-Learning-Projects'/cs231n-project/datasets/emotiw/ensemble-scene-scene-pose-audio-face-caption-v1.zip .\n","!unzip ensemble-scene-scene-pose-audio-face-caption-v1.zip\n","\n","X_train = np.load(\"ensemble-scene-scene-pose-audio-face-caption-v1/X_train.npy\")\n","y_train = np.load(\"ensemble-scene-scene-pose-audio-face-caption-v1/y_train.npy\")\n","X_valid = np.load(\"ensemble-scene-scene-pose-audio-face-caption-v1/X_valid.npy\")\n","y_valid = np.load(\"ensemble-scene-scene-pose-audio-face-caption-v1/y_valid.npy\")\n","X_train.shape"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Archive:  ensemble-scene-scene-pose-audio-face-caption-v1.zip\n","replace ensemble-scene-scene-pose-audio-face-caption-v1/X_train.npy? [y]es, [n]o, [A]ll, [N]one, [r]ename: A\n","  inflating: ensemble-scene-scene-pose-audio-face-caption-v1/X_train.npy  \n","  inflating: ensemble-scene-scene-pose-audio-face-caption-v1/y_valid.npy  \n","  inflating: ensemble-scene-scene-pose-audio-face-caption-v1/y_train.npy  \n","  inflating: ensemble-scene-scene-pose-audio-face-caption-v1/X_valid.npy  \n"],"name":"stdout"},{"output_type":"execute_result","data":{"text/plain":["(2661, 254)"]},"metadata":{"tags":[]},"execution_count":145}]},{"cell_type":"code","metadata":{"id":"bRqCC6cr5xvS","colab_type":"code","colab":{}},"source":["# Adding laughter probability as an additional dimension\n","train_laugh_vec = np.expand_dims(train_laugh_vec, 1)\n","val_laugh_vec = np.expand_dims(val_laugh_vec, 1)\n","X_train = np.hstack((X_train, train_laugh_vec))\n","X_valid = np.hstack((X_valid, val_laugh_vec))"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"OatM9hSd6utC","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593107320444,"user_tz":240,"elapsed":715,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"7b95654d-1742-4127-8f5b-bf30db3e7a11"},"source":["X_train.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2661, 255)"]},"metadata":{"tags":[]},"execution_count":147}]},{"cell_type":"code","metadata":{"id":"Ni8hjpnIuq4i","colab_type":"code","colab":{}},"source":["from sklearn.preprocessing import Normalizer\n","\n","norm = Normalizer()\n","\n","X_train_norm = norm.fit_transform(X_train)\n","X_valid_norm = norm.fit_transform(X_valid)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"y8rAjjncdrrJ","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1593109779911,"user_tz":240,"elapsed":20758,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"8af79e81-f86b-43b6-f48a-81a76f6179fa"},"source":["#\n","# CONFIGURATION\n","#\n","# Define any constants for the model here\n","#\n","\n","MODEL_NAME = \"ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1\"\n","\n","from pathlib import Path\n","import tensorflow as tf\n","import matplotlib.pyplot as plt\n","\n","sizes = [32, 30, 40, 128, 8, 16, 1]\n","\n","# # UNCOMMENT IF EXCLUDING FER, IMAGE CAP, AND VGG\n","# mask = []\n","# for x in range(sum(sizes)):\n","#     if x >= 32 and x < 62:\n","#         mask.append(False)\n","#     elif x < 230:\n","#         mask.append(True)\n","#     else:\n","#         mask.append(False)\n","\n","# # UNCOMMENT IF EXCLUDING FER, IMAGE CAP, POSE, AND RESNET\n","# mask = []\n","# for x in range(sum(sizes)):\n","#     if x >= 62 and x < 102:\n","#         mask.append(False)\n","#     elif x < 62:\n","#         mask.append(True)\n","#     else:\n","#         mask.append(False)\n","  \n","# # UNCOMMENT IF EXCLUDING FER, AND VGG\n","# mask = []\n","# for x in range(sum(sizes)):\n","#     if x >= 30 and x < 62:\n","#         mask.append(False)\n","#     elif x < 230:\n","#         mask.append(True)\n","#     elif x >= 238:\n","#         mask.append(True)\n","#     else:\n","#         mask.append(False)\n","\n","# UNCOMMENT IF EXCLUDING FER, AND RESNET [best]\n","mask = []\n","for x in range(sum(sizes)):\n","    if x >= 62 and x < 102:\n","        mask.append(False)\n","    elif x < 230:\n","        mask.append(True)\n","    elif x >= 238:\n","        mask.append(True)\n","    else:\n","        mask.append(False)\n","\n","# # UNCOMMENT IF EXCLUDING FER, IMAGE CAP, AND RESNET [best]\n","# mask = []\n","# for x in range(sum(sizes)):\n","#     if x >= 62 and x < 102:\n","#         mask.append(False)\n","#     elif x < 230:\n","#         mask.append(True)\n","#     else:\n","#         mask.append(False)\n","\n","# UNCOMMENT IF EXCLUDING FER AND IMAGE CAP\n","# mask = []\n","# for x in range(sum(sizes)):\n","#     if x < 230:\n","#         mask.append(True)\n","#     else:\n","#         mask.append(False)\n","\n","# # UNCOMMENT IF EXCLUDING FER\n","# mask = []\n","# for x in range(sum(sizes)):\n","#     if x < 230:\n","#         mask.append(True)\n","#     elif x >= 238:\n","#         mask.append(True)\n","#     else:\n","#         mask.append(False)\n","\n","\n","def build_model():\n","    def create_model(inputs):\n","        # x = tf.keras.layers.Dense(hp.Int('units', min_value=8, max_value=128, step=8), activation='relu', kernel_regularizer=tf.keras.regularizers.l2())(inputs)\n","        # x = tf.keras.layers.Dense(8, activation='relu')(inputs)\n","        # x = tf.keras.layers.Dropout(0.3)(x)\n","        x = tf.keras.layers.BatchNormalization()(inputs)\n","        # x = tf.keras.layers.Dense(64, activation='relu')(inputs)\n","        # x = tf.keras.layers.Dropout(0.2)(x)\n","        # x = tf.keras.layers.Dense(32, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001))(x)\n","        x = tf.keras.layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.02))(x)\n","        x = tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2(0.02))(x)\n","\n","        model = tf.keras.Model(inputs=inputs, outputs=x)\n","        model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),\n","                      loss = 'categorical_crossentropy',\n","                      metrics=['accuracy'])\n","        return model\n","\n","    # inputs = tf.keras.Input(shape=(X_train.shape[1]))\n","    inputs = tf.keras.Input(shape=(np.count_nonzero(mask)))\n","    model = create_model(inputs)\n","    # model.summary()\n","    return model\n","\n","Path(f\"/content/drive/My Drive/Machine-Learning-Models/cs231n-project/models/{MODEL_NAME}\").mkdir(parents=True, exist_ok=True)\n","checkpoint_path = \"/content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/\" + MODEL_NAME + \"/cp-{epoch:04d}.h5\"\n","cp_callback = tf.keras.callbacks.ModelCheckpoint(\n","    filepath=checkpoint_path, \n","    verbose=1,\n","    save_weights_only=False,\n","    save_best_only=False,\n","    period=1\n",")\n","model = build_model()\n","\n","import pickle\n","history = model.fit(\n","          x=X_train[:, mask],\n","          y=y_train,\n","          epochs=50,\n","          callbacks=[cp_callback],\n","          validation_data=(X_valid[:, mask], y_valid)\n",")\n","\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n","Epoch 1/50\n","78/84 [==========================>...] - ETA: 0s - loss: 2.2456 - accuracy: 0.7704\n","Epoch 00001: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0001.h5\n","84/84 [==============================] - 0s 6ms/step - loss: 2.2169 - accuracy: 0.7719 - val_loss: 2.1468 - val_accuracy: 0.5796\n","Epoch 2/50\n","75/84 [=========================>....] - ETA: 0s - loss: 1.4099 - accuracy: 0.8346\n","Epoch 00002: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0002.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 1.3922 - accuracy: 0.8301 - val_loss: 1.5863 - val_accuracy: 0.6031\n","Epoch 3/50\n","80/84 [===========================>..] - ETA: 0s - loss: 0.9826 - accuracy: 0.8352\n","Epoch 00003: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0003.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.9805 - accuracy: 0.8335 - val_loss: 1.3419 - val_accuracy: 0.5914\n","Epoch 4/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.7816 - accuracy: 0.8279\n","Epoch 00004: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0004.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.7735 - accuracy: 0.8301 - val_loss: 1.1681 - val_accuracy: 0.6175\n","Epoch 5/50\n","78/84 [==========================>...] - ETA: 0s - loss: 0.6607 - accuracy: 0.8365\n","Epoch 00005: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0005.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.6579 - accuracy: 0.8350 - val_loss: 1.1182 - val_accuracy: 0.6018\n","Epoch 6/50\n","76/84 [==========================>...] - ETA: 0s - loss: 0.5979 - accuracy: 0.8359\n","Epoch 00006: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0006.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.5948 - accuracy: 0.8362 - val_loss: 1.0713 - val_accuracy: 0.6136\n","Epoch 7/50\n","81/84 [===========================>..] - ETA: 0s - loss: 0.5686 - accuracy: 0.8306\n","Epoch 00007: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0007.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.5694 - accuracy: 0.8298 - val_loss: 1.0383 - val_accuracy: 0.6227\n","Epoch 8/50\n","78/84 [==========================>...] - ETA: 0s - loss: 0.5456 - accuracy: 0.8341\n","Epoch 00008: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0008.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.5480 - accuracy: 0.8339 - val_loss: 1.0714 - val_accuracy: 0.5953\n","Epoch 9/50\n","80/84 [===========================>..] - ETA: 0s - loss: 0.5262 - accuracy: 0.8359\n","Epoch 00009: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0009.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.5297 - accuracy: 0.8339 - val_loss: 1.0363 - val_accuracy: 0.6201\n","Epoch 10/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.5279 - accuracy: 0.8295\n","Epoch 00010: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0010.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.5189 - accuracy: 0.8328 - val_loss: 1.0131 - val_accuracy: 0.6149\n","Epoch 11/50\n","75/84 [=========================>....] - ETA: 0s - loss: 0.5199 - accuracy: 0.8354\n","Epoch 00011: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0011.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.5159 - accuracy: 0.8373 - val_loss: 1.0001 - val_accuracy: 0.6319\n","Epoch 12/50\n","80/84 [===========================>..] - ETA: 0s - loss: 0.4966 - accuracy: 0.8422\n","Epoch 00012: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0012.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4997 - accuracy: 0.8410 - val_loss: 0.9757 - val_accuracy: 0.6371\n","Epoch 13/50\n","75/84 [=========================>....] - ETA: 0s - loss: 0.5072 - accuracy: 0.8279\n","Epoch 00013: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0013.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.5049 - accuracy: 0.8301 - val_loss: 0.9910 - val_accuracy: 0.6319\n","Epoch 14/50\n","79/84 [===========================>..] - ETA: 0s - loss: 0.4975 - accuracy: 0.8335\n","Epoch 00014: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0014.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.5020 - accuracy: 0.8339 - val_loss: 1.0024 - val_accuracy: 0.6188\n","Epoch 15/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4968 - accuracy: 0.8405\n","Epoch 00015: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0015.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4973 - accuracy: 0.8399 - val_loss: 0.9954 - val_accuracy: 0.6175\n","Epoch 16/50\n","74/84 [=========================>....] - ETA: 0s - loss: 0.5015 - accuracy: 0.8302\n","Epoch 00016: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0016.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.5000 - accuracy: 0.8331 - val_loss: 1.0098 - val_accuracy: 0.6319\n","Epoch 17/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4940 - accuracy: 0.8369\n","Epoch 00017: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0017.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.5030 - accuracy: 0.8316 - val_loss: 0.9691 - val_accuracy: 0.6123\n","Epoch 18/50\n","76/84 [==========================>...] - ETA: 0s - loss: 0.4836 - accuracy: 0.8351\n","Epoch 00018: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0018.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4904 - accuracy: 0.8335 - val_loss: 0.9860 - val_accuracy: 0.6279\n","Epoch 19/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4983 - accuracy: 0.8340\n","Epoch 00019: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0019.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4978 - accuracy: 0.8335 - val_loss: 0.9980 - val_accuracy: 0.6044\n","Epoch 20/50\n","79/84 [===========================>..] - ETA: 0s - loss: 0.4793 - accuracy: 0.8406\n","Epoch 00020: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0020.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4842 - accuracy: 0.8380 - val_loss: 1.0234 - val_accuracy: 0.5992\n","Epoch 21/50\n","79/84 [===========================>..] - ETA: 0s - loss: 0.4930 - accuracy: 0.8378\n","Epoch 00021: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0021.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4971 - accuracy: 0.8365 - val_loss: 0.9637 - val_accuracy: 0.6305\n","Epoch 22/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4955 - accuracy: 0.8316\n","Epoch 00022: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0022.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4948 - accuracy: 0.8328 - val_loss: 0.9621 - val_accuracy: 0.6110\n","Epoch 23/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.5003 - accuracy: 0.8287\n","Epoch 00023: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0023.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4978 - accuracy: 0.8301 - val_loss: 1.0021 - val_accuracy: 0.6214\n","Epoch 24/50\n","79/84 [===========================>..] - ETA: 0s - loss: 0.4846 - accuracy: 0.8370\n","Epoch 00024: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0024.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4930 - accuracy: 0.8331 - val_loss: 0.9727 - val_accuracy: 0.6136\n","Epoch 25/50\n","80/84 [===========================>..] - ETA: 0s - loss: 0.4767 - accuracy: 0.8352\n","Epoch 00025: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0025.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4791 - accuracy: 0.8335 - val_loss: 0.9653 - val_accuracy: 0.6279\n","Epoch 26/50\n","74/84 [=========================>....] - ETA: 0s - loss: 0.4771 - accuracy: 0.8345\n","Epoch 00026: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0026.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4808 - accuracy: 0.8354 - val_loss: 0.9931 - val_accuracy: 0.6123\n","Epoch 27/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4805 - accuracy: 0.8369\n","Epoch 00027: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0027.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4847 - accuracy: 0.8358 - val_loss: 1.0140 - val_accuracy: 0.6149\n","Epoch 28/50\n","79/84 [===========================>..] - ETA: 0s - loss: 0.4837 - accuracy: 0.8469\n","Epoch 00028: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0028.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4863 - accuracy: 0.8440 - val_loss: 0.9684 - val_accuracy: 0.6201\n","Epoch 29/50\n","82/84 [============================>.] - ETA: 0s - loss: 0.4848 - accuracy: 0.8388\n","Epoch 00029: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0029.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4836 - accuracy: 0.8388 - val_loss: 0.9956 - val_accuracy: 0.6149\n","Epoch 30/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4907 - accuracy: 0.8300\n","Epoch 00030: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0030.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4868 - accuracy: 0.8313 - val_loss: 1.0022 - val_accuracy: 0.6162\n","Epoch 31/50\n","76/84 [==========================>...] - ETA: 0s - loss: 0.4782 - accuracy: 0.8380\n","Epoch 00031: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0031.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4791 - accuracy: 0.8395 - val_loss: 0.9650 - val_accuracy: 0.6358\n","Epoch 32/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4853 - accuracy: 0.8360\n","Epoch 00032: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0032.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4863 - accuracy: 0.8354 - val_loss: 0.9904 - val_accuracy: 0.6266\n","Epoch 33/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4778 - accuracy: 0.8385\n","Epoch 00033: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0033.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4828 - accuracy: 0.8354 - val_loss: 1.0034 - val_accuracy: 0.6266\n","Epoch 34/50\n","76/84 [==========================>...] - ETA: 0s - loss: 0.4795 - accuracy: 0.8331\n","Epoch 00034: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0034.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4859 - accuracy: 0.8301 - val_loss: 0.9771 - val_accuracy: 0.6332\n","Epoch 35/50\n","75/84 [=========================>....] - ETA: 0s - loss: 0.4770 - accuracy: 0.8396\n","Epoch 00035: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0035.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4794 - accuracy: 0.8358 - val_loss: 0.9480 - val_accuracy: 0.6319\n","Epoch 36/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4811 - accuracy: 0.8352\n","Epoch 00036: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0036.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4802 - accuracy: 0.8369 - val_loss: 1.0286 - val_accuracy: 0.6162\n","Epoch 37/50\n","74/84 [=========================>....] - ETA: 0s - loss: 0.4747 - accuracy: 0.8404\n","Epoch 00037: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0037.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4746 - accuracy: 0.8403 - val_loss: 1.0251 - val_accuracy: 0.6266\n","Epoch 38/50\n","81/84 [===========================>..] - ETA: 0s - loss: 0.4740 - accuracy: 0.8410\n","Epoch 00038: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0038.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4736 - accuracy: 0.8403 - val_loss: 0.9704 - val_accuracy: 0.6240\n","Epoch 39/50\n","74/84 [=========================>....] - ETA: 0s - loss: 0.4753 - accuracy: 0.8408\n","Epoch 00039: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0039.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4788 - accuracy: 0.8380 - val_loss: 1.0081 - val_accuracy: 0.6201\n","Epoch 40/50\n","71/84 [========================>.....] - ETA: 0s - loss: 0.4880 - accuracy: 0.8354\n","Epoch 00040: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0040.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4801 - accuracy: 0.8377 - val_loss: 0.9957 - val_accuracy: 0.6332\n","Epoch 41/50\n","77/84 [==========================>...] - ETA: 0s - loss: 0.4832 - accuracy: 0.8328\n","Epoch 00041: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0041.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4861 - accuracy: 0.8320 - val_loss: 0.9521 - val_accuracy: 0.6279\n","Epoch 42/50\n","79/84 [===========================>..] - ETA: 0s - loss: 0.4754 - accuracy: 0.8382\n","Epoch 00042: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0042.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4786 - accuracy: 0.8365 - val_loss: 1.0090 - val_accuracy: 0.6175\n","Epoch 43/50\n","78/84 [==========================>...] - ETA: 0s - loss: 0.4811 - accuracy: 0.8253\n","Epoch 00043: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0043.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4811 - accuracy: 0.8260 - val_loss: 0.9869 - val_accuracy: 0.6110\n","Epoch 44/50\n","75/84 [=========================>....] - ETA: 0s - loss: 0.4766 - accuracy: 0.8325\n","Epoch 00044: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0044.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4751 - accuracy: 0.8313 - val_loss: 1.0356 - val_accuracy: 0.6227\n","Epoch 45/50\n","78/84 [==========================>...] - ETA: 0s - loss: 0.4660 - accuracy: 0.8385\n","Epoch 00045: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0045.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4621 - accuracy: 0.8418 - val_loss: 1.0398 - val_accuracy: 0.6097\n","Epoch 46/50\n","78/84 [==========================>...] - ETA: 0s - loss: 0.4722 - accuracy: 0.8397\n","Epoch 00046: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0046.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4717 - accuracy: 0.8403 - val_loss: 0.9835 - val_accuracy: 0.6149\n","Epoch 47/50\n","76/84 [==========================>...] - ETA: 0s - loss: 0.4648 - accuracy: 0.8388\n","Epoch 00047: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0047.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4634 - accuracy: 0.8388 - val_loss: 1.0065 - val_accuracy: 0.6162\n","Epoch 48/50\n","76/84 [==========================>...] - ETA: 0s - loss: 0.4758 - accuracy: 0.8339\n","Epoch 00048: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0048.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4819 - accuracy: 0.8313 - val_loss: 0.9853 - val_accuracy: 0.6319\n","Epoch 49/50\n","75/84 [=========================>....] - ETA: 0s - loss: 0.4679 - accuracy: 0.8408\n","Epoch 00049: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0049.h5\n","84/84 [==============================] - 0s 5ms/step - loss: 0.4638 - accuracy: 0.8422 - val_loss: 0.9812 - val_accuracy: 0.6253\n","Epoch 50/50\n","78/84 [==========================>...] - ETA: 0s - loss: 0.4735 - accuracy: 0.8393\n","Epoch 00050: saving model to /content/drive/Machine-Learning-Models/My Drive/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-NORMALIZED-v1/cp-0050.h5\n","84/84 [==============================] - 0s 4ms/step - loss: 0.4701 - accuracy: 0.8418 - val_loss: 0.9922 - val_accuracy: 0.6201\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"E7Azhd_udPvI","colab_type":"code","colab":{}},"source":["import tensorflow as tf\n","BEST_FIRST_MODEL_PATH = '/content/drive/My Drive/Machine-Learning-Projects/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-v1/cp-0036.h5'\n","top_model = tf.keras.models.load_model(BEST_FIRST_MODEL_PATH)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"RltSpqhvXNHE","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":295},"executionInfo":{"status":"ok","timestamp":1593103411185,"user_tz":240,"elapsed":792,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"e6bb73ca-7528-4d88-bbe2-d5f5e454bd26"},"source":["top_model.summary()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Model: \"model_3\"\n","_________________________________________________________________\n","Layer (type)                 Output Shape              Param #   \n","=================================================================\n","input_4 (InputLayer)         [(None, 207)]             0         \n","_________________________________________________________________\n","batch_normalization_3 (Batch (None, 207)               828       \n","_________________________________________________________________\n","dense_6 (Dense)              (None, 64)                13312     \n","_________________________________________________________________\n","dense_7 (Dense)              (None, 3)                 195       \n","=================================================================\n","Total params: 14,335\n","Trainable params: 13,921\n","Non-trainable params: 414\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"iyTeJxNLXO6B","colab_type":"code","colab":{}},"source":["train_pred = top_model.predict(X_train[:, mask])\n","val_pred = top_model.predict(X_valid[:, mask])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"PNrMrWSRXxLa","colab_type":"code","colab":{}},"source":["y_true_val = np.argmax(y_valid, axis=1)\n","y_pred_val = np.argmax(val_pred, axis=1)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"f29izAS1YBDl","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":571},"executionInfo":{"status":"ok","timestamp":1593103672726,"user_tz":240,"elapsed":986,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"d4efa9d6-f878-4a14-d6a8-74eeff5ccdb9"},"source":["from sklearn import metrics \n","import pandas as pd\n","import seaborn as sn\n","cm=metrics.confusion_matrix(y_true_val,y_pred_val)\n","import matplotlib.pyplot as plt\n","\n","classes=['Pos' , 'Neu' , 'Neg']\n","con_mat = tf.math.confusion_matrix(labels=y_true_val, predictions=y_pred_val).numpy()\n","con_mat_norm = np.around(con_mat.astype('float') / con_mat.sum(axis=1)[:, np.newaxis], decimals=2)\n","con_mat_df = pd.DataFrame(con_mat_norm,\n","                  index = classes, \n","                  columns = classes)\n","\n","figure = plt.figure(figsize=(11, 9))\n","plt.title(\"Top Model FC Validation\")\n","sn.heatmap(con_mat_df, annot=True,cmap=plt.cm.Blues)\n","\n","\n","accuracy = (y_true_val == y_pred_val).mean()\n","print(f\"Accuracy: {accuracy}\")"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Accuracy: 0.639686684073107\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 792x648 with 2 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"bm_4RQ40YRA0","colab_type":"text"},"source":["### Add boosting for positive"]},{"cell_type":"code","metadata":{"id":"aRnqKDhujPOH","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593109872217,"user_tz":240,"elapsed":814,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"8f4b7592-8ae5-48c1-a041-7ffe78518740"},"source":["y_train.shape\n","\n","filtered_y_train = []\n","filtered_x_train = []\n","train_pred_pos_neu = np.argwhere(np.argmax(y_train,axis=1)<=1)\n","for i in train_pred_pos_neu:\n","  filtered_y_train.append(y_train[i])\n","  filtered_x_train.append(X_train_norm[i])\n","\n","\n","filtered_y_train = np.asarray(filtered_y_train).squeeze()[:,:2]\n","filtered_x_train = np.asarray(filtered_x_train).squeeze()\n","\n","filtered_x_train.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(1725, 255)"]},"metadata":{"tags":[]},"execution_count":239}]},{"cell_type":"code","metadata":{"id":"Ghc9hCEbkOns","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593109874654,"user_tz":240,"elapsed":523,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"8e2a41d1-f736-447d-d0ac-aceae8189295"},"source":["y_valid.shape\n","\n","val_pred_pos_neu = np.argwhere(np.argmax(val_pred,axis=1)<=1)\n","filtered_y_val = []\n","filtered_x_val = []\n","\n","for i in val_pred_pos_neu:\n","  filtered_y_val.append(y_valid[i])\n","  filtered_x_val.append(X_valid_norm[i])\n","\n","\n","filtered_y_val = np.asarray(filtered_y_val).squeeze()[:,:2]\n","filtered_x_val = np.asarray(filtered_x_val).squeeze()\n","\n","filtered_x_val.shape\n"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(553, 255)"]},"metadata":{"tags":[]},"execution_count":240}]},{"cell_type":"code","metadata":{"id":"zXjJnUs7Z0_y","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":156},"executionInfo":{"status":"ok","timestamp":1593109889632,"user_tz":240,"elapsed":9159,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"02753e5e-78dd-4506-ceff-992a78d51f0c"},"source":["from sklearn.ensemble import RandomForestClassifier\n","clf = RandomForestClassifier(max_depth=20, random_state=0 , n_estimators=500)\n","\n","clf.fit(filtered_x_train, filtered_y_train,)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n","                       criterion='gini', max_depth=20, max_features='auto',\n","                       max_leaf_nodes=None, max_samples=None,\n","                       min_impurity_decrease=0.0, min_impurity_split=None,\n","                       min_samples_leaf=1, min_samples_split=2,\n","                       min_weight_fraction_leaf=0.0, n_estimators=500,\n","                       n_jobs=None, oob_score=False, random_state=0, verbose=0,\n","                       warm_start=False)"]},"metadata":{"tags":[]},"execution_count":241}]},{"cell_type":"code","metadata":{"id":"coQ83d_Inwe7","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":485},"executionInfo":{"status":"ok","timestamp":1593109892944,"user_tz":240,"elapsed":1064,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"f3d7914e-f693-4dc8-e022-ddd908338b68"},"source":["new_pred = clf.predict(filtered_x_val)\n","print(clf.score(filtered_x_val, filtered_y_val))\n","\n","new_pred = np.argmax(new_pred , axis=1)\n","\n","new_pred"],"execution_count":null,"outputs":[{"output_type":"stream","text":["0.6256781193490054\n"],"name":"stdout"},{"output_type":"execute_result","data":{"text/plain":["array([1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,\n","       1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1,\n","       0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1,\n","       1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1,\n","       0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1,\n","       1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1,\n","       0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n","       0, 0, 1])"]},"metadata":{"tags":[]},"execution_count":242}]},{"cell_type":"code","metadata":{"id":"FTcC2GfQv_B4","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593110052941,"user_tz":240,"elapsed":1998,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"430c1691-8abc-40b0-bb03-db1beca0f9e9"},"source":["from sklearn.svm import SVC\n","clf = SVC(gamma='auto')\n","\n","clf.fit(filtered_x_train , np.argmax(filtered_y_train, axis=1))\n","\n","clf.score(filtered_x_val , np.argmax(filtered_y_val, axis=1))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.5533453887884268"]},"metadata":{"tags":[]},"execution_count":247}]},{"cell_type":"code","metadata":{"id":"Gyta1nBRwo0J","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593110122622,"user_tz":240,"elapsed":779,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"da90d110-345a-42e2-f21e-2b165ba196f7"},"source":["from sklearn.linear_model import LogisticRegression\n","clf = LogisticRegression()\n","clf.fit(filtered_x_train , np.argmax(filtered_y_train, axis=1))\n","\n","clf.score(filtered_x_val , np.argmax(filtered_y_val, axis=1))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.650994575045208"]},"metadata":{"tags":[]},"execution_count":248}]},{"cell_type":"code","metadata":{"id":"EMqsswzMt3iY","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":468},"executionInfo":{"status":"ok","timestamp":1593110157883,"user_tz":240,"elapsed":808,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"57ed6592-822c-4414-f660-5c19e5ddc6ea"},"source":["new_pred_log = clf.predict(filtered_x_val)\n","\n","new_pred_log"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1,\n","       1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0,\n","       0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1,\n","       1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,\n","       0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,\n","       0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1,\n","       1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n","       0, 0, 1])"]},"metadata":{"tags":[]},"execution_count":251}]},{"cell_type":"code","metadata":{"id":"8ChOqkCzoxGM","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":763},"executionInfo":{"status":"ok","timestamp":1593109225003,"user_tz":240,"elapsed":768,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"ba2dad56-8ca5-44f4-b733-d1f7d16e5b02"},"source":["val_pred_pos_neu_f = val_pred_pos_neu.reshape(1,-1)\n","\n","counter = 0\n","y_pred_val_boost = y_pred_val\n","for i in range(0,len(y_pred_val_boost)):\n","  if i in val_pred_pos_neu_f:\n","    y_pred_val_boost[i] = new_pred[counter]\n","    counter += 1\n","\n","val_pred_pos_neu_f"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[  1,   2,   4,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,\n","         26,  27,  29,  30,  31,  32,  33,  34,  35,  36,  37,  39,  40,\n","         41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,\n","         56,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,\n","         80,  81,  82,  83,  84,  85,  87,  88,  89,  90,  91,  92,  93,\n","         94,  95,  96,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107,\n","        108, 109, 111, 112, 113, 114, 132, 133, 134, 135, 136, 137, 138,\n","        139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 152,\n","        153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165,\n","        166, 167, 169, 176, 177, 178, 179, 180, 182, 191, 192, 193, 194,\n","        195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,\n","        208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 221,\n","        223, 224, 230, 233, 240, 241, 242, 243, 244, 245, 247, 255, 256,\n","        257, 258, 259, 260, 261, 262, 264, 265, 267, 268, 269, 271, 272,\n","        273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,\n","        286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 299,\n","        301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313,\n","        314, 315, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327,\n","        328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340,\n","        341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353,\n","        354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,\n","        367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379,\n","        380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392,\n","        393, 394, 395, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426,\n","        429, 430, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,\n","        444, 448, 449, 450, 452, 453, 454, 455, 464, 469, 475, 479, 484,\n","        485, 486, 491, 494, 495, 496, 497, 498, 499, 503, 505, 506, 507,\n","        508, 509, 510, 512, 524, 526, 527, 528, 530, 531, 532, 533, 536,\n","        537, 538, 539, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550,\n","        551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,\n","        564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576,\n","        577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589,\n","        590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602,\n","        603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615,\n","        616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628,\n","        629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641,\n","        642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654,\n","        655, 656, 657, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668,\n","        669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681,\n","        682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 695,\n","        696, 703, 704, 707, 708, 709, 710, 711, 712, 713, 714, 716, 721,\n","        726, 727, 730, 731, 734, 736, 741, 742, 744, 745, 746, 747, 749,\n","        750, 751, 753, 756, 757, 761, 763]])"]},"metadata":{"tags":[]},"execution_count":223}]},{"cell_type":"code","metadata":{"id":"IXiwfLqqpqyu","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":624},"executionInfo":{"status":"ok","timestamp":1593109227595,"user_tz":240,"elapsed":745,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"3fce76d3-c1c4-4a3c-9b40-c0866a166eb5"},"source":["y_pred_val_boost\n"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([2, 0, 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n","       2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 1,\n","       0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,\n","       2, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2,\n","       1, 1, 0, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,\n","       2, 1, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1,\n","       1, 1, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 1, 1, 0, 1, 1, 2,\n","       0, 1, 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1,\n","       1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 1, 0, 0, 0, 1, 1, 0,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 0, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,\n","       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,\n","       1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1,\n","       1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,\n","       2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2,\n","       1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 2, 1,\n","       1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 1,\n","       1, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1,\n","       1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n","       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,\n","       1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,\n","       1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0,\n","       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0,\n","       1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 0, 2, 2, 2, 2, 2, 2, 0,\n","       0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2,\n","       0, 0, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0,\n","       2, 0, 0, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 1, 2, 1, 2, 2])"]},"metadata":{"tags":[]},"execution_count":224}]},{"cell_type":"markdown","metadata":{"id":"L_0Y92D6xDcZ","colab_type":"text"},"source":["## Random Forest"]},{"cell_type":"code","metadata":{"id":"CcpU8Ih9sSn2","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":571},"executionInfo":{"status":"ok","timestamp":1593109906771,"user_tz":240,"elapsed":1259,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"974ff98c-feec-4365-b5b8-7022dd92747b"},"source":["from sklearn import metrics \n","import pandas as pd\n","import seaborn as sn\n","cm=metrics.confusion_matrix(y_true_val,y_pred_val_boost)\n","import matplotlib.pyplot as plt\n","\n","classes=['Pos' , 'Neu' , 'Neg']\n","con_mat = tf.math.confusion_matrix(labels=y_true_val, predictions=y_pred_val_boost).numpy()\n","con_mat_norm = np.around(con_mat.astype('float') / con_mat.sum(axis=1)[:, np.newaxis], decimals=2)\n","con_mat_df = pd.DataFrame(con_mat_norm,\n","                  index = classes, \n","                  columns = classes)\n","\n","figure = plt.figure(figsize=(11, 9))\n","plt.title(\"Top Model FC Validation\")\n","sn.heatmap(con_mat_df, annot=True,cmap=plt.cm.Blues)\n","\n","\n","accuracy = (y_true_val == y_pred_val).mean()\n","print(f\"Accuracy: {accuracy}\")"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Accuracy: 0.6240208877284595\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 792x648 with 2 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"qcBe5GZixFmg","colab_type":"text"},"source":["## Logistic Regression"]},{"cell_type":"code","metadata":{"id":"d-tMEN-PxKoK","colab_type":"code","colab":{}},"source":["val_pred_pos_neu_f = val_pred_pos_neu.reshape(1,-1)\n","\n","counter = 0\n","y_pred_val_boost = y_pred_val\n","for i in range(0,len(y_pred_val_boost)):\n","  if i in val_pred_pos_neu_f:\n","    y_pred_val_boost[i] = new_pred_log[counter]\n","    counter += 1\n","\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"2XGvb555xPc2","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":571},"executionInfo":{"status":"ok","timestamp":1593110242119,"user_tz":240,"elapsed":1126,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"f3f9d82c-a0c2-4294-f740-797ec822faa8"},"source":["from sklearn import metrics \n","import pandas as pd\n","import seaborn as sn\n","cm=metrics.confusion_matrix(y_true_val,y_pred_val_boost)\n","import matplotlib.pyplot as plt\n","\n","classes=['Pos' , 'Neu' , 'Neg']\n","con_mat = tf.math.confusion_matrix(labels=y_true_val, predictions=y_pred_val_boost).numpy()\n","con_mat_norm = np.around(con_mat.astype('float') / con_mat.sum(axis=1)[:, np.newaxis], decimals=2)\n","con_mat_df = pd.DataFrame(con_mat_norm,\n","                  index = classes, \n","                  columns = classes)\n","\n","figure = plt.figure(figsize=(11, 9))\n","plt.title(\"Top Model FC Validation\")\n","sn.heatmap(con_mat_df, annot=True,cmap=plt.cm.Blues)\n","\n","\n","accuracy = (y_true_val == y_pred_val).mean()\n","print(f\"Accuracy: {accuracy}\")"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Accuracy: 0.6227154046997389\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAlgAAAIYCAYAAACxPpKwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd5gdZfn/8fe9m4SeACmbCsSEFqpIL1KkilIEKfKlKEUQBKU3EfCHIkU6SkAQUUGKYJDQFBAEgYROEkoIJQmkh4SSkGT3+f1xTtazIclOwtmdMPt+eZ2LnZln5jyDe5E7n7nPcyKlhCRJkqqnJu8JSJIkFY0FliRJUpVZYEmSJFWZBZYkSVKVWWBJkiRVmQWWJElSlVlgSQUTESki+mcYt11EjGmNOS2uiFitfD/tytv3R8ShWcYuxnudGRE3fJH5StJcFljSfETExxWvhoiYUbF9UJXe47FyQbDBPPvvLu/frhrvs7jKc/ik4r4/rDjWMSIuj4j3ysfeKm93mc91XouIH8xn/wkRMXRR5pRS2i2ldPPi3VGT9/5ccZlS+mVK6Ygvem1JAgssab5SSsvPfQHvAd+u2PfnKr7VG8AhczciojOwBTCxiu/xRWxQcd8rAkREB+BfwDrArkBHSnOeDGw6n2vcTMU9Vji4fEySCscCS1oEEbFUOal5v/y6PCKWKh/bLiLGlB81TYqIdzKkXX8G9o+I2vL2gcDdwKws71k+fkpEfFA+1iQpKp97STlpGh8Rv4uIZb7gv4ZDgFWAvVNKw1NKDSmlCSmlX6SUBs9n/C3A1hGxasW8BgDrA7dGxO4R8UJETI+I0RFx7oLeuJz6HVH+ubZ8b5MiYhSw+zxjvx8RIyLio4gYFRE/LO9fDrgf6FmRzvWMiHMj4k8V5+8REcMi4sPy+65dceydiDg5Il6OiGkR8deIWHrR/1VKKioLLGnRnAVsDmwIbEApsTm74nh3oAvQCzgUGBgRay7keu8Dw4Gdy9uHAH/M+p4RsStwMrATsDqw4zznXgisUT63f3le52S60wXbEXggpfRxlsEppTHAo5QSq7kOBganlCYBn1C67xUpFUnHRMReGS59JPAt4KvAxsC+8xyfUD7eEfg+cFlEbJRS+gTYDXi/Ip17v/LEiFgDuBX4CdAVGAzcW07v5tqPUoLXl1KxeFiGOUtqIyywpEVzEHB+ObGZCJxH08IB4Gcppc9SSv8G7qP0B/HC/BE4JCLWAlZMKf13Ed5zP+CmlNKr5cLh3LknRUQARwE/TSlNSSl9BPwSOGAR7vf5coLzYURcWd7XGfhgEa4BpUeBB5fnVVO+p5sBUkqPpZReKSdhL1MqbLbNcM39gMtTSqNTSlOAX1UeTCndl1J6K5X8G3gI2CbjfPcH7kspPZxSmg1cAiwDbFkx5sqU0vvl976XUhErSQAs1qdtpDasJ/Buxfa75X1zTS0XOgs6Pj9/Ay6l1MN0yyK+Z0/guXmOzdUVWBZ4rlRrARBALdltlFIaOc++yUCPRbgGlO7x2ojYvDynZSkVn0TEZpSStnWBDsBSwB0ZrtkTGF2xXXnvRMRuwM8pJXg15fd8JeN8m/w7Tyk1RMRoSgngXOMqfv6U5v9/ltSGmGBJi+Z9YNWK7VXK++Zaqdzjs6Djn5NS+pRST9AxzL/AWth7fgD0mefYXJOAGcA6KaUVy69O5cb9L+KfwC7z3OdCle/xTkqPAg8Gbkspze0z+wswCOiTUuoE/I5SIdicBd57uUftLkrJU125QX9wxXVTM9du8u+8nAb2AcZmmJckWWBJi+hW4OyI6FpekuAc4E/zjDkvIjpExDaUeoCypDFnAtumlN5ZxPe8HTgsIgZExLKUEhuglLoA11PqPeoGEBG9ImKXrDe7ALdQSo7uioi1IqImIjqXm/u/uZDzbqb06G0fmn56cAVgSkppZkRsCnwv4zxuB46PiN4RsRJwesWxuUnYRGBOOc3aueL4eKBzRHRayLV3j4hvRER74CTgM+CpjHOT1MZZYEmL5v8BQ4GXKT1uer68b65xwFRKCcifgaNTSq81d9FyL89/FvU9U0r3A5cDjwAjy/+sdFp5/9MRMZ1S+rSwpvtmpZQ+o9To/hrwMDAdeJZSc/8zCzn1cWAaMCalNKRi/4+A8yPiI0rF4+0Zp3I98CDwEqV/J3+rmONHwPHla02lVLQNqjj+GqXCdVS5v6zJ472U0uvA/wFXUUoCv01pqY5ZSFIGkVJzSbmkLKK0MOifUkq9856LJClfJliSJElVZoElSZJUZT4ilCRJqjITLEmSpCqzwJIkSaqyFl/Jfc3THvQZpJYIF3xv/bynIDXaYtXOeU9BatRrxQ5ZFvdtEct89bgWrRNmvHB1LvdmgiVJklRlfhehJEnKTxQz6ynmXUmSJOXIBEuSJOUncmv/alEmWJIkSVVmgiVJkvJjD5YkSZKyMMGSJEn5sQdLkiRJWZhgSZKk/NiDJUmSpCwssCRJUn4iWvaVaQqxa0S8HhEjI+L0+Ry/LCJeLL/eiIgPm7umjwglSVJ+cn5EGBG1wDXATsAYYEhEDEopDZ87JqX004rxPwa+2tx1TbAkSVJbtikwMqU0KqU0C7gN2HMh4w8Ebm3uohZYkiQpPy38iDAijoqIoRWvo+aZQS9gdMX2mPK++Uw1VgX6Ao80d1s+IpQkSYWVUhoIDKzS5Q4A7kwp1Tc30AJLkiTlJ/9lGsYCfSq2e5f3zc8BwLFZLpr7XUmSJOVoCLB6RPSNiA6UiqhB8w6KiLWAlYD/ZrmoCZYkScpPzl+Vk1KaExHHAQ8CtcCNKaVhEXE+MDSlNLfYOgC4LaWUslzXAkuSJLVpKaXBwOB59p0zz/a5i3JNCyxJkpSf/HuwWkQx70qSJClHJliSJCk/OfdgtRQTLEmSpCozwZIkSfmxB0uSJElZmGBJkqT8mGBJkiQpCxMsSZKUnxo/RShJkqQMTLAkSVJ+7MGSJElSFiZYkiQpPwVdyd0CS5Ik5cdHhJIkScrCBEuSJOWnoI8ITbAkSZKqzARLkiTlxx4sSZIkZWGCJUmS8mMPliRJkrIwwZIkSfmxB0uSJElZmGBJkqT82IMlSZKkLEywJElSfuzBkiRJUhYmWJIkKT/2YEmSJCkLEyxJkpQfe7AkSZKUhQmWJEnKjwmWJEmSsjDBkiRJ+SnopwgtsCRJUn58RChJkqQsTLAkSVJ+CvqI0ARLkiSpykywJElSfuzBkiRJUhYmWJIkKT/2YEmSJCkLEyxJkpSbMMGSJElSFiZYkiQpNyZYkiRJysQES5Ik5aeYAZYJliRJUrWZYEmSpNzYgyVJkqRMTLAkSVJuTLAkSZKUiQmWJEnKjQmWJEmSMjHBkiRJuTHBkiRJUiYmWEuAbdbowll7rEVNBHcMGcP1j73d5PjeX+vJqd9ck/HTZwLwp6fe484hYwEY/qudeWPcRwB88OFMjrn5hdadvArrjRef4b6brqahoZ6Nv7E72+51UJPjzzz0d5558B6ipoalll6GvX54Mt16r5bPZFVIz/73P1z9m1/T0FDPN/f4Dt879Igmx196YSjXXHYRo0a+wc9+cRHbfmPnxmM7brEBffutDkC37j244JKrWnXuWgTFDLAssPJWE3DOXmvz/RuGMn7aTO48bgseGT6BtyZ80mTc4JfH8Yu/j/jc+TNn17PXFf9tremqjWhoqOfe31/B98++hI6du/LbM45m7Y23alJAbbD1jmy2854AjBj6JINvvobDzro4pxmraOrr67ni4gu4+KqBdO3WnWMOO4Att9me1b7Sr3FMXV0PTvvZL7j9zzd/7vwOSy3F9X+6szWnrMXkI0K1iPX7dOLdyZ8yZsoMZtcn7nvpA74xoFve01IbN2bka6zcvRcr1/WkXbv2rL/lDowY8mSTMUsvu1zjz7NmzoSC/kdS+Xht+Cv06r0KPXv1oX379uyw02489fijTcZ079mLfquvSU2Nv3ta8mRKsCJiOWBGSqkhItYA1gLuTynNbtHZtQF1nZZm3IczG7fHT5vJ+qus+LlxO69bxyZ9V+LtSZ/wq3tfZ9y00jlLtavhrh9vzpyGxMBH3+Zfwye02txVXNOnTKRT566N2x07d2X0m8M/N+7pB+7myfvuoH7ObH5wzmWtOUUV3KQJE+hW171xu0u3OkYMeznz+bNmzeLoQ/entrYdBx76A7be9hstMU1VQVETrKyPCB8HtomIlYCHgCHA/sBB8xscEUcBRwF02/l4Vtzwm1WYatv16IiJ/OPFD5hdn9h/s978er91OfT6oQBsf+HjTJj+Gb1XXoabj9yEN8Z9xOgpM3KesdqKzXfdm8133ZuX/vNPHrvrFvY97oy8pyQBcOs9D9K1Wx3vjx3NScceQd9+a9Crd5+8p6U2JOsjwkgpfQp8B7g2pfRdYJ0FDU4pDUwpbZxS2tjiauHGT5tJ9xWXbtyu67Q046fNbDLmw09nM7s+AXDHs2NYp3fHxmMTpn8GwJgpM3h21BQG9OqI9EV1XLkr0yZPbNyePnkinVbuusDx6225A8OH/Kc1pqY2oku3bkwYP65xe9KE8XTtWpf5/K7dSmN79urDhhttzMjXP9/DqiVDRLToKy+ZC6yI2IJSYnVfeV9ty0ypbXllzHRW67wsvVdahva1we4b9OCREU0f83VdoUPjzzsM6NbYAN9xmXa0ry398qy0bHs2Wm1FRo7/uPUmr8Lq1W9NJn8whikTPmDOnNm8/NQjrLXxlk3GTPpgTOPPrz//NJ179GrtaarA1lp7XcaOfpcP3h/D7NmzeeTh+9ni69tlOvej6dOYNWsWANM+nMqrL73Iqn37NXOWVF1ZHxH+BDgDuDulNCwivgI82sw5yqC+IXH+30dww+Ffo7YmuGvIWEaO/4Tjd+rPq2Om8ciIiRy81arsMKAb9fWJaTNmc8btrwLQr9vynLf3AFIq9Rdf/9jbn/v0obQ4amvb8e0fnMAfLjiF1NDARtvvRl2fvvzzrzfSq9+arL3xVjz9wN289cpz1NTWsszyK7DvsT4eVPXUtmvHj08+k9OOP5r6hnp2+/be9P1Kf2667mrWWHsdtvr69rw2/FXOOfUEPv7oI/77xL/5w/XXctNt9/DuO29z2YXnEVFDSg0ceOjhTT59qCVLUXuwIqWUfXDE8gAppcwxyZqnPZj9DaQWdMH31s97ClKjLVbtnPcUpEa9VuyQW5XT+ZBbW7ROmPzHA3O5t0yPCCNivYh4ARgGDI+I5yJigT1YkiRJmUQLv3KStQfrOuDElNKqKaVVgJOA61tuWpIkSV9eWXuwlkspNfZcpZQeK6+NJUmStNiK2oOVNcEaFRE/i4jVyq+zgVEtOTFJkqTWEBG7RsTrETEyIk5fwJj9ImJ4RAyLiL80d82sCdYPgPOAvwEJeKK8T5IkabHlnWBFRC1wDbATMAYYEhGDUkrDK8asTmk1ha1SSlMjotnvtFtogRURSwNHA/2BV4CT/HocSZJUIJsCI1NKowAi4jZgT6Dy+8GOBK5JKU0FSCk1+710zSVYNwOzKSVWuwFrU1oTS5Ik6QvLO8ECegGjK7bHAJvNM2YNgIh4ktJC6+emlB5Y2EWbK7AGpJTWK1/098CzizJjSZKkPFV+P3LZwJTSwEW8TDtgdWA7oDfweESsl1L6cGEnLEzj48CU0pwloMqUJElF0sKlRbmYWlhBNRao/Cbw3uV9lcYAz5TbpN6OiDcoFVxDFnTR5j5FuEFETC+/PgLWn/tzRExv5lxJkqQl3RBg9YjoGxEdgAOAQfOMuYdSekVEdKH0yHChqyksNMFKKfmFzpIkqcXk/XSs/ITuOOBBSv1VN5a/d/l8YGhKaVD52M4RMRyoB05JKU1e2HWzLtMgSZJUSCmlwcDgefadU/FzAk4svzKxwJIkSbnJO8FqKRZYkiQpN0UtsLJ+VY4kSZIyMsGSJEm5McGSJElSJiZYkiQpP8UMsEywJEmSqs0ES5Ik5cYeLEmSJGVigiVJknJjgiVJkqRMTLAkSVJuTLAkSZKUiQmWJEnKTzEDLBMsSZKkajPBkiRJubEHS5IkSZmYYEmSpNyYYEmSJCkTEyxJkpQbEyxJkiRlYoIlSZJyU9QEywJLkiTlp5j1lY8IJUmSqs0ES5Ik5aaojwhNsCRJkqrMBEuSJOXGBEuSJEmZmGBJkqTcFDTAMsGSJEmqNhMsSZKUG3uwJEmSlIkJliRJyk1BAywTLEmSpGozwZIkSbmxB0uSJEmZmGBJkqTcFDTAMsGSJEmqNhMsSZKUm5qaYkZYJliSJElVZoIlSZJyYw+WJEmSMjHBkiRJuSnqOlgWWJIkKTcFra98RChJklRtJliSJCk3RX1EaIIlSZJUZSZYkiQpNyZYkiRJysQES5Ik5aagAZYJliRJUrWZYEmSpNzYgyVJkqRMTLAkSVJuChpgmWBJkiRVmwmWJEnKjT1YkiRJysQES5Ik5aagAZYJliRJUrWZYEmSpNzYgyVJkqRMTLAkSVJuChpgmWBJkiRVmwmWJEnKTVF7sFq8wLrlh5u39FtImexw+t15T0Fq9PaN/5f3FCS1IBMsSZKUm4IGWBZYkiQpP0V9RGiTuyRJUpWZYEmSpNwUNMAywZIkSW1bROwaEa9HxMiIOH0+xw+LiIkR8WL5dURz1zTBkiRJucm7BysiaoFrgJ2AMcCQiBiUUho+z9C/ppSOy3pdEyxJktSWbQqMTCmNSinNAm4D9vyiF7XAkiRJuYlo6VccFRFDK15HzTOFXsDoiu0x5X3z2iciXo6IOyOiT3P35SNCSZJUWCmlgcDAL3iZe4FbU0qfRcQPgZuBHRZ2ggWWJEnKTd49WMBYoDKR6l3e1yilNLli8wbgouYu6iNCSZLUlg0BVo+IvhHRATgAGFQ5ICJ6VGzuAYxo7qImWJIkKTd5J1gppTkRcRzwIFAL3JhSGhYR5wNDU0qDgOMjYg9gDjAFOKy561pgSZKkNi2lNBgYPM++cyp+PgM4Y1GuaYElSZJyk38LVsuwB0uSJKnKTLAkSVJu8u7BaikmWJIkSVVmgiVJknJT0ADLBEuSJKnaTLAkSVJu7MGSJElSJiZYkiQpNwUNsCywJElSfmoKWmH5iFCSJKnKTLAkSVJuChpgmWBJkiRVmwmWJEnKjcs0SJIkKRMTLEmSlJuaYgZYJliSJEnVZoIlSZJyYw+WJEmSMjHBkiRJuSlogGWCJUmSVG0mWJIkKTdBMSMsEyxJkqQqM8GSJEm5cR0sSZIkZWKCJUmScuM6WJIkScrEBEuSJOWmoAGWCZYkSVK1mWBJkqTc1BQ0wrLAkiRJuSlofeUjQkmSpGozwZIkSblxmQZJkiRlYoIlSZJyU9AAywRLkiSp2kywJElSboq6TIMJliRJUpWZYEmSpNwUM78ywZIkSao6EyxJkpQb18GSJElSJiZYkiQpNzXFDLBMsCRJkqrNBEuSJOXGHixJkiRlYoIlSZJyU9AAywRLkiSp2kywJElSbuzBkiRJUiYmWJIkKTdFXQfLAkuSJOXGR4SSJEnKxARLkiTlppj5lQmWJElS1ZlgSZKk3NTYgyVJkqQsTLAkSVJuChpgmWBJkiRVmwmWJEnKjetgSZIkKRMTLEmSlJuCBlgmWJIkSdVmgiVJknJT1HWwLLCWAC8P/S+3/O5SGhoa2G7XPfn2foc2OX7/3/7MYw8Mora2lhU6rciRP/0ZXep6NB6f8cnHnPbDA/jaltty6I9Oae3pq0B23KAXF31/U2prgpv/9Sa/+fsrnxvznS1W48zvbkhKiVfencoPrnycPl2W49aTd6CmJmhfG/zugdf4/cOv53AHKpKnn3qCKy65kIb6er611z4c/P0jmxx/8fmhXHnJhbw18g3O/eXFbL/jLgCM++B9zjzpeBpSA3PmzGHf/Q9ir333z+MW1IZZYOWsob6em6+5iNN+eTUrd+nGOSccykabbUOvVb/SOGbVfmty/pU3s9TSS/PPf9zJbTdexXFn/LLx+J23XMda622Yx/RVIDUR/Obwzdjj/z3E2Mmf8vivvsXgoe/x2thpjWP6dV+Bk/Zajx1/NpgPP5lF145LAzBu6gx2OPs+Zs1pYLml2vHspXtx39D3GDd1Rl63oy+5+vp6fnPhBVx27fV0q6vjiIP3Z+ttt6fvV/o3jqnr3oMzz7uAW2/5Q5NzO3fpwu/+8Bc6dOjAp59+wiH77cXW225Pl67dWvkulEVBAyx7sPL21hvDqOvZm249etGufXs233Znnnv68SZjBmywMUstXfqDrP9a6zFl0oTGY2+/OYJpU6ew7kabt+q8VTwb9+/CqHEf8c6Ej5ld38CdT73N7pus0mTMYd9Yg4EPvsaHn8wCYOL0mQDMrm9g1pwGAJZqX0uN/2XRFzRi2Cv07tOHXr370L59B3bc+Zv857FHm4zp0bMX/Vdf83OPmNq370CHDh0AmD1rNg0NDa02b2muTAlWRKwyv/0ppfeqO522Z+qkiazcta5xe+Uu3Xjr9WELHP/vhwax/sZbANDQ0MBfrr+CY045j1dfHNLic1Wx9Vx5WcZM/qRxe+zkT9hk9a5NxvTv2QmAh8/fjdqaGn55x4v886WxAPTqvCx3nb4jX+nekbP/NNT0Sl/IxAnj6VbRCtG1ro7hr76c+fzx4z7g1BN+xJjR7/Gjn5xkerUEa+vrYN0H/KP8z38Bo4D7FzQ4Io6KiKERMfTuW//whSepkicfuZ+33xjB7vscDMC//nEnG2yyZZMCTWpJ7WqC/j06stt5D/D9K/7N1T/ckk7LlpKCsZM/ZfNTBrH+8XfxvW370a3T0jnPVm1ZXfce3PzXu/nr3+/ngX/8nSmTJ+U9JbUxmRKslNJ6ldsRsRHwo4WMHwgMBHh21LT0RSZYdCt16cqUieMbt6dMmsBKnbt+btyrLzzLoNtu4syLfkf7cvT95ohXeGPYi/zrH3cxc+anzJk9h6WXXob9f3Bcq81fxfH+lE/p3Xm5xu1enZfj/Smffm7MkDcnMqc+8e7Ejxn5wTT69ViB59+a3Dhm3NQZDB/9IVuuVcc9z7zbavNXsXTtVseE8R80bk8cP56ui/GXyS5du9G33+q89MJzjU3wWrIsCR0FEbErcAVQC9yQUrpwAeP2Ae4ENkkpDV3YNRfrvlJKzwObLc65auorawxg3PujmTBuLHNmz+bpfz/ERptv02TMOyNf56Yrf8VPf34JnVZcuXH/j077BZf/8V4uu/nvHHjECWy94zctrrTYnntrEv16dGTVrsvTvraGfbfsy+Cho5uMuffZ99hmne4AdF5hKfr36MQ74z+m58rLsnT7WgBWXK4DW6zZjTffn/a595CyWmvAuowe/R7vjx3D7Nmz+OdDg9lq2+0znTth/Dg+m1nqD5w+fRovv/g8q6zatyWnqy+xiKgFrgF2AwYAB0bEgPmMWwE4AXgmy3Wz9mCdWLFZA2wEvJ/lXC1cbW07DjnmFC4++3ga6hv4+s7fpveq/bjrj9fRd4212Wjzr3Pb769k5swZXPXLMwDo3LU7J557ac4zV9HUNyROuvFp7jlrJ2prglseHcmIMR9y9n4b8vxbkxn83Gj++dJYvrFBT4b+Zi/qGxJn/2koUz7+jO3X68GvDtmElEqfCLry3mEMG/1h3rekL7F27dpx4qlnceJxR9FQ38Due+7NV/r154bfXsVaA9Zh6213YMSwVzjz5BP4aPp0nnziMX5/3TX86Y5BvPv2KK6+7GIIIMGBBx9Gv9XXyPuWtABLQA/WpsDIlNIogIi4DdgTGD7PuF8AvwYyrYcUKTX/BC8ifl6xOQd4B7grpTSzuXN9RKglxQ6n3533FKRGb9/4f3lPQWrUdfl2uVU5x9/zWovWCVftvfYPgaMqdg0stzIBEBH7ArumlI4obx8MbJZSOq5izEbAWSmlfSLiMeDk5h4RZu3BOq/8BsumlD5tbrwkSVIWNS1c2lX2hS+OiKgBfgMctijnZerBiogtImI48Fp5e4OIuHZRJylJklSpJlr2lcFYoE/Fdu/yvrlWANYFHouId4DNgUERsfFC7yvj/V8O7AJMBkgpvQR8PeO5kiRJS6ohwOoR0TciOgAHAIPmHkwpTUspdUkprZZSWg14GtijKo8Iy28wep5GtPpFmb0kSdK88m5yTynNiYjjgAcpLdNwY0ppWEScDwxNKQ1a+BXmL2uBNToitgRSRLSn9DHFEYvzhpIkSUuSlNJgYPA8+85ZwNjtslwza4F1NKUFuHpRei75EHBsxnMlSZLmq6Wb3POS9VOEk4CDWngukiRJhbDQAisi5huPlaWU0i+qPB9JktSG5L/OaMtoLsH6ZD77lgMOBzpTWtVUkiRJFRZaYKWUGr+PpeI7eL4P3Ab4XS2SJOkLqSlohNVsD1ZErAycSKkH62Zgo5TS1JaemCRJ0pdVcz1YFwPfobTE/HoppY9bZVaSJKlNyLri+ZdNc/d1EtATOBt4PyKml18fRcT0lp+eJEnSl09zPVhFLSwlSdISoKAtWIVN5iRJknKT+bsIJUmSqq2onyI0wZIkSaoyEyxJkpSbggZYJliSJEnVZoIlSZJyU2OCJUmSpCxMsCRJUm6K+ilCCyxJkpSbgtZXPiKUJEmqNhMsSZKUG5vcJUmSlIkJliRJyk1QzAjLBEuSJKnKTLAkSVJu7MGSJElSJiZYkiQpNyZYkiRJysQES5Ik5SYKupS7CZYkSVKVmWBJkqTc2IMlSZKkTEywJElSbgragmWCJUmSVG0mWJIkKTc1BY2wTLAkSZKqzARLkiTlxk8RSpIkKRMTLEmSlJuCtmBZYEmSpPzUUMwKy0eEkiRJVWaCJUmSclPUR4QmWJIkSVVmgiVJknLjMg2SJEnKxARLkiTlxq/KkSRJUiYmWJIkKTcFDbBMsCRJkqrNBEuSJOXGHixJkiRlYoIlSZJyU9AAywRLkiSp2kywJElSboqa9BT1viRJknJjgiVJknITBW3CMsGSJEmqMhMsSZKUm2LmVyZYkiRJVWeCJUmSclPUldwtsCRJUm6KWV75iFCSJKnqTLAkSVJuCvqE0ARLkiSp2kywJElSblxoVJIkSZmYYEmSpNwUNbhizokAABGXSURBVOkp6n1JkiTlxgRLkiTlxh4sSZKkAoqIXSPi9YgYGRGnz+f40RHxSkS8GBH/iYgBzV3TAkuSJOUmWvjV7PtH1ALXALsBA4AD51NA/SWltF5KaUPgIuA3zV3XAkuSJLVlmwIjU0qjUkqzgNuAPSsHpJSmV2wuB6TmLtriPVjrr9Kppd9CyuS5K/fLewpSo1W2+UneU5AazXjh6tzeewnoweoFjK7YHgNsNu+giDgWOBHoAOzQ3EVNsCRJUmFFxFERMbTiddTiXCeldE1KqR9wGnB2c+P9FKEkScpNSyc9KaWBwMCFDBkL9KnY7l3etyC3Ab9t7n1NsCRJUls2BFg9IvpGRAfgAGBQ5YCIWL1ic3fgzeYuaoIlSZJyk3cPVkppTkQcBzwI1AI3ppSGRcT5wNCU0iDguIjYEZgNTAUObe66FliSJKlNSykNBgbPs++cip9PWNRrWmBJkqTc5P4ZwhZiD5YkSVKVmWBJkqTc5L8MVsuwwJIkSbmpKehDQh8RSpIkVZkJliRJyk1RHxGaYEmSJFWZCZYkScpN2IMlSZKkLEywJElSbuzBkiRJUiYmWJIkKTeugyVJkqRMTLAkSVJu7MGSJElSJiZYkiQpNyZYkiRJysQES5Ik5caV3CVJkpSJCZYkScpNTTEDLBMsSZKkajPBkiRJubEHS5IkSZmYYEmSpNy4DpYkSZIyMcGSJEm5KWoPlgWWJEnKjcs0SJIkKRMTLEmSlJuiPiI0wZIkSaoyEyxJkpQbl2mQJElSJiZYkiQpNwUNsEywJEmSqs0ES5Ik5aamoE1YJliSJElVZoIlSZJyU8z8ygRLkiSp6kywJElSfgoaYZlgSZIkVZkJliRJyo3fRShJkqRMTLAkSVJuCroMlgmWJElStZlgSZKk3BQ0wDLBkiRJqjYTLEmSlJ+CRlgWWJIkKTcu0yBJkqRMTLAkSVJuXKZBkiRJmZhgSZKk3BQ0wDLBkiRJqjYTLEmSlJ+CRlgmWJIkSVVmgiVJknLjOliSJEnKxARLkiTlxnWwJEmSlIkJliRJyk1BAywTLEmSpGozwZIkSfkpaIRlgiVJklRlJliSJCk3roMlSZKkTEywJElSblwHS5IkSZmYYEmSpNwUNMCywJIkSTkqaIXlI0JJktSmRcSuEfF6RIyMiNPnc/zEiBgeES9HxL8iYtXmrmmBJUmSchMt/L9m3z+iFrgG2A0YABwYEQPmGfYCsHFKaX3gTuCi5q5rgSVJktqyTYGRKaVRKaVZwG3AnpUDUkqPppQ+LW8+DfRu7qL2YC0BnnzicX594QU01Dew9z7f5fAjj2pyfNasWZx1xqmMGDaMTiuuyEWXXkavXr2ZPWsW55/3c4YPe5WaCE494yw22XSznO5CRfDcM09yw1UXU9/QwM6778W+B/2gyfFXX3qOG666hHdGvckp5/yKrbbbqfHYH353BUOffgKA/Q85km122KVV567i2WnLtbnklH2pranhD/c8xSU3Pdzk+EUnfYevb7IGAMsu3YGuKy9Pj6+fyvpr9OLKsw5gheWWpr6+gYt+/yB3PvR8HregDFp6mYaIOAqo/IN1YEppYMV2L2B0xfYYYGF/mB4O3N/c+1pg5ay+vp5fXnA+111/E3V1dXxv/33Zbvsd6Ne/f+OYu++6g44dO/KPBx7m/sH3cflvLuHiSy/nrjvvAOCue+5l8uTJHHv0kfzlr3dSU2MwqUVXX1/PdZdfyPmX/pbOXes46YcHselW27LKav0ax3Tt1oMTzjiPe277Y5Nzh/z3Cd56YwRX3HAbs2fP5swTjuBrm23Fssst39q3oYKoqQkuP30/dj/masaO/5D//PkU/vHvV3ht1LjGMade+rfGn485YFs2WLMUKnw6czaH/+yPvPXeRHp07cSTfz6Vh58awbSPZ7T6fSh/5WJqYLMDM4iI/wM2BrZtbqx/Eufs1Vdepk+fVendpw/tO3Rg12/uzmOP/qvJmEcfeYQ99twbgJ123oVnn/4vKSVGvTWSTTcrFdmdO3dmhRVWYNirr7b6PagY3hzxKj169aF7z960b9+ebXbYhWf+81iTMXU9etK33xrEPEX86HdGsc4GG1Hbrh1LL7MMq/VbneefeaoVZ6+i2WTd1Xhr9CTeGTuZ2XPquePB5/nWdusvcPx+u36N2x94DoCR703grfcmAvDBxGlMnPoRXVa22F9SRQu/MhgL9KnY7l3e13SeETsCZwF7pJQ+a+6imQqsiFh5Pq/22eathZkwfjzde3Rv3O5WV8f48eObjpkwnu7dewDQrl07ll9hBT78cCprrLkW/370EebMmcOYMaMZMXwY48d90KrzV3FMnjSBLt3qGre7dK1j8qSJmc7t238Nnn/2KT6bOYPpH07llReGMnHiuOZPlBagZ7dOjBk/tXF77Pip9Oraab5jV+mxEqv27MxjQ17/3LGN11mVDu3aMWr0pBabq770hgCrR0TfiOgAHAAMqhwQEV8FrqNUXE3IctGsjwifp1TdTaVUEK4IjIuI8cCRKaXn5plI4/POq6+97nM9RaqOvb6zD2+Peovv7bcPPXr2ZIMNv0pNbW3e01Ib9NVNtuDN14Zx6rGH0bHTSqy1zvrU1Pi7qNbx3V2+xj3/epGGhtRkf/cuHfn9/zuEI8+5hZTSAs5W7nJeByulNCcijgMeBGqBG1NKwyLifGBoSmkQcDGwPHBHlJrG3ksp7bGw62YtsB4G7kwpPQgQETsD+wA3AdcyTzNY5fPOmXPwt3ohutXVMe6D//1Nf8L48dTV1TUd062OceM+oK57d+bMmcPHH33EiiuuRERwyulnNo475KADWHXV1Vpr6iqYzl26MWnC/9LTSRPH07lL18zn73fwEex38BEAXHL+GfTqs0rV56i24/0J0+hdt1Ljdq+6lRg7cdp8x+67y9f46YW3N9m3wnJL87crj+Hca+7l2VfeacmpqgBSSoOBwfPsO6fi5x0X9ZpZe7A2n1tcld/oIWCLlNLTwFKL+qb6n3XWXY/33nuHMWNGM3vWLB4YfB/bbr9DkzHbbb8Dg/5+NwAPP/Qgm262ORHBjBkz+PTT0qdG//vUk9TW1jZpjpcWxeprrcP7Y95j3AdjmT17Nk888iCbbbVdpnPr6+uZPu1DAN5+6w3eGfUmX914ixacrYpu6LB36b9KV1bt2Zn27Wr57i4bcd9jL39u3Bqr1bFSx2V5+qW3G/e1b1fLXy89kr/84xnu/ueLrTltLYa818FqKVkTrA8i4jRKa0MA7A+MLy/O1dAiM2sj2rVrxxlnncMxRx1BQ0M9e+29D/37r841V13BOuusy3Y7fIO999mXs04/hW/tuhMdO3XioksuA2DKlMkcc9Th1NTU0K1bHRdc2Oy6Z9IC1bZrxw9/chrnnvwjGhoa2PGbe7JK3378+ffX0n+tAWy21Xa8OWIYv/zZiXz80XSGPPU4f7npd1xz813Uz5nDGT8uLemwzHLLc+JZF1Dbzg8pa/HV1zfw01/fzr3XHkttTXDz359mxKhx/OyY3Xl++Hvc9+9XgNLjwTsebNKlwj47b8TWG/Vn5RWX4//22ByAo865hZff+FzfstRiIstz6YjoAvwc2BpIwJPA+cA0YJWU0sgFnesjQi0p3p30afODpFay4W6n5j0FqdGMF67OLep5fdynLVonrNl92VzuLdNfMVNKk4AfR8RyKaVP5jm8wOJKkiSpLcq6TMOWETEcGFHe3iAirm3RmUmSpMJbAtbBahFZm9wvA3YBJgOklF4Cvt5Sk5IkSfoyy9yFmlIaHU2/MKi++tORJEltSs7rYLWUrAXW6IjYEkjlFdxPoPy4UJIkSU1lLbCOBq6g9I3TY4GHgGNbalKSJKltyHOtqpa0KJ8iPKiF5yJJklQICy2wIuKchRxOKaVfVHk+kiSpDYliBljNJljzrnkFsBxwONAZsMCSJEmLraD11cILrJTSpXN/jogVKDW3f5/SV+ZcuqDzJEmS2rJme7AiYmXgREo9WDcDG6WUprb0xCRJUhtQ0AiruR6si4HvAAOB9VJKH7fKrCRJkr7EmkuwTgI+A84GzqpYaDQoNbl3bMG5SZKkgmuTyzSklLJ+lY4kSZLKMn9VjiRJUrUVdZkGEypJkqQqM8GSJEm5KWiAZYIlSZJUbSZYkiQpPwWNsEywJEmSqswES5Ik5aao62CZYEmSJFWZCZYkScqN62BJkiQpExMsSZKUm4IGWCZYkiRJ1WaCJUmScmMPliRJkjIxwZIkSTkqZoRlgiVJklRlJliSJCk3Re3BssCSJEm5KWh95SNCSZKkajPBkiRJuSnqI0ITLEmSpCozwZIkSbmJgnZhmWBJkiRVmQmWJEnKTzEDLBMsSZKkajPBkiRJuSlogGWCJUmSVG0mWJIkKTeugyVJkqRMTLAkSVJuXAdLkiRJmZhgSZKk/BQzwDLBkiRJqjYTLEmSlJuCBlgmWJIkSdVmgiVJknLjOliSJEnKxARLkiTlpqjrYFlgSZKk3PiIUJIkSZlYYEmSJFWZBZYkSVKV2YMlSZJyYw+WJEmSMjHBkiRJuSnqMg0mWJIkSVVmgiVJknJjD5YkSZIyMcGSJEm5KWiAZYIlSZJUbSZYkiQpPwWNsEywJEmSqswCS5Ik5SZa+H+Z5hCxa0S8HhEjI+L0+Rz/ekQ8HxFzImLfLNe0wJIkSW1WRNQC1wC7AQOAAyNiwDzD3gMOA/6S9br2YEmSpNwsAetgbQqMTCmNAoiI24A9geFzB6SU3ikfa8h6URMsSZJUWBFxVEQMrXgdNc+QXsDoiu0x5X1fiAmWJEnKTUsHWCmlgcDAFn6bzzHBkiRJbdlYoE/Fdu/yvi/EAkuSJOUnWvjVvCHA6hHRNyI6AAcAg77obVlgSZKk3OS9TENKaQ5wHPAgMAK4PaU0LCLOj4g9ACJik4gYA3wXuC4ihjV3XXuwJElSm5ZSGgwMnmffORU/D6H06DAzCyxJkpSbJWCZhhbhI0JJkqQqi5RS3nNQBhFxVPmjplLu/H3UksLfRS2pTLC+POZdGE3Kk7+PWlL4u6glkgWWJElSlVlgSZIkVZkF1peHPQZakvj7qCWFv4taItnkLkmSVGUmWJIkSVVmgbUEiYj6iHgxIl6NiDsiYtm856S2JyJSRFxasX1yRJyb45TURvm7qC8zC6wly4yU0oYppXWBWcDReU9IbdJnwHciokveE1Gb5++ivrQssJZcTwD9I2LliLgnIl6OiKcjYn2AiNi2nHa9GBEvRMQKOc9XxTGHUuPwT+c9EBFdI+KuiBhSfm1V3n9uRJxcMe7ViFittSaswlqc38WuEfFwRAyLiBsi4l0LNOXBAmsJFBHtgN2AV4DzgBdSSusDZwJ/LA87GTg2pbQhsA0wI4+5qrCuAQ6KiE7z7L8CuCyltAmwD3BDq89Mbc2i/i7+HHgkpbQOcCewSqvNVKrglz0vWZaJiBfLPz8B/B54htJ/PEgpPRIRnSOiI/Ak8JuI+DPwt5TSmFxmrEJKKU2PiD8Cx9O0eN8RGBD/+3bWjhGxfGvPT23HYvwubg3sXT73gYiY2przleaywFqyzCgnUo1iAV8znlK6MCLuA74JPBkRu6SUXmuFOartuBx4HripYl8NsHlKaWblwIiYQ9NEfOmWn57akEX5XWzNeUkL5CPCJd8TwEEAEbEdMKn8N7p+KaVXUkq/BoYAa+U4RxVQSmkKcDtweMXuh4Afz92IiLl/IXgH2Ki8byOgb+vMUm3BIv4uPgnsV963M7BSK01TasICa8l3LvC1iHgZuBA4tLz/J+VG4peB2cD9Oc1PxXYpUNkgfDywcflDF8P53ydd7wJWjohhwHHAG607TbUBWX8XzwN2johXge8C44CPWnWmEq7kLkkqkIhYCqhPKc2JiC2A387beiG1BnuwJElFsgpwe0TUUFpP8Mic56M2ygRLkiSpyuzBkiRJqjILLEmSpCqzwJIkSaoyCyxJkqQqs8CSJEmqMgssSZKkKvv/K3MoytNVWeUAAAAASUVORK5CYII=\n","text/plain":["<Figure size 792x648 with 2 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"bk_kMbZfyYyD","colab_type":"text"},"source":["# WITH TEST"]},{"cell_type":"code","metadata":{"id":"a3uocKM6CN7a","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":124},"executionInfo":{"status":"ok","timestamp":1593135725995,"user_tz":240,"elapsed":17596,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"1d4cb860-5f02-43a1-8596-af97d9d085a5"},"source":["from google.colab import drive\n","drive.mount('/content/drive')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n","\n","Enter your authorization code:\n","··········\n","Mounted at /content/drive\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Wim0L1o3yYlC","colab_type":"code","colab":{}},"source":["!cp /content/drive/'My Drive/Machine-Learning-Projects'/cs231n-project/datasets/emotiw/test-final-laugh-prob.pkl .\n","!cp /content/drive/'My Drive/Machine-Learning-Projects'/cs231n-project/datasets/emotiw/ensemble-scene-scene-pose-audio-face-caption-v1-test.zip ."],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"WsmGj1GKyXdY","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":87},"executionInfo":{"status":"ok","timestamp":1593135746256,"user_tz":240,"elapsed":2013,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"394a95c1-a0ef-4a21-f850-73bdd25fd07d"},"source":["!unzip ensemble-scene-scene-pose-audio-face-caption-v1-test.zip"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Archive:  ensemble-scene-scene-pose-audio-face-caption-v1-test.zip\n","   creating: ensemble-scene-scene-pose-audio-face-caption-v1-test/\n","  inflating: ensemble-scene-scene-pose-audio-face-caption-v1-test/X_test.npy  \n","  inflating: ensemble-scene-scene-pose-audio-face-caption-v1-test/y_test.npy  \n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"oMeCo93VyplR","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593135748148,"user_tz":240,"elapsed":402,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"5222b957-278c-45e3-f1f4-6a799e854280"},"source":["import numpy as np\n","\n","X_test = np.load(\"ensemble-scene-scene-pose-audio-face-caption-v1-test/X_test.npy\")\n","y_test = np.load(\"ensemble-scene-scene-pose-audio-face-caption-v1-test/y_test.npy\")\n","X_test.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(756, 254)"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"code","metadata":{"id":"lodTWn5Jyrxm","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593135749693,"user_tz":240,"elapsed":385,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"dd1b56d6-e1ac-4dc9-933d-66bb1985fdec"},"source":["## Get the laughs\n","import pickle\n","test_vid_to_laugh = {}\n","test_laugh_vec = []\n","\n","with open('test-final-laugh-prob.pkl', 'rb') as handle:\n","    test_laugh_obj = pickle.load(handle)\n","    i = 0\n","    for vid in test_laugh_obj[\"vids\"]:\n","        test_vid_to_laugh[vid] = test_laugh_obj[\"actual_preds\"][i]\n","        i += 1\n","    \n","    for vid in sorted(test_laugh_obj[\"vids\"]):\n","        test_laugh_vec.append(test_vid_to_laugh[vid])\n","print(len(test_laugh_vec))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["756\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"LC-zeY6myt77","colab_type":"code","colab":{}},"source":["# Adding laughter probability as an additional dimension\n","test_laugh_vec = np.expand_dims(test_laugh_vec, 1)\n","X_test = np.hstack((X_test, test_laugh_vec))\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"4InGIb-Cyvtp","colab_type":"code","colab":{}},"source":["\n","import tensorflow as tf\n","MODEL_PATH = '/content/drive/My Drive/Machine-Learning-Projects/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-v1/cp-0036.h5'\n","model = tf.keras.models.load_model(MODEL_PATH)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"fUgD1PK3y26t","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":55},"executionInfo":{"status":"ok","timestamp":1593135765833,"user_tz":240,"elapsed":2312,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"c2704db7-9e85-46a8-9649-8edbe31f4f17"},"source":["#\n","# CONFIGURATION\n","#\n","# Define any constants for the model here\n","#\n","\n","from pathlib import Path\n","import tensorflow as tf\n","import matplotlib.pyplot as plt\n","\n","sizes = [32, 30, 40, 128, 8, 16, 1]\n","\n","\n","# UNCOMMENT IF EXCLUDING FER, AND RESNET [best] ************\n","mask = []\n","for x in range(sum(sizes)):\n","    if x >= 62 and x < 102:\n","        mask.append(False)\n","    elif x < 230:\n","        mask.append(True)\n","    elif x >= 238:\n","        mask.append(True)\n","    else:\n","        mask.append(False)\n","\n","\n","import pickle\n","history = model.evaluate(\n","          x=X_test[:, mask],\n","          y=y_test\n",")\n","\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["24/24 [==============================] - 0s 2ms/step - loss: 1.0437 - accuracy: 0.6177\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"F3Ze5J1lGT80","colab_type":"code","colab":{}},"source":["\n","import pickle\n","predictions = model.predict(\n","          x=X_test[:, mask]\n",")"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"VY68tzK3Gap6","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593135770302,"user_tz":240,"elapsed":516,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"be1ec01c-4f3f-4831-b3de-8c7e226008bd"},"source":["len(y_test)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["756"]},"metadata":{"tags":[]},"execution_count":10}]},{"cell_type":"code","metadata":{"id":"oftTmLT7GXY7","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593135770844,"user_tz":240,"elapsed":318,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"481f95de-40f6-461c-cd3b-3ea3c711ef05"},"source":["len(predictions)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["756"]},"metadata":{"tags":[]},"execution_count":11}]},{"cell_type":"code","metadata":{"id":"85MgGCJFGmEL","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":624},"executionInfo":{"status":"ok","timestamp":1593135772274,"user_tz":240,"elapsed":437,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"2f531fc7-f2ef-4720-923c-ef60d9b42cef"},"source":["y_true_final = np.argmax(y_test, axis=1)\n","y_pred_final = np.argmax(predictions, axis=1)\n","y_pred_final"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([1, 0, 0, 0, 2, 0, 0, 1, 1, 2, 1, 1, 1, 0, 1, 0, 2, 2, 2, 1, 1, 2,\n","       1, 0, 2, 1, 1, 0, 2, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 2, 1, 1, 1, 2,\n","       2, 0, 1, 1, 1, 0, 2, 1, 1, 0, 2, 1, 1, 1, 0, 1, 2, 2, 1, 0, 1, 2,\n","       0, 0, 1, 0, 2, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,\n","       2, 0, 0, 1, 1, 2, 1, 1, 2, 1, 0, 0, 0, 1, 0, 2, 0, 2, 1, 1, 0, 0,\n","       1, 1, 0, 2, 2, 1, 2, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 0, 1, 1, 1, 0,\n","       2, 0, 2, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 0, 1, 0, 0, 1, 0, 0, 2,\n","       1, 1, 0, 0, 2, 2, 1, 2, 0, 1, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1,\n","       0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 1, 1, 1, 0, 0, 0, 2, 1, 1, 2, 0,\n","       1, 2, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 1, 2, 1, 1, 0, 2, 1, 0, 1,\n","       0, 1, 2, 1, 0, 2, 1, 1, 1, 2, 2, 0, 1, 1, 0, 2, 2, 0, 1, 0, 1, 0,\n","       2, 1, 2, 2, 1, 2, 0, 1, 2, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1,\n","       2, 2, 1, 0, 1, 1, 0, 1, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 1,\n","       2, 1, 2, 2, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 2,\n","       0, 1, 2, 0, 2, 2, 0, 1, 1, 1, 1, 0, 0, 2, 2, 0, 1, 0, 0, 2, 0, 1,\n","       0, 2, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 2, 0, 2, 1, 1, 0, 1,\n","       0, 0, 1, 1, 1, 2, 1, 2, 1, 0, 0, 2, 0, 1, 2, 1, 1, 1, 0, 0, 1, 1,\n","       0, 1, 0, 2, 1, 2, 1, 1, 0, 1, 0, 1, 2, 0, 2, 0, 2, 2, 0, 2, 2, 1,\n","       0, 0, 0, 1, 0, 1, 2, 0, 1, 1, 0, 2, 0, 0, 2, 2, 1, 2, 2, 0, 1, 1,\n","       1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 0, 1, 0, 1, 0, 0, 2,\n","       0, 1, 2, 1, 2, 1, 2, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 0, 1, 1, 1,\n","       1, 0, 1, 2, 2, 1, 1, 0, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 0, 2, 1, 1,\n","       1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0,\n","       2, 2, 0, 1, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1,\n","       0, 1, 2, 2, 2, 1, 1, 0, 1, 1, 2, 2, 1, 2, 1, 1, 1, 1, 0, 1, 0, 1,\n","       1, 0, 1, 0, 1, 1, 0, 0, 2, 1, 1, 1, 2, 1, 1, 2, 2, 2, 0, 1, 2, 1,\n","       2, 2, 0, 0, 0, 2, 1, 2, 1, 2, 2, 0, 1, 1, 0, 1, 0, 1, 1, 2, 2, 2,\n","       1, 2, 1, 0, 0, 2, 0, 0, 0, 1, 0, 2, 1, 0, 2, 1, 1, 1, 1, 1, 0, 1,\n","       2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 2,\n","       1, 2, 0, 1, 2, 1, 2, 1, 2, 1, 0, 0, 0, 2, 1, 1, 1, 2, 2, 1, 2, 1,\n","       2, 1, 0, 2, 2, 0, 1, 0, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 1, 0, 1, 1,\n","       2, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1,\n","       1, 2, 0, 1, 1, 1, 1, 1, 0, 2, 0, 2, 1, 0, 1, 1, 1, 2, 1, 0, 1, 1,\n","       1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 0, 2, 2, 0, 0, 2, 1, 2, 1,\n","       0, 1, 1, 2, 0, 0, 1, 1])"]},"metadata":{"tags":[]},"execution_count":12}]},{"cell_type":"markdown","metadata":{"id":"x_hs6Lno3Phy","colab_type":"text"},"source":["## Without Boosting"]},{"cell_type":"code","metadata":{"id":"gEA96yNE04uM","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":625},"executionInfo":{"status":"ok","timestamp":1593135776151,"user_tz":240,"elapsed":1119,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"158c2089-eaa2-4be6-cbe5-ee3f4e607212"},"source":["from sklearn import metrics \n","import pandas as pd\n","import seaborn as sn\n","cm=metrics.confusion_matrix(y_true_final,y_pred_final)\n","import matplotlib.pyplot as plt\n","\n","classes=['Pos' , 'Neu' , 'Neg']\n","con_mat = tf.math.confusion_matrix(labels=y_true_final, predictions=y_pred_final).numpy()\n","con_mat_norm = np.around(con_mat.astype('float') / con_mat.sum(axis=1)[:, np.newaxis], decimals=2)\n","con_mat_df = pd.DataFrame(con_mat_norm,\n","                  index = classes, \n","                  columns = classes)\n","\n","figure = plt.figure(figsize=(11, 9))\n","plt.title(\"FC Voting Confusion Matrix with Scene & Audio\")\n","sn.heatmap(con_mat_df, annot=True,cmap=plt.cm.Blues)\n","\n","\n","accuracy = (y_pred_final == y_true_final).mean()\n","print(f\"Accuracy: {accuracy}\")"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n","  import pandas.util.testing as tm\n"],"name":"stderr"},{"output_type":"stream","text":["Accuracy: 0.6177248677248677\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 792x648 with 2 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"fD_2sDIk0-Q7"},"source":["### Add boosting for positive"]},{"cell_type":"code","metadata":{"id":"ZQ_bZkLa1w9i","colab_type":"code","colab":{}},"source":["\n","BOOSTING_SECOND_MODEL = tf.keras.models.load_model('/content/drive/My Drive/Machine-Learning-Projects/cs231n-project/models/ensemble-scene-scene-pose-audio-face-caption-laugh-for-boost-BOOST-v2/cp-0049.h5')"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab_type":"code","id":"J7e9FZo70-Q_","colab":{"base_uri":"https://localhost:8080/","height":35},"executionInfo":{"status":"ok","timestamp":1593135781473,"user_tz":240,"elapsed":347,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"f43060ca-c332-43b2-a316-615d63a984cd"},"source":["y_test.shape\n","\n","test_pred_pos_neu = np.argwhere(np.argmax(predictions,axis=1)<=1)\n","filtered_y_test = []\n","filtered_x_test = []\n","\n","for i in test_pred_pos_neu:\n","  filtered_y_test.append(y_test[i])\n","  filtered_x_test.append(X_test[i])\n","\n","\n","filtered_y_test = np.asarray(filtered_y_test).squeeze()[:,:2]\n","filtered_x_test = np.asarray(filtered_x_test).squeeze()\n","\n","filtered_x_test.shape\n"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(560, 255)"]},"metadata":{"tags":[]},"execution_count":15}]},{"cell_type":"code","metadata":{"id":"q1vKOs9e2ctl","colab_type":"code","colab":{}},"source":["new_pred = BOOSTING_SECOND_MODEL.predict(filtered_x_test[:,mask])\n","new_pred = np.argmax(new_pred, axis=1)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"kJkNXmU226t4","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":624},"executionInfo":{"status":"ok","timestamp":1593135793911,"user_tz":240,"elapsed":285,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"127c7cc9-6eaa-463a-b865-11b245db33e3"},"source":["test_pred_pos_neu_f = test_pred_pos_neu.reshape(1,-1)\n","\n","counter = 0\n","y_pred_test_boost = y_pred_final\n","for i in range(0,len(y_pred_test_boost)):\n","  if i in test_pred_pos_neu_f:\n","    y_pred_test_boost[i] = new_pred[counter]\n","    counter += 1\n","y_pred_test_boost"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([1, 0, 0, 0, 2, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 0, 2, 2, 2, 1, 1, 2,\n","       1, 0, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 2, 1, 1, 1, 2,\n","       2, 0, 1, 1, 1, 0, 2, 1, 1, 1, 2, 1, 0, 1, 0, 1, 2, 2, 1, 0, 1, 2,\n","       0, 0, 1, 1, 2, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,\n","       2, 0, 0, 1, 1, 2, 1, 1, 2, 1, 0, 0, 0, 1, 0, 2, 0, 2, 1, 1, 1, 0,\n","       1, 1, 0, 2, 2, 1, 2, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 0,\n","       2, 0, 2, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 0, 1, 0, 0, 1, 0, 0, 2,\n","       1, 1, 0, 0, 2, 2, 1, 2, 0, 1, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1,\n","       0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 1, 1, 1, 0, 0, 0, 2, 1, 1, 2, 0,\n","       1, 2, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 1, 2, 1, 1, 0, 2, 1, 0, 1,\n","       0, 1, 2, 1, 0, 2, 1, 1, 1, 2, 2, 0, 1, 1, 0, 2, 2, 0, 1, 0, 1, 0,\n","       2, 1, 2, 2, 1, 2, 0, 1, 2, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1,\n","       2, 2, 1, 0, 1, 1, 0, 0, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 1,\n","       2, 1, 2, 2, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 2,\n","       0, 1, 2, 0, 2, 2, 0, 1, 1, 1, 1, 0, 0, 2, 2, 0, 1, 0, 0, 2, 0, 1,\n","       0, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 2, 0, 2, 1, 1, 0, 1,\n","       0, 0, 1, 1, 1, 2, 0, 2, 1, 0, 0, 2, 0, 1, 2, 1, 1, 1, 0, 0, 1, 1,\n","       0, 1, 0, 2, 1, 2, 1, 1, 0, 1, 0, 1, 2, 0, 2, 0, 2, 2, 0, 2, 2, 1,\n","       0, 1, 0, 1, 0, 1, 2, 0, 1, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 1, 1,\n","       1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 2, 1, 1, 1, 0, 0, 0, 1, 0, 0, 2,\n","       0, 1, 2, 1, 2, 1, 2, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 0, 1, 1, 1,\n","       0, 0, 1, 2, 2, 1, 1, 0, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 0, 2, 1, 1,\n","       1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0,\n","       2, 2, 0, 1, 0, 1, 0, 0, 1, 2, 1, 2, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1,\n","       0, 0, 2, 2, 2, 0, 1, 0, 1, 1, 2, 2, 1, 2, 1, 1, 1, 1, 0, 1, 0, 1,\n","       1, 0, 1, 0, 1, 0, 0, 0, 2, 1, 1, 1, 2, 1, 1, 2, 2, 2, 0, 1, 2, 1,\n","       2, 2, 0, 0, 0, 2, 1, 2, 1, 2, 2, 0, 1, 1, 0, 1, 0, 1, 1, 2, 2, 2,\n","       1, 2, 1, 0, 0, 2, 0, 0, 0, 1, 0, 2, 1, 0, 2, 1, 1, 1, 1, 1, 0, 1,\n","       2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 0, 1, 2,\n","       1, 2, 0, 1, 2, 1, 2, 1, 2, 1, 0, 0, 0, 2, 1, 1, 1, 2, 2, 1, 2, 1,\n","       2, 1, 0, 2, 2, 0, 1, 0, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 1, 0, 1, 1,\n","       2, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1,\n","       1, 2, 0, 1, 1, 0, 1, 1, 0, 2, 0, 2, 1, 0, 1, 1, 1, 2, 1, 0, 1, 1,\n","       0, 1, 1, 1, 1, 1, 2, 1, 2, 0, 0, 1, 2, 0, 2, 2, 0, 0, 2, 1, 2, 1,\n","       0, 1, 1, 2, 0, 0, 1, 1])"]},"metadata":{"tags":[]},"execution_count":18}]},{"cell_type":"code","metadata":{"id":"HOR8u0NS3Uar","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":571},"executionInfo":{"status":"ok","timestamp":1593135808687,"user_tz":240,"elapsed":507,"user":{"displayName":"Leila Abdelrahman","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiiOBijfsdVdWn4yrdWM-_fgxn37DQ4bPiUdT7W=s64","userId":"10595688673230464384"}},"outputId":"90d6dbc1-f10d-437a-8d40-9b263f1144fc"},"source":["from sklearn import metrics \n","import pandas as pd\n","import seaborn as sn\n","cm=metrics.confusion_matrix(y_true_final,y_pred_test_boost)\n","import matplotlib.pyplot as plt\n","\n","classes=['Pos' , 'Neu' , 'Neg']\n","con_mat = tf.math.confusion_matrix(labels=y_true_final, predictions=y_pred_test_boost).numpy()\n","con_mat_norm = np.around(con_mat.astype('float') / con_mat.sum(axis=1)[:, np.newaxis], decimals=2)\n","con_mat_df = pd.DataFrame(con_mat_norm,\n","                  index = classes, \n","                  columns = classes)\n","\n","figure = plt.figure(figsize=(11, 9))\n","plt.title(\"FC Voting Confusion Matrix with Scene & Audio\")\n","sn.heatmap(con_mat_df, annot=True,cmap=plt.cm.Blues)\n","\n","\n","accuracy = (y_pred_final == y_true_final).mean()\n","print(f\"Accuracy: {accuracy}\")"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Accuracy: 0.6164021164021164\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAlgAAAIYCAYAAACxPpKwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deZxVdf3H8ddnBgTclWVQwB3Ffd9NzDQ1S/PnkqlpWZH+ck1zydyXzDKX1IrcyzK13NJcMvd+KGgqgqKIpiC7CyqIMHx/f5zLcGeY5YB3OHDn9fRxH84553vP/Z65Z7ifeX+/50yklJAkSVLl1BTdAUmSpGpjgSVJklRhFliSJEkVZoElSZJUYRZYkiRJFWaBJUmSVGEWWFpsRcRPIuLaovuxoCKiLiKeiIiPIuLSz7GfJfL4m4qIERGxSzvu/7cRcWYr28+JiD+21+t3RBHx7Yh4qmz544hYq8g+SYsbCywREW9FxIzSP5JzH6uWti1V+oB6PSI+KbW9PiLWaGY/D0TEec2s3zciJkREp1b6sEtEjC1fl1K6KKX0vc9/hM2+XkTEcRHxcum4xkbE7RGxcQV2PwiYAiyfUjppYXfSXsdf+nBMEXFZk/X7ltbfmHM/N0bEBW21SyltmFJ6bOF627aU0lEppfNLfZrvPFpQpe/DCxExLSKmRMS/ImLNyvS2MiLisNLP4rSIeCYi+uZ83tz3/huV7E9KadmU0phK7lNa0llgaa6vlf6RnPt4t7T+DmAf4BBgBWBT4DngS83s4ybgsIiIJuu/BdySUprdTn1fGFcAxwPHASsD6wJ3AXtXYN+rAyPT4n0X3zeAg5oUvUcAr1XqBVorqBdXEbEOcDNwEtn5viZwNVBfZL/KRcSywA1khfyKwDHApzmffgTwHnB4+/ROUoOUko8O/gDeAnZrZv1uwAygX879dAM+BHYuW7cS2T/+mwJdgMuBd0uPy0vrlim9zhzg49JjVeAc4I+l/awBJLIPiLfJEqIzmrz2TcD7wCvAKcDYFvrZn+wDc5tWjmUFsg/aycB/gZ8CNaVt3waeAn5Zer03gb1K224EZgGflY5jt9K6C8r2vUt534BTgXHAR8Ao4Eul9Q3HX1reBxgBfAA8Bqzf5D08GXip9B78BejawrHN7f8DwN6ldSsDE4BfADeWtb29tP5D4Algw9L6QU2O896yfpxa6sdMoBNl5xdwP3Bp2f5vBa5vpo9dS+dEj9LyGcBsslQQ4Hzg8rLv+QW0fh7dVno/Pyp9D7dq4XtzAPBCK+dFLfATsgL1I7JfNvqVtg0AHiYrYEYBB5U970ayQu2+0vOeAdYu297ic5vpw9zj7L+AP+erl743+5e+l72bnhNN2idgndLX3YF7gGnAs6Xv/1MttG3xZ8eHj470MMFSa3YDnk0pvZOncUppBtkHWflvxwcBr6aUXiT7kNwO2Iys4NoG+GlK6RNgL+DdNH+C1tROwHpkCdpZEbF+af3ZZEXYWsDuwGGtdPVLZAXOs620+TXZB8VawMDSMX2nbPu2ZB+EPYBLgOsiIlJK3wZuAS4pHcc/W3kNImI9sgRi65TScsAeZAVJ03brAn8GTgB6khUq90bEUmXNDgL2JEtdNiH70GzNzcx7rw4G7iYrisr9g6wg7QU8Xzo2UkqDmxzn18qe802yJHDFNH9qeSTwrYjYNSIOJTsHjm/asZTSp8BQsu89pf//F9ixbPnxJs9p7Tzah6yYW5GsULiqhe/J88CAiLgsIr5YSovK/ah0fF8Bli8dz/SIWIasQPpT6Xt1MHBNRGxQ9tyDgXPJfukYDVwIkPO55T4DXgBui4iVW2jTnMOBYSmlv5L9EnLoAjz3arJflFYhO+YjW2nb1s+O1CFYYGmuuyLig9LjrtK67sD4BdzPTcABEdG1tHx4aR1k/6Cfl1KalFKaTPZh860F3P+5KaUZpYLtRbJCDbLi4qKU0vsppbHAla3so9Xjiohasg+501NKH6WU3gIubdLX/6aUfp9Sqi8d3ypA3QIeC2RJWhdgg4jonFJ6K6X0RjPtvgHcl1J6OKU0iyw96wbsUNbmypTSuyml94B7yQrZ1twJ7BIRK5C9Tzc3bZBSur70PZhJlgRtWmrfmitTSu+UCu6m+5sAHE32PbsCODyl9FEL+3kcGFgaatyE7D0dWDq3tiZL1PJ6KqV0f+n9+gPzzpum/RtDljD2IftlYUpprtncQut7ZL8UjEqZF1NKU4GvAm+llG5IKc1OKf0H+CtwYNnu70wpPVsqOm9h3vuT57nlfk127v8ZeHhukRURF7RxUcXhZEUcpf/nGiYs/TzsD5yVUvokpfQy836mm2vb1s+O1CFYYGmur6eUViw9vl5aN5WscMgtpfQU2fDd1yNibbKEYu4/6quSpRBz/be0bkFMKPt6OjD3g29VoDxpay11a+u4egCdmb+vfZrrR0ppeunLpmlHm1JKo8lSqXOASRFx69wLDJpo9L1LKc0hO8Zm+0Tj701Lrz2DbMjqp0D3lNLT5dsjojYiLo6INyJiGvOStR5tHFZbiee9ZENto0rnS0seJyt2tgCGk6U8A8lS0NGlwiavpt+bri3NEUspDUkpHZRS6gl8AdiZLH0F6Ec2PNjU6sC2Zb+kfED2C0XvVvqw7AI8F2hIu75L9ovGJWTfk3+WiqwdgX81d0wRsSNZsnlradWfgI0joq0iHLLEtBON39f/ttA2z8+O1CFYYKk1/wS2yXuFUpm5Q0+HAQ+mlCaW1r9L9mEy12qldZDN4fg8xgPl/ezXSttHgL4RsVUL26eQzS9q2tdxC9m3T4Cly5YbfXCmlP6UUtqp9HoJ+Hkz+2j0vStdSNDvc/RprrkTupu7jcEhwL5kQ8UrkA3BAsy9iKGl96yt9/JCsiGqVSLim620+zfZcPB+wOMppZFk78NXaDI8uACvvUBSSkOBvwEblVa9A6zdTNN3Sn1cseyxbErp6BwvsyDPrSErTjuX+nca2VDqELJ5dP9o4TWOIHvfXoiICWRzwOauhybnaESUn6OTyeZslf9MrdbC61T6Z0daYllgqUWl+UMPA3dGxJYR0SkilouIoyKitTkYN5N9KH+fxkMJfwZ+GhE9I6IHcBbzPtgnAt1zDD+15Dbg9IhYKSL6kM1raum4XgeuAf5cuqx/qYjoGhEHR8RppWGk24ALS8e7Otncm4W9l9ILwFciYuXSB9cJczdExHql+UhdyOa4zJ2k3dzx7R0RX4qIzmRF0UyyIuTzeJxsztqvm9m2XOk1ppJ9+F7UZPtEsnk2uUXEzmTzcQ4n+3D/den9mk8pGXwO+CHzCqp/A0fRcoH1uc6jiNgpIr4fEb1KywPI5m8NKTW5Fjg/IvpHZpOI6A78HVg3Ir4VEZ1Lj63L5gi2JvdzS8OpD5DN0aorzcH7F9n7MI0saWp6TF3JhtAHkQ1Lzn0cCxxSSvJeBDaMiM1K7c8pe816siLznIhYujQ37Aia0Q4/O9ISywJLbTmAbEL1X8iuJHsZ2Ios3WpWad7Fv8mudrqnbNMFwDCyK8yGk00ovqD0nFfJCrAxpWGSBR06PA8YS3ZF3z/Jbi/RdMJ2uePIJjpfTXZV3htkScm9pe3Hkv1WP4bsirs/AdcvYJ/m+gPZB9hbwENk38u5ugAXk/3mP4FskvPpTXeQUhpFlgj+utT2a2S31vhsIfs0d78ppfRIad5WUzeTDe+MA0Yyr8iY6zqyuWPl8/ZaFBHLl/Z5TEppXErpydI+bmjm1h5zPU6W1jxbtrwcLcy/qsB59AFZQTU8Ij4mK2buJLuQAeBXZAXEQ2QFzXVAt1Lh82Wy+Ufvkr2XPyd7f1u1EM89jKyQfJHsXPgO2fBgDc2fo18nK9xvTilNmPsote0E7JlSeo3sZ+ifwOtk53y5Y8iGNCeQXRF5QyuHVMmfHWmJFSktzrfqkRZORBwNHJxSGthmY0mSKswES1UhIlaJiB0joqZ064OTyJIHSZIWuSXuTstSC5YCfkd2pdQHZFdLXVNojyRJHZZDhJIkSRXmEKEkSVKFWWBJkiRVWLvPwdr6wsccg9Ri4bKDmv3rKFIh6pbv2nYjaRHpX9etpVultLtumx/TrnXCjP9cVcixmWBJkiRVmFcRSpKk4kR1Zj3VeVSSJEkFMsGSJEnFafEvZS3ZTLAkSZIqzARLkiQVxzlYkiRJysMES5IkFcc5WJIkScrDBEuSJBXHOViSJEnKwwRLkiQVp0rnYFlgSZKk4jhEKEmSpDxMsCRJUnGqdIjQBEuSJKnCTLAkSVJxnIMlSZKkPEywJElScZyDJUmSVH0iYs+IGBURoyPitGa2XxYRL5Qer0XEB23t0wRLkiQVp+A5WBFRC1wN7A6MBYZGxD0ppZFz26SUTixrfyyweVv7NcGSJEkd2TbA6JTSmJTSZ8CtwL6ttP8m8Oe2dmqBJUmSihPRro+IGBQRw8oeg5r0oA/wTtny2NK6ZroaqwNrAv9q67AcIpQkSVUrpTQYGFyh3R0M3JFSqm+roQWWJEkqTvH3wRoH9Ctb7lta15yDgR/m2WnhRyVJklSgoUD/iFgzIpYiK6LuadooIgYAKwH/l2enJliSJKk4BSdYKaXZEXEM8CBQC1yfUhoREecBw1JKc4utg4FbU0opz34tsCRJUoeWUrofuL/JurOaLJ+zIPu0wJIkScWp8U7ukiRJysEES5IkFaf4qwjbRXUelSRJUoFMsCRJUnGiOudgWWBJkqTiOEQoSZKkPEywJElScap0iNAES5IkqcJMsCRJUnGcgyVJkqQ8TLAkSVJxnIMlSZKkPEywJElScZyDJUmSpDxMsCRJUnGcgyVJkqQ8TLAkSVJxnIMlSZKkPEywJElScZyDJUmSpDxMsCRJUnGcgyVJkqQ8TLAkSVJxTLAkSZKUhwmWJEkqTpVeRWiBJUmSiuMQoSRJkvIwwZIkScWp0iFCEyxJkqQKM8GSJEnFcQ6WJEmS8jDBkiRJxXEOliRJkvIwwZIkSYUJEyxJkiTlYYIlSZIKY4IlSZKkXEywJElScaozwDLBkiRJqjQTLEmSVBjnYEmSJCkXEyxJklQYEyxJkiTlYoIlSZIKY4IlSZKkXEywJElSYUywJEmSlIsJ1mJg+7VW5qQvr0NNBHe/MJ6b/u/tRtu/uklvjtt1LSZ//BkAtw0bx90vjKf38l34xYEbURNBp5rgL8PG8bfn3y3iEFQlhj/3f/x58GWkOXP4wpf34SsHHt5o+4N3/oknH7qH2tpall1+Jb5zwhn06LUKr770HLf+/vKGduPH/pcfnHI+W2w/cFEfgqrUc888zeArL2HOnDl8ee/9OPCwIxttv/Mvf+Chv99JbW0ty6+4Eiecdg69eq9aUG+1QKozwLLAKlpNwCl79ueYP73IxGkzuenILXni9Sm8OWV6o3YPvzKZXzz4eqN1Uz7+jCNvfJ5Z9YlunWu5ddDWPPHaFKaUCjFpQcypr+eW3/ySky64kpW69+L8E7/DZtt+gVVXW7Ohzeprr8cul91Il65defT+v3LHDVdx1KkXMmCTLTnn138A4OOPPuT07x/IhptvW9ShqMrU19fzm8t+xgW/+i3de9Zx4qBD2Xangay2xtoNbdbuP4DLfn8LXbt24/67buOG31zOqedeUmCvlZdDhGoXG666PO+8N4NxH3zK7DmJh0dOYuC6PXI9d/acxKz6BMBSnYKa6jxHtYiMeW0kvVbpS8/efejUuTPb7Lw7/xnyRKM2AzbZki5duwKw1nob8f6USfPt57mnH2XjLbdraCd9Xq+98jKr9OlH71X70rlzZ3b+0h4MeeqxRm022WJrunbtBsB6G2zClMkTC+ipNE+uBCsilgFmpJTmRMS6wADgHymlWe3auw6g53JdmPjRzIblidNmslGf5edrt+uAHmzebwXefm8Glz08uuE5dct14bJvbEy/lbtx5SNvmF5poX0wdTIr9+zVsLxSj168OWpEi+2feuheNtpy+/nWP/vEw3z5699slz6qY5o6ZRI9e/VuWO7Rs45RI4e32P6h++5ky213WhRdUwV09ATrCaBrRPQBHgK+BdzYUuOIGBQRwyJi2OSh937+XnZwT74+hX2uGsIh1w7jmTff4+x9BjRsm/jRTA65dhj7XfMMe2/Sm5WX6VxgT9VR/N+j/+Ct0a+w5/6HNVr/wXtTGPvWG2y4xXYF9Uwd3aMP3cfoUSPZ/5tHFN0VdXB5C6xIKU0H/ge4JqV0ILBhS41TSoNTSlullLbqufXXKtHPqjX5o5nULdelYblu+S5MLku0AD6cMbthKPDuF8azfu/l5tvPlI8/443Jn7BZvxXbt8OqWit278l7k+cN+b0/ZRIrdu85X7uRLzzLfX+5kWPP/AWdOy/VaNvQJx9hi+0H0qmT0ztVOd179GLypAkNy1MmT6R7Wdo61wvDhvCXm6/lzJ9dQeellppvuxZPEdGuj6LkLrAiYnvgUOC+0rra9ulSxzLy3Y9YbeVurLpCVzrVBLtv0IsnXpvSqE33Zef9Q7Hzuj14c2o2Ab7Xcl3o0il7C5fr2olN+67Af6c2nhwv5bXmuusz8d13mDzhXWbPmsWzTzzMZtt+oVGb/74xipuv+jnHnvkLll9x5fn28ewTD7HtwC8vqi6rg1h3wIa8O/ZtJrw7jlmzZvHEIw+y7Y6Nr1B947VXueqXF3Dmzy5nxZXmPzelRS3vr5knAKcDd6aURkTEWsCj7detjqM+JS558HWu/OYm1NYE97w4njFTpvODndfglfEf8cTrUzl4qz7svG4PZs9JTJsxi3PvfRWANXoszQlfWptEdpXrLc+8wxuTPyn0eLTkqq3txKFHncxlZx3PnDlz2Gn3r9Jn9bW464+DWaP/ADbbdmduv/7XzPx0Or+5+AwAVu5Zx3Fn/RKAKRPf5b3Jk1h3o82LPAxVodpOnTjqhNM46+SjmTNnDrt/ZV9WX3Md/njdNfRfbwO23WkXrv/NZXw6YzoXn/1jAHr2WoWzLr6i4J4rj2qdgxUppfyNI5YFSCl9nPc5W1/4WP4XkNrRZQdtWnQXpAZ1y3uVpRYf/eu6FVbldD/8z+1aJ0y9+ZuFHFuuIcKI2Dgi/gOMAEZGxHMR0eIcLEmSpFyinR8FyTsH63fAj1JKq6eUVgNOAn7fft2SJElacuWdg7VMSqlhzlVK6bHSvbEkSZIWWrXOwcpbYI2JiDOBP5SWDwPGtE+XJEmSlmx5C6wjgXOBvwEJeLK0TpIkaaF1yAQrIroCRwHrAMOBk/zzOJIkSa1rK8G6CZhFlljtBaxPdk8sSZKkz61DJljABimljQEi4jrg2fbvkiRJ0pKtrQKrYTgwpTS7WqtMSZJUkCotLdoqsDaNiGmlrwPoVloOIKWUlm/X3kmSJC2BWi2wUkr+QWdJktRuqnV0LO+d3CVJkpRT3vtgSZIkVZwJliRJUoVFRLs+cvZhz4gYFRGjI+K0FtocFBEjI2JERPyprX2aYEmSpA4rImqBq4HdgbHA0Ii4J6U0sqxNf+B0YMeU0vsR0aut/VpgSZKkwiwGQ4TbAKNTSmMAIuJWYF9gZFmb7wNXp5TeB0gpTWprpw4RSpKkqhURgyJiWNljUJMmfYB3ypbHltaVWxdYNyKejoghEbFnW69rgiVJkorTzgFWSmkwMPhz7qYT0B/YBegLPBERG6eUPmjpCSZYkiSpIxsH9Ctb7ltaV24scE9KaVZK6U3gNbKCq0UWWJIkqTCLwVWEQ4H+EbFmRCwFHAzc06TNXWTpFRHRg2zIcExrO7XAkiRJHVZKaTZwDPAg8ApwW0ppREScFxH7lJo9CEyNiJHAo8CPU0pTW9uvc7AkSVJhFoOrCEkp3Q/c32TdWWVfJ+BHpUcuJliSJEkVZoIlSZIKszgkWO3BBEuSJKnCTLAkSVJxqjPAMsGSJEmqNBMsSZJUGOdgSZIkKRcTLEmSVBgTLEmSJOVigiVJkgpjgiVJkqRcTLAkSVJhqjXBssCSJEnFqc76yiFCSZKkSjPBkiRJhanWIUITLEmSpAozwZIkSYUxwZIkSVIuJliSJKkwVRpgmWBJkiRVmgmWJEkqjHOwJEmSlIsJliRJKkyVBlgmWJIkSZVmgiVJkgrjHCxJkiTlYoIlSZIKU6UBlgmWJElSpZlgSZKkwtTUVGeEZYIlSZJUYSZYkiSpMM7BkiRJUi4mWJIkqTDVeh8sCyxJklSYKq2vHCKUJEmqNBMsSZJUmGodIjTBkiRJqjATLEmSVBgTLEmSJOVigiVJkgpTpQGWCZYkSVKlmWBJkqTCOAdLkiRJuZhgSZKkwlRpgGWCJUmSVGkmWJIkqTDOwZIkSVIuJliSJKkwVRpgmWBJkiRVmgmWJEkqjHOwJEmSlIsJliRJKkyVBlgmWJIkSZVmgiVJkgpTrXOw2r3AuvfYHdv7JaRc1hx4YtFdkBq8P/SqorsgqR2ZYEmSpMJUaYBlgSVJkopTrUOETnKXJEmqMBMsSZJUmCoNsEywJEmSKs0ES5IkFcY5WJIkScrFBEuSJBWmSgMsEyxJkqRKM8GSJEmFcQ6WJEmScjHBkiRJhTHBkiRJUi4mWJIkqTBVGmCZYEmSJFWaBZYkSSpMRLTrI2cf9oyIURExOiJOa2b7tyNickS8UHp8r619OkQoSZI6rIioBa4GdgfGAkMj4p6U0sgmTf+SUjom734tsCRJUmEWgzlY2wCjU0pjACLiVmBfoGmBtUAcIpQkSVUrIgZFxLCyx6AmTfoA75Qtjy2ta2r/iHgpIu6IiH5tva4JliRJKkx73wcrpTQYGPw5d3Mv8OeU0syI+AFwE7Bra08wwZIkSR3ZOKA8kepbWtcgpTQ1pTSztHgtsGVbO7XAkiRJhYlo30cOQ4H+EbFmRCwFHAzc07iPsUrZ4j7AK23t1CFCSZJUmJqCZ7mnlGZHxDHAg0AtcH1KaUREnAcMSyndAxwXEfsAs4H3gG+3tV8LLEmS1KGllO4H7m+y7qyyr08HTl+QfVpgSZKkwiwGt2loF87BkiRJqjATLEmSVJj2vk1DUUywJEmSKswES5IkFaamOgMsEyxJkqRKM8GSJEmFcQ6WJEmScjHBkiRJhanSAMsES5IkqdJMsCRJUmGC6oywTLAkSZIqzARLkiQVxvtgSZIkKRcTLEmSVBjvgyVJkqRcTLAkSVJhqjTAMsGSJEmqNBMsSZJUmJoqjbAssCRJUmGqtL5yiFCSJKnSTLAkSVJhvE2DJEmScjHBkiRJhanSAMsES5IkqdJMsCRJUmGq9TYNJliSJEkVZoIlSZIKU535lQmWJElSxZlgSZKkwngfLEmSJOVigiVJkgpTU50BlgmWJElSpZlgSZKkwjgHS5IkSbmYYEmSpMJUaYBlgiVJklRpJliSJKkwzsGSJElSLiZYkiSpMNV6HywLLEmSVBiHCCVJkpSLCZYkSSpMdeZXJliSJEkVZ4IlSZIKU+McLEmSJOVhgiVJkgpTpQGWCZYkSVKlmWBJkqTCeB8sSZIk5WKCJUmSClOlAZYJliRJUqWZYEmSpMJ4Hyy1m2f+/RSH7f9VDtlvL2658dr5tr/4/DC+d9iB7Lrdpjz2yEONtk2cMJ6Tjvk+3zrwaxx+0D6Mf3fcouq2qtDuO6zPi3eeyct3n83J39l9vu2XnPQ/DLn1NIbcehov3XUW45+4BIDVVlmJf//pVIbcehrP3XEG3ztgp0XddVWhp598gn323oOv7rk71/1+8Hzbnxs2lG8csB9bbLIBDz/4QKNtRw/6LjtttxXH/O8PFlV3pUZMsApWX1/P5ZdcwKVX/Z6edb35wRHfYMedv8gaa63d0KZX71U4/ewLuPWPN873/IvOPp3DjhzE1tvuwPTp06mpqc7fBNT+amqCy087iL2PvopxEz/gqVt+zN8fH86rYyY0tDnl0r81fH30wQPZdL2+AIyfPI1djriUz2bNZpluS/HcHWdw3+PDGT/5w0V+HKoO9fX1XHThefzu9zdQV1fHId84gF2+uCtrr7NOQ5veq6zC+Rf+jJtuvH6+53/7yO8xY8YM7rj9L4uy21oIVRpgmWAV7ZURw+nTbzVW7duPzp07s+vue/HU4/9q1GaVVfuwdv/1qInGb9dbY96gvr6erbfdAYCll16arl27LbK+q7psvdEavPHOFN4aN5VZs+u5/cHn+eoum7TY/qA9t+S2B54DYNbsej6bNRuALkt1rtrIX4vOy8Nfol+/1enbrx+dl1qKPb+yN489+kijNn369GXd9QbM928jwLbbbc8yyyyzqLorzSdXghURqzW3PqX0dmW70/FMmTyJXnW9G5Z71tXxysvDcz33nbffYtnlluOnPz6e8e+OY6tttmPQMSdSW1vbXt1VFVu11wqMnfh+w/K4ie+zzUZrNNt2tVVWYvVVu/PY0FEN6/rWrcjfrjyatfv15CeX32V6pc9l0sSJ9F5l3r+NverqGP7SSwX2SO2lo98H6z7g76X/PwKMAf7RUuOIGBQRwyJi2B9umH9OkSqjvr6el/7zPP97/Mn87qZbeXfcWB74+11Fd0sdwIF7bMldj7zAnDmpYd3YiR+wzTd+xkb7nsthX9uGXisvV2APJalYuQqslNLGKaVNSv/vD2wD/F8r7QenlLZKKW31re98r1J9rUo9evZi0sR5c1wmT5xIj569cj23Z6861ll3AKv27UenTp3YaZddee3VV9qrq6py7076kL51KzUs96lbiXEtpFAH7LEltz0wrNlt4yd/yIjR49lxi7Wb3S7l0auujgnj5/3bOGniROrq6grskdpLTTs/irJQr51Seh7YtsJ96ZAGbLARY99+m/HjxjJr1iz+9fA/2HHnL+Z+7scfT+OD998D4Pmhz7LGmn6oaeEMG/Ff1lmtJ6uv2p3OnWo5cI8tuO+x+Ydk1l2jjpWWX5ohL77ZsK5PrxXp2qUzACsu140dNl+b196atMj6ruqz4UYb8/bbbzF27DvM+uwzHrj/PgZ+cdeiuyXllncO1o/KFmuALYB326VHHUynTp044ZSfcPJxP2BOfT1f2Wc/1lx7Ha777VUMWH9Ddhz4RV4ZMZwzTzmBj6ZN499PPcYNv7uam267m9raWhP1ls8AABUpSURBVI4+/mRO/N/vkhKsN2ADvrrfAUUfkpZQ9fVzOPHnt3HvNT+ktia46e4hvDJmAmcevTfPj3yb+x7P5gYeuMeW3P7gc42eu96avbn4R/uRSATB5Tc/wojR/hOhhdepUydOP+Msjh70PebMqefr++3POuv05+pfX8GGG27ELrt+iZeHv8SJxx/DtGnTePyxR7nm6l9z5z33AfDtbx3CW2+OYfr06ey+686cc96F7LjTFwo+KjWnWudgRUqp7UYRZ5ctzgbeAv6aUvq0redOmDar7ReQFoE1B55YdBekBu8PvaroLkgNunaisCrnuLtebdc64cqvDyjk2HIlWCmlcwEiYumU0vT27ZIkSeooqvX2jbnmYEXE9hExEni1tLxpRFzTrj2TJElVryba91HYceVsdzmwBzAVIKX0IrBze3VKkiRpSZb7T+WklN5pMhGtvvLdkSRJHUm1TnLPW2C9ExE7ACkiOgPHA95wSZIkqRl5C6yjgCuAPsA44CHgh+3VKUmS1DFU6yT3vFcRTgEObee+SJIkVYVWC6yIOKuVzSmldH6F+yNJkjqQKp2C1eZVhJ808wD4LnBqO/ZLkiRpkYiIPSNiVESMjojTWmm3f0SkiNiqrX22mmCllC4t2+lyZJPbvwPcClza0vMkSZLyqCk4woqIWuBqYHdgLDA0Iu5JKY1s0m5uHfRMnv22eR+siFg5Ii4AXiIryLZIKZ2aUvIvuUqSpCXdNsDolNKYlNJnZCHSvs20Ox/4OdDmnwmENgqsiPgFMBT4CNg4pXROSun9Beq2JElSC2ra+RERgyJiWNljUJMu9AHeKVseW1rXICK2APqllO7Le1xtXUV4EjAT+ClwRtnNwIJskvvyeV9IkiRpUUspDQYGL+zzI6IG+BXw7QV5XltzsPL+KR1JkqQFthhcRTgO6Fe23Le0bq7lgI2Ax0pBU2/gnojYJ6U0rKWdWkBJkqSObCjQPyLWjIilgIOBe+ZuTCl9mFLqkVJaI6W0BjAEaLW4ggX4W4SSJEmVVvRVhCml2RFxDPAgUAtcn1IaERHnAcNSSve0vofmWWBJkqQOLaV0P3B/k3XN3mw9pbRLnn1aYEmSpMIsBnOw2oVzsCRJkirMBEuSJBWmxgRLkiRJeZhgSZKkwhR9FWF7scCSJEmFqdL6yiFCSZKkSjPBkiRJhXGSuyRJknIxwZIkSYUJqjPCMsGSJEmqMBMsSZJUGOdgSZIkKRcTLEmSVBgTLEmSJOVigiVJkgoTVXordxMsSZKkCjPBkiRJhXEOliRJknIxwZIkSYWp0ilYJliSJEmVZoIlSZIKU1OlEZYJliRJUoWZYEmSpMJ4FaEkSZJyMcGSJEmFqdIpWBZYkiSpODVUZ4XlEKEkSVKFmWBJkqTCVOsQoQmWJElShZlgSZKkwnibBkmSJOVigiVJkgrjn8qRJElSLiZYkiSpMFUaYJlgSZIkVZoJliRJKoxzsCRJkpSLCZYkSSpMlQZYJliSJEmVZoIlSZIKU61JT7UelyRJUmFMsCRJUmGiSidhmWBJkiRVmAmWJEkqTHXmVyZYkiRJFWeCJUmSClOtd3K3wJIkSYWpzvLKIUJJkqSKM8GSJEmFqdIRQhMsSZKkSjPBkiRJhfFGo5IkScrFBEuSJBWmWpOeaj0uSZKkwphgSZKkwjgHS5IkSbmYYEmSpMJUZ35lgiVJklRx7Z5gffDJrPZ+CSmXf9/1s6K7IDXY+tyHi+6C1GD4+bsX9trOwZIkSVIuzsGSJEmFqdakp1qPS5IkqTAmWJIkqTDOwZIkSVIuJliSJKkw1ZlfmWBJkiRVnAmWJEkqTJVOwbLAkiRJxamp0kFChwglSZIqzAJLkiQVJqJ9H/n6EHtGxKiIGB0RpzWz/aiIGB4RL0TEUxGxQVv7tMCSJEkdVkTUAlcDewEbAN9spoD6U0pp45TSZsAlwK/a2q9zsCRJUmGi+DlY2wCjU0pjACLiVmBfYOTcBimlaWXtlwFSWzu1wJIkSVUrIgYBg8pWDU4pDS5b7gO8U7Y8Fti2mf38EPgRsBSwa1uva4ElSZIK0963aSgVU4PbbNj2fq4Gro6IQ4CfAke01t45WJIkqSMbB/QrW+5bWteSW4Gvt7VTCyxJklSYGqJdHzkMBfpHxJoRsRRwMHBPeYOI6F+2uDfwels7dYhQkiR1WCml2RFxDPAgUAtcn1IaERHnAcNSSvcAx0TEbsAs4H3aGB4ECyxJklSgxeFP5aSU7gfub7LurLKvj1/QfTpEKEmSVGEmWJIkqTCLQ4LVHkywJEmSKswES5IkFWYxuJN7uzDBkiRJqjATLEmSVJia6gywTLAkSZIqzQRLkiQVxjlYkiRJysUES5IkFcb7YEmSJCkXEyxJklSYap2DZYElSZIK420aJEmSlIsJliRJKky1DhGaYEmSJFWYCZYkSSqMt2mQJElSLiZYkiSpMFUaYJlgSZIkVZoJliRJKkxNlU7CMsGSJEmqMBMsSZJUmOrMr0ywJEmSKs4ES5IkFadKIywTLEmSpAozwZIkSYXxbxFKkiQpFxMsSZJUmCq9DZYJliRJUqWZYEmSpMJUaYBlgiVJklRpJliSJKk4VRphWWBJkqTCeJsGSZIk5WKCJUmSCuNtGiRJkpSLCZYkSSpMlQZYJliSJEmVZoIlSZKKU6URlgmWJElShZlgSZKkwngfLEmSJOVigiVJkgrjfbAkSZKUiwmWJEkqTJUGWCZYkiRJlWaCJUmSilOlEZYJliRJUoWZYEmSpMJ4HyxJkiTlYoIlSZIK432wJEmSlIsJliRJKkyVBlgWWJIkqUBVWmE5RChJklRhJliSJKkw3qZBkiRJuZhgLQaef+Zpfn/VL5hTP4fd9/46Bxx6ZKPtd9/2Bx66705qazuxwoorcewpZ9Or96oAnPPjH/LayJdYf+PNOfPiK4vovqrIC0P/zU2/+SVz5sxh1z2/zr4Hf7vR9vvu+CP/euBuamtrWW6FlTjqpLPoWbdKw/bpn3zMyd8/iK12GMiRx5y6iHuvarPjOt05de/1qI3gb8+N47on32q0fd/NV+FHe6zLpGkzAfjzM+/wt+fGAfDCubvx+sSPARj/4accd8sLi7Tvyq9ab9NggVWw+vp6fnfFxZz7y9/QvWcdJx91KNvsOJDV1li7oc2a/Qfwq9/dQpeu3fjH3bdx4++u4JSzfw7AfgcfzsyZn/LgPX8t6hBUJebU13P9VT/njIuvpnuPOn5y7OFsuf3O9F19rYY2a6wzgIuuOoAuXbvy0L13cMu1V3LCGT9r2H7bTb9lwMabF9F9VZmagDO+NoBBNz7PhGmfcutR2/Loq5MZM/mTRu0eHD6Bi+4bNd/zZ86q58Brhiyq7krzcYiwYK+/+jK9+/Sj96p96dy5M1/YdQ+effqxRm022XxrunTtBsB6G2zC1MkTG7ZtuuW2dOu2zKLssqrU6FEj6L1qP+pW6Uunzp3ZYeCXGfbvxxu12XCzrejStSsA/dffiPfKzsUxr73Ch+9PZZMtt1uk/VZ12rjvCrw9dTpj35/B7PrEP4ZP4Ivr9yy6W2oH0c6PouQqsCJi5WYendu7cx3B1MmT6NGzrmG5e886pk6e3GL7h++7iy232XFRdE0dzHtTJtG97FxcuWcv3ps6qcX2jz5wN5ttvQMAc+bM4Q+DL+OwQSe0ez/VMfRavgsTPpzZsDzxw5nULddlvna7bVjHX3+4HZcevAl1y8/bvlSnGm49alv+OGhrdrUwUwHyJljPA5OB14DXS1+/FRHPR8SWTRtHxKCIGBYRw2774/WV620H99hD9zF61Ej2O/iIoruiDu7Jf97PmNde4WsHHg7AQ/fezubb7NioQJPa22OvTmGPS59k/6uHMGT0VC7cf6OGbXtc+hQH//YZTrv9ZU7Zaz36rtStwJ6qVVUaYeWdg/UwcEdK6UGAiPgysD9wA3ANsG1545TSYGAwwKvjp6eK9bYKde/ZiyllwyxTJ0+ke8/5f9t6YdgQbv/jdVx4xbV0XmqpRdlFdRAr9+jVaPj5vcmTWLl7r/naDX/+Ge788/Wc/cvBDefi6yOH8+rL/+Ghe+9g5ozpzJ49m67dluaQ7x67yPqv6jJp2kx6rzAvkapboQsTP5rZqM2HM2Y1fP3X58Zx4h795z2/1Hbs+zMY9ub7rL/qcox9f0Y791qaJ2+Ctd3c4gogpfQQsH1KaQgwf2ar3PqvtyHjx77NxPHjmDVrFk/+60G22WGXRm3GvP4qv/nVhZxx0WWsuNLKxXRUVW/t9TZgwrh3mDR+HLNnzeLfjz/Eltvv3KjNm6Nf5fdXXMSPz/sVK5Sdi8eefgFX33IfV/3hXg4ddAJf2O0rFlf6XF4eN43Vuy9NnxW70qk22Gvj3jz2auPpEz2WnffL5i4DejZMgF++ayc612bRxYpLd2az1VfkjUmNJ8dr8RHt/F9R8iZY4yPiVODW0vI3gIkRUQvMaZeedRC1nTox6PhTOefH/8ucOXP40l77stqaa3PL9dewznobsO2Ou3DDby5jxozpXHL2KQD0qOvNTy+6AoDTjz2SsW+/yaczZnDkAXtwzClns8U2OxR5SFpC1dZ24jvH/JiLfnIsc+bU88U99qHfGmtz202/Za1112er7Qdyy++vZOaMGVx+/mkA9OhVx4/Pu6zgnqsa1c9JXPT3Ufz2iC2orQnufP5d3pj0CT/cdW1GvDuNx16dzKHbr8YuA3pSPyfx4fRZnPm3EQCs2XMZzt53feak7GrE6554c76rD6X2Fim1PYIXET2As4GdgAQ8DZwHfAisllIa3dJzHSLU4mLGZ/VFd0FqcPi13kJAi4/h5+9eWNQzakL71gnr9V66kGPLlWCllKYAx0bEMimlpr8GtFhcSZIkdUR5b9OwQ0SMBF4pLW8aEde0a88kSVLVq9KLCHNPcr8M2AOYCpBSehHYudVnSJIkLQEiYs+IGBURoyPitGa2/ygiRkbESxHxSESs3tY+c9/JPaX0TpNVTmiRJEmfT8ERVumCvauBvYANgG9GxAZNmv0H2CqltAlwB3BJW/vNW2C9ExE7ACkiOkfEyZSGCyVJkpZg2wCjU0pjUkqfkd0xYd/yBimlR1NK00uLQ4C+be00b4F1FPBDoA8wDtistCxJkrTQFoP7YPUBykfpxpbWteS7wD/a2umCXEV4aJ62kiRJi4uIGAQMKls1uPQXZxZmX4cBWwED22rbaoEVEWe1sjmllM5fwL5JkiQ1iHa+1K/8z/e1YBzQr2y5b2ldIxGxG3AGMDClNLPp9qbaSrCau/XtMmTxWHfAAkuSJC20Im+lUDIU6B8Ra5IVVgcDh5Q3iIjNgd8Be6aUJuXZaasFVkrp0rKdLwccD3yHbALYpS09T5IkaUmQUpodEccADwK1wPUppRERcR4wLKV0D/ALYFng9sgit7dTSvu0tt8252BFxMrAj8jmYN0EbJFSev9zHY0kSRIsFhFWSul+4P4m684q+3q3Bd1nW3OwfgH8D9nY5cYppY8X9AUkSZI6mrYSrJOAmcBPgTNi3ky0IJvkvnw79k2SJFW5nLdSWOK0NQcr953eJUmSlMl1HyxJkqT20N63aSiKCZUkSVKFmWBJkqTCVGmAZYIlSZJUaSZYkiSpOFUaYZlgSZIkVZgJliRJKky13gfLBEuSJKnCTLAkSVJhvA+WJEmScjHBkiRJhanSAMsES5IkqdJMsCRJUmGcgyVJkqRcTLAkSVKBqjPCMsGSJEmqMBMsSZJUmGqdg2WBJUmSClOl9ZVDhJIkSZVmgiVJkgpTrUOEJliSJEkVZoIlSZIKE1U6C8sES5IkqcJMsCRJUnGqM8AywZIkSao0EyxJklSYKg2wTLAkSZIqzQRLkiQVxvtgSZIkKRcTLEmSVBjvgyVJkqRcTLAkSVJxqjPAMsGSJEmqNBMsSZJUmCoNsEywJEmSKs0ES5IkFcb7YEmSJCkXEyxJklSYar0PlgWWJEkqjEOEkiRJysUCS5IkqcIssCRJkirMOViSJKkwzsGSJElSLiZYkiSpMNV6mwYTLEmSpAozwZIkSYVxDpYkSZJyMcGSJEmFqdIAywRLkiSp0kywJElScao0wjLBkiRJqjATLEmSVBjvgyVJkqRcTLAkSVJhvA+WJEmScjHBkiRJhanSAMsES5IkqdJMsCRJUnGqNMKywJIkSYXxNg2SJEnKxQRLkiQVxts0SJIkKZdIKRXdB+UQEYNSSoOL7ocEno9afHguanFlgrXkGFR0B6Qyno9aXHguarFkgSVJklRhFliSJEkVZoG15HCOgRYnno9aXHguarHkJHdJkqQKM8GSJEmqMAusxUhE1EfECxHxckTcHhFLF90ndTwRkSLi0rLlkyPinAK7pA7Kc1FLMgusxcuMlNJmKaWNgM+Ao4rukDqkmcD/RESPojuiDs9zUUssC6zF15PAOhGxckTcFREvRcSQiNgEICIGltKuFyLiPxGxXMH9VfWYTTZx+MSmGyKiZ0T8NSKGlh47ltafExEnl7V7OSLWWFQdVtVamHOxZ0Q8HBEjIuLaiPivBZqKYIG1GIqITsBewHDgXOA/KaVNgJ8AN5eanQz8MKW0GfAFYEYRfVXVuho4NCJWaLL+CuCylNLWwP7AtYu8Z+poFvRcPBv4V0ppQ+AOYLVF1lOpjH/sefHSLSJeKH39JHAd8AzZPx6klP4VEd0jYnngaeBXEXEL8LeU0thCeqyqlFKaFhE3A8fRuHjfDdgg5v111uUjYtlF3T91HAtxLu4E7Fd67gMR8f6i7K80lwXW4mVGKZFqEC38mfGU0sURcR/wFeDpiNgjpfTqIuijOo7LgeeBG8rW1QDbpZQ+LW8YEbNpnIh3bf/uqQNZkHNxUfZLapFDhIu/J4FDASJiF2BK6Te6tVNKw1NKPweGAgMK7KOqUErpPeA24Ltlqx8Cjp27EBFzfyF4C9iitG4LYM1F00t1BAt4Lj4NHFRa92VgpUXUTakRC6zF3znAlhHxEnAxcERp/QmlicQvAbOAfxTUP1W3S4HyCcLHAVuVLroYybwrXf8KrBwRI4BjgNcWbTfVAeQ9F88FvhwRLwMHAhOAjxZpTyW8k7skqYpERBegPqU0OyK2B37TdOqFtCg4B0uSVE1WA26LiBqy+wl+v+D+qIMywZIkSaow52BJkiRVmAWWJElShVlgSZIkVZgFliRJUoVZYEmSJFWYBZYkSVKF/T/nkkwtaKAIRQAAAABJRU5ErkJggg==\n","text/plain":["<Figure size 792x648 with 2 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]}]}