├── _config.yml
├── day_4
├── flask_docker_iap
│ ├── requirements.txt
│ ├── Dockerfile
│ ├── app.py
│ └── model_nlp.py
└── Exploration - FP16 in Python.ipynb
├── images
├── colab_1.jpg
├── colab_2.jpg
├── colab_3.jpg
├── colab_4.jpg
└── dl-iap-header.jpg
├── day_3
├── notebook_imgs
│ └── yoon_kim_structure.png
├── Code Lab 4C - Transfer Learning in NLP.ipynb
└── Sample - Loading and Visualising NLP Data.ipynb
├── .github
└── ISSUE_TEMPLATE
│ └── bug_report.md
├── LICENSE
├── .gitignore
├── README.md
└── day_1
├── Code Lab 0 - Hello GPU.ipynb
└── Sample - EDA Titanic.ipynb
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/day_4/flask_docker_iap/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy
2 | keras
3 | tensorflow
4 | nltk
5 | flask
6 |
--------------------------------------------------------------------------------
/images/colab_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OpenSUTD/deeplearning-workshop-2019/master/images/colab_1.jpg
--------------------------------------------------------------------------------
/images/colab_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OpenSUTD/deeplearning-workshop-2019/master/images/colab_2.jpg
--------------------------------------------------------------------------------
/images/colab_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OpenSUTD/deeplearning-workshop-2019/master/images/colab_3.jpg
--------------------------------------------------------------------------------
/images/colab_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OpenSUTD/deeplearning-workshop-2019/master/images/colab_4.jpg
--------------------------------------------------------------------------------
/images/dl-iap-header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OpenSUTD/deeplearning-workshop-2019/master/images/dl-iap-header.jpg
--------------------------------------------------------------------------------
/day_3/notebook_imgs/yoon_kim_structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OpenSUTD/deeplearning-workshop-2019/master/day_3/notebook_imgs/yoon_kim_structure.png
--------------------------------------------------------------------------------
/day_4/flask_docker_iap/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.6.8-slim-stretch
2 | MAINTAINER Dude "dude@example.com"
3 |
4 | WORKDIR /app
5 |
6 | COPY . /app
7 |
8 | RUN pip install --no-cache-dir -r requirements.txt
9 |
10 | RUN python -c "import nltk;nltk.download('vader_lexicon');nltk.download('stopwords')"
11 |
12 | EXPOSE 5000
13 |
14 | ENTRYPOINT [ "python" ]
15 |
16 | CMD [ "app.py" ]
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS:
28 | - Browser:
29 |
30 | **Additional context**
31 | Add any other context about the problem here.
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Timothy Liu
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/day_4/flask_docker_iap/app.py:
--------------------------------------------------------------------------------
1 | print(" * [i] Loading Python modules...")
2 | import time
3 | import flask
4 | import functools
5 |
6 | print(" * [i] Loading NLP models...")
7 | from model_nlp import *
8 | from nltk.sentiment.vader import SentimentIntensityAnalyzer as SIA
9 |
10 | app = flask.Flask(__name__)
11 |
12 | sentiment_model = sentiment_classifier()
13 | sia = SIA()
14 |
15 | @functools.lru_cache(maxsize=128, typed=False)
16 | def pred_sentiment(input_):
17 | global sentiment_model, data
18 | data["sentiment"] = sentiment_model.predict(input_)
19 |
20 | data = {"success": False}
21 |
22 | @app.route("/predict", methods=["POST"])
23 | def predict():
24 | global sentiment_model, data
25 |
26 | # get the respective args from the post request
27 |
28 | if flask.request.method == "POST":
29 | start_time = time.time()
30 |
31 | data = {"success": False}
32 | start_time = time.time()
33 | test_text = flask.request.args.get("test")
34 | test_text = test_text.replace("%20", " ")
35 |
36 | pred_sentiment(test_text)
37 |
38 | nltk_sentiment = sia.polarity_scores(test_text)
39 | data["nltk"] = nltk_sentiment
40 |
41 | data["success"] = True
42 |
43 | print(" * [i] Request took", round(time.time()-start_time, 3), "seconds")
44 |
45 | # return the data dictionary as a JSON response
46 | return flask.jsonify(data)
47 |
48 |
49 | # if file was executed by itself, start the server process
50 | if __name__ == "__main__":
51 | print(" * [i] Starting Flask server")
52 | app.run(host='0.0.0.0', port=5000)
--------------------------------------------------------------------------------
/day_4/flask_docker_iap/model_nlp.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import keras
3 | import pickle
4 | import re
5 | from nltk.corpus import stopwords
6 | from keras import preprocessing
7 |
8 | class sentiment_classifier(object):
9 | def __init__(self, model_file="cnn.h5"):
10 | self.model = keras.models.load_model(model_file)
11 | self.model._make_predict_function()
12 | self.classes = ["negative", "positive"]
13 | with open('tokenizer.pickle', 'rb') as handle:
14 | self.tokenizer = pickle.load(handle)
15 |
16 | def predict(self, input_data):
17 | input_sequence = self.preprocess(input_data)
18 | preds = self.model.predict(input_sequence)
19 | pred = preds.argmax(axis=-1)
20 | output = self.classes[pred[0]]
21 | return output
22 |
23 | from nltk.corpus import stopwords
24 | def clean_text(text, remove_stopwords=True):
25 | output = ""
26 | text = str(text).replace("\n", "")
27 | text = re.sub(r'[^\w\s]','',text).lower()
28 | if remove_stopwords:
29 | text = text.split(" ")
30 | for word in text:
31 | if word not in stopwords.words("english"):
32 | output = output + " " + word
33 | else:
34 | output = text
35 | return str(output.strip()).replace(" ", " ")
36 |
37 | def preprocess(self, input_data, MAX_SEQUENCE_LENGTH=30):
38 | input_string = self.clean_text(input_data)
39 | input_token = self.tokenizer.texts_to_sequences([input_string])
40 | processed_input = preprocessing.sequence.pad_sequences(input_token, padding='pre', maxlen=(MAX_SEQUENCE_LENGTH-5))
41 | processed_input = preprocessing.sequence.pad_sequences(processed_input, padding='post', maxlen=(MAX_SEQUENCE_LENGTH))
42 | return processed_input
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | day_1/flickr8k/images/
2 |
3 | .DS_Store
4 | .jupyter
5 | .keras
6 | .ipy*
7 | .cache
8 | .local
9 | .nv
10 | .config
11 |
12 | day_2/train
13 | day_2/val
14 | day_2/logs
15 | day_3/.DS_Store
16 | day_3/logs
17 | cache
18 | *.pickle
19 | *.h5
20 |
21 | # Byte-compiled / optimized / DLL files
22 | __pycache__/
23 | *.py[cod]
24 | *$py.class
25 |
26 | # C extensions
27 | *.so
28 |
29 | # Distribution / packaging
30 | .Python
31 | build/
32 | develop-eggs/
33 | dist/
34 | downloads/
35 | eggs/
36 | .eggs/
37 | lib/
38 | lib64/
39 | parts/
40 | sdist/
41 | var/
42 | wheels/
43 | *.egg-info/
44 | .installed.cfg
45 | *.egg
46 | MANIFEST
47 |
48 | # PyInstaller
49 | # Usually these files are written by a python script from a template
50 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
51 | *.manifest
52 | *.spec
53 |
54 | # Installer logs
55 | pip-log.txt
56 | pip-delete-this-directory.txt
57 |
58 | # Unit test / coverage reports
59 | htmlcov/
60 | .tox/
61 | .coverage
62 | .coverage.*
63 | .cache
64 | nosetests.xml
65 | coverage.xml
66 | *.cover
67 | .hypothesis/
68 | .pytest_cache/
69 |
70 | # Translations
71 | *.mo
72 | *.pot
73 |
74 | # Django stuff:
75 | *.log
76 | local_settings.py
77 | db.sqlite3
78 |
79 | # Flask stuff:
80 | instance/
81 | .webassets-cache
82 |
83 | # Scrapy stuff:
84 | .scrapy
85 |
86 | # Sphinx documentation
87 | docs/_build/
88 |
89 | # PyBuilder
90 | target/
91 |
92 | # Jupyter Notebook
93 | .ipynb_checkpoints
94 |
95 | # pyenv
96 | .python-version
97 |
98 | # celery beat schedule file
99 | celerybeat-schedule
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | This repository contains the material for the Deep Learning Workshop conducted in the IAP 2019. The slides are also available at on [Google Drive](bit.ly/dl-iap-1).
4 |
5 | If you do not already have a workstation set up for Deep Learning, you may want to run the notebooks in [Google Colab](https://colab.research.google.com/).
6 |
7 | If you have a workstation or cloud instance set up for Deep Learning, our recommended way to run the notebooks is to run it in a Docker container `nvaitc/ai-lab` ([learn more](https://github.com/NVAITC/ai-lab/blob/master/README.md#using-the-ai-lab-container)). For now, we will also assume that you are using Ubuntu 16.04 or 18.04, and have an NVIDIA GPU card in your workstation/instance. The instructions are [below](#b-workstation--cloud-instance).
8 |
9 |  [](https://github.com/OpenSUTD/deeplearning-workshop-2019/issues) 
10 |
11 | ## Using the Notebooks
12 |
13 | ### A. Google Colab
14 |
15 | #### 1. Open Notebook in Colab
16 |
17 | * Proceed to [Google Colab](https://colab.research.google.com) and click the "GitHub" tab.
18 | * Enter in the URL of this repository as follows and simply select which notebook you wish to open
19 |
20 | 
21 |
22 | * Change runtime type to GPU
23 |
24 | 
25 |
26 | 
27 |
28 | * On the menu bar, go to **Runtime > Run All**
29 |
30 | 
31 |
32 | * Accept the usual warning, and you will be able to run the notebook
33 | * All the notebooks should be able to run just fine, do open an issue if you face problems.
34 |
35 | ### B. Workstation / Cloud Instance
36 |
37 | #### 1. Setting up CUDA, NVIDIA drivers, and Docker
38 |
39 | ```bash
40 | sudo su root
41 | curl https://getcuda.ml/ubuntu.sh | bash
42 | # your computer will reboot
43 | # after your computer reboots, add yourself to the docker group
44 | # if you don't want to run docker with sudo
45 | # you may need to log in and out again for this to take effect
46 | sudo usermod -aG docker $USER
47 | ```
48 |
49 | #### 2. Pulling the `nvaitc/ai-lab` Docker image
50 |
51 | * This container includes many data science, machine learning and deep learning packages that are preconfigured and ready to use.
52 | * **This is a 6GB download**!
53 | * Find out more about the image at its [GitHub repository](https://github.com/NVAITC/ai-lab).
54 |
55 | ```bash
56 | docker pull nvaitc/ai-lab:latest
57 | ```
58 |
59 | #### 3. Download the code labs
60 |
61 | ```bash
62 | git clone https://github.com/OpenSUTD/deeplearning-workshop-2019
63 | # take note of where you cloned the files to!
64 | # we will assume it's at /home/$USER/deeplearning-workshop-2019
65 | ```
66 |
67 | Alternatively, you may download this repository as a zip file from the GitHub web interface.
68 |
69 | #### 4. Start the container and mount the folder
70 |
71 | Please change the path `/home/$USER/deeplearning-workshop-2019` to where-ever you downloaded the files to in **Step 3**.
72 |
73 | ```bash
74 | nvidia-docker run --rm -p 8888:8888 -v /home/$USER/deeplearning-workshop-2019:/home/jovyan/ nvaitc/ai-lab
75 | ```
76 |
77 | This will output a chunk of output in the Terminal. Take note of the last few lines.
78 |
79 | Open your web browser and point to `localhost:8888`. You will be asked to enter a token. This can be found in the last few lines of the Terminal output.
80 |
81 | ## Workshop Authors
82 |
83 | * Soh Jun De
84 | * Aiden Chia
85 | * Timothy Liu
86 |
--------------------------------------------------------------------------------
/day_4/Exploration - FP16 in Python.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "Ever wonder what can go wrong with `float16`?"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import numpy as np"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {},
22 | "source": [
23 | "First off, let's look at the correct `float32` results"
24 | ]
25 | },
26 | {
27 | "cell_type": "code",
28 | "execution_count": 2,
29 | "metadata": {},
30 | "outputs": [
31 | {
32 | "data": {
33 | "text/plain": [
34 | "1.0001"
35 | ]
36 | },
37 | "execution_count": 2,
38 | "metadata": {},
39 | "output_type": "execute_result"
40 | }
41 | ],
42 | "source": [
43 | "np.add(1, 0.0001, dtype=\"float32\")"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 7,
49 | "metadata": {},
50 | "outputs": [
51 | {
52 | "data": {
53 | "text/plain": [
54 | "66001.0"
55 | ]
56 | },
57 | "execution_count": 7,
58 | "metadata": {},
59 | "output_type": "execute_result"
60 | }
61 | ],
62 | "source": [
63 | "np.add(1, 66000, dtype=\"float32\")"
64 | ]
65 | },
66 | {
67 | "cell_type": "markdown",
68 | "metadata": {},
69 | "source": [
70 | "Now for `float16`"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 3,
76 | "metadata": {},
77 | "outputs": [
78 | {
79 | "data": {
80 | "text/plain": [
81 | "1.0"
82 | ]
83 | },
84 | "execution_count": 3,
85 | "metadata": {},
86 | "output_type": "execute_result"
87 | }
88 | ],
89 | "source": [
90 | "np.add(1, 0.0001, dtype=\"float16\")"
91 | ]
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 4,
96 | "metadata": {},
97 | "outputs": [
98 | {
99 | "data": {
100 | "text/plain": [
101 | "inf"
102 | ]
103 | },
104 | "execution_count": 4,
105 | "metadata": {},
106 | "output_type": "execute_result"
107 | }
108 | ],
109 | "source": [
110 | "np.add(1, 66000, dtype=\"float16\")"
111 | ]
112 | },
113 | {
114 | "cell_type": "code",
115 | "execution_count": 5,
116 | "metadata": {},
117 | "outputs": [
118 | {
119 | "data": {
120 | "text/plain": [
121 | "0.0"
122 | ]
123 | },
124 | "execution_count": 5,
125 | "metadata": {},
126 | "output_type": "execute_result"
127 | }
128 | ],
129 | "source": [
130 | "np.add(1e-8, 1e-8, dtype=\"float16\")"
131 | ]
132 | },
133 | {
134 | "cell_type": "code",
135 | "execution_count": 6,
136 | "metadata": {},
137 | "outputs": [
138 | {
139 | "data": {
140 | "text/plain": [
141 | "2e-08"
142 | ]
143 | },
144 | "execution_count": 6,
145 | "metadata": {},
146 | "output_type": "execute_result"
147 | }
148 | ],
149 | "source": [
150 | "np.add(1e-8, 1e-8, dtype=\"float32\")"
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "execution_count": null,
156 | "metadata": {},
157 | "outputs": [],
158 | "source": []
159 | }
160 | ],
161 | "metadata": {
162 | "kernelspec": {
163 | "display_name": "Python 3",
164 | "language": "python",
165 | "name": "python3"
166 | },
167 | "language_info": {
168 | "codemirror_mode": {
169 | "name": "ipython",
170 | "version": 3
171 | },
172 | "file_extension": ".py",
173 | "mimetype": "text/x-python",
174 | "name": "python",
175 | "nbconvert_exporter": "python",
176 | "pygments_lexer": "ipython3",
177 | "version": "3.6.7"
178 | }
179 | },
180 | "nbformat": 4,
181 | "nbformat_minor": 2
182 | }
183 |
--------------------------------------------------------------------------------
/day_1/Code Lab 0 - Hello GPU.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Hello, GPU!"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [
15 | {
16 | "name": "stdout",
17 | "output_type": "stream",
18 | "text": [
19 | "Mon Mar 25 06:23:26 2019 \r\n",
20 | "+-----------------------------------------------------------------------------+\r\n",
21 | "| NVIDIA-SMI 418.39 Driver Version: 418.39 CUDA Version: 10.1 |\r\n",
22 | "|-------------------------------+----------------------+----------------------+\r\n",
23 | "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\r\n",
24 | "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\r\n",
25 | "|===============================+======================+======================|\r\n",
26 | "| 0 GeForce GTX 108... On | 00000000:01:00.0 On | N/A |\r\n",
27 | "| 49% 50C P0 65W / 250W | 729MiB / 11175MiB | 2% Default |\r\n",
28 | "+-------------------------------+----------------------+----------------------+\r\n",
29 | " \r\n",
30 | "+-----------------------------------------------------------------------------+\r\n",
31 | "| Processes: GPU Memory |\r\n",
32 | "| GPU PID Type Process name Usage |\r\n",
33 | "|=============================================================================|\r\n",
34 | "+-----------------------------------------------------------------------------+\r\n"
35 | ]
36 | }
37 | ],
38 | "source": [
39 | "!nvidia-smi"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": 2,
45 | "metadata": {},
46 | "outputs": [
47 | {
48 | "name": "stdout",
49 | "output_type": "stream",
50 | "text": [
51 | "\u001b[1m\u001b[37m0e2ea7bd894e\u001b[m Mon Mar 25 06:23:27 2019\r\n",
52 | "\u001b[36m[0]\u001b[m \u001b[34mGeForce GTX 1080 Ti\u001b[m |\u001b[1m\u001b[31m 50'C\u001b[m, \u001b[32m 1 %\u001b[m | \u001b[36m\u001b[1m\u001b[33m 729\u001b[m / \u001b[33m11175\u001b[m MB |\r\n"
53 | ]
54 | }
55 | ],
56 | "source": [
57 | "!gpustat"
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "execution_count": 3,
63 | "metadata": {},
64 | "outputs": [
65 | {
66 | "name": "stdout",
67 | "output_type": "stream",
68 | "text": [
69 | "[name: \"/device:CPU:0\"\n",
70 | "device_type: \"CPU\"\n",
71 | "memory_limit: 268435456\n",
72 | "locality {\n",
73 | "}\n",
74 | "incarnation: 4503158194805763585\n",
75 | ", name: \"/device:XLA_CPU:0\"\n",
76 | "device_type: \"XLA_CPU\"\n",
77 | "memory_limit: 17179869184\n",
78 | "locality {\n",
79 | "}\n",
80 | "incarnation: 3695275088634348821\n",
81 | "physical_device_desc: \"device: XLA_CPU device\"\n",
82 | ", name: \"/device:XLA_GPU:0\"\n",
83 | "device_type: \"XLA_GPU\"\n",
84 | "memory_limit: 17179869184\n",
85 | "locality {\n",
86 | "}\n",
87 | "incarnation: 3548020933932946827\n",
88 | "physical_device_desc: \"device: XLA_GPU device\"\n",
89 | ", name: \"/device:GPU:0\"\n",
90 | "device_type: \"GPU\"\n",
91 | "memory_limit: 10189963264\n",
92 | "locality {\n",
93 | " bus_id: 1\n",
94 | " links {\n",
95 | " }\n",
96 | "}\n",
97 | "incarnation: 18420482472046241236\n",
98 | "physical_device_desc: \"device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1\"\n",
99 | "]\n"
100 | ]
101 | }
102 | ],
103 | "source": [
104 | "import tensorflow as tf\n",
105 | "from tensorflow.python.client import device_lib\n",
106 | "print(device_lib.list_local_devices())"
107 | ]
108 | }
109 | ],
110 | "metadata": {
111 | "kernelspec": {
112 | "display_name": "Python 3",
113 | "language": "python",
114 | "name": "python3"
115 | },
116 | "language_info": {
117 | "codemirror_mode": {
118 | "name": "ipython",
119 | "version": 3
120 | },
121 | "file_extension": ".py",
122 | "mimetype": "text/x-python",
123 | "name": "python",
124 | "nbconvert_exporter": "python",
125 | "pygments_lexer": "ipython3",
126 | "version": "3.6.7"
127 | }
128 | },
129 | "nbformat": 4,
130 | "nbformat_minor": 2
131 | }
132 |
--------------------------------------------------------------------------------
/day_3/Code Lab 4C - Transfer Learning in NLP.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Code Lab 4C - Transfer Learning in NLP\n",
8 | "\n",
9 | "## Fine-tuning ELMo for Text Classification\n",
10 | "\n",
11 | "In this Code Lab, we are going to make use of a pre-trained ELMo model from [TensorFlow Hub](https://www.tensorflow.org/hub/). ELMo is a model that makes use of a **language model** (a more complex representation compared to word embeddings) to achieve state of the art results (until recently, but that's how fast things are moving.\n",
12 | "\n",
13 | "**More on ELMo**\n",
14 | "\n",
15 | "* https://allennlp.org/elmo\n",
16 | "* [ArXiv: Deep contextualized word representations](https://arxiv.org/abs/1802.05365)\n",
17 | "\n",
18 | "This notebook consist of 4 main sections:\n",
19 | "\n",
20 | "1. Preparing the data\n",
21 | "2. Implementing a simple CNN model\n",
22 | "3. Training the model\n",
23 | "4. Evaluating the model"
24 | ]
25 | },
26 | {
27 | "cell_type": "markdown",
28 | "metadata": {},
29 | "source": [
30 | "**Key Model Parameters**"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": null,
36 | "metadata": {},
37 | "outputs": [],
38 | "source": [
39 | "MAX_NB_WORDS = 100000 # max no. of words for tokenizer\n",
40 | "MAX_SEQUENCE_LENGTH = 20 # max length of each entry (sentence), including padding\n",
41 | "VALIDATION_SPLIT = 0.3 # data for validation (not used in training)"
42 | ]
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": null,
47 | "metadata": {},
48 | "outputs": [],
49 | "source": [
50 | "import numpy as np\n",
51 | "import re, sys, csv, pickle\n",
52 | "from tqdm import tqdm_notebook\n",
53 | "\n",
54 | "import tensorflow as tf\n",
55 | "import tensorflow_hub as hub\n",
56 | "\n",
57 | "import keras\n",
58 | "from keras import regularizers, initializers, optimizers, callbacks\n",
59 | "from keras.utils.np_utils import to_categorical\n",
60 | "from keras.layers import *\n",
61 | "from keras.models import Model\n",
62 | "from keras import backend as K"
63 | ]
64 | },
65 | {
66 | "cell_type": "markdown",
67 | "metadata": {},
68 | "source": [
69 | "### 1. Prepare the data"
70 | ]
71 | },
72 | {
73 | "cell_type": "markdown",
74 | "metadata": {},
75 | "source": [
76 | "**Preprocessing Step**\n",
77 | "\n",
78 | "Removing [stopwords](https://nlp.stanford.edu/IR-book/html/htmledition/dropping-common-terms-stop-words-1.html), punctuation and making everything lowercase."
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": null,
84 | "metadata": {},
85 | "outputs": [],
86 | "source": [
87 | "from nltk.corpus import stopwords\n",
88 | "def clean_text(text, remove_stopwords=True):\n",
89 | " output = \"\"\n",
90 | " text = str(text).replace(\"\\n\", \"\")\n",
91 | " text = re.sub(r'[^\\w\\s]','',text).lower()\n",
92 | " if remove_stopwords:\n",
93 | " text = text.split(\" \")\n",
94 | " for word in text:\n",
95 | " if word not in stopwords.words(\"english\"):\n",
96 | " output = output + \" \" + word\n",
97 | " else:\n",
98 | " output = text\n",
99 | " return str(output.strip())[1:-3].replace(\" \", \" \")"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "metadata": {},
105 | "source": [
106 | "**Reading from Dataset**"
107 | ]
108 | },
109 | {
110 | "cell_type": "code",
111 | "execution_count": null,
112 | "metadata": {},
113 | "outputs": [],
114 | "source": [
115 | "DATA_URL = \"https://s3-ap-southeast-1.amazonaws.com/deeplearning-mat/stanford_movie.zip\"\n",
116 | "DATA_DIR = keras.utils.get_file(\"stanford_movie.zip\", DATA_URL, cache_subdir='datasets', extract=True)\n",
117 | "print(\"Dataset present at\", DATA_DIR)\n",
118 | "DATA_DIR = DATA_DIR.replace(\".zip\", \"\")"
119 | ]
120 | },
121 | {
122 | "cell_type": "code",
123 | "execution_count": null,
124 | "metadata": {},
125 | "outputs": [],
126 | "source": [
127 | "texts = [] # empty list for model input: the movie reviews\n",
128 | "labels = [] # empty lists model output: sentiment labels\n",
129 | "\n",
130 | "data_neg = open(DATA_DIR+\"/stanford_movie_neg.txt\", \"rb\") \n",
131 | "for line in tqdm_notebook(data_neg, total=5331): \n",
132 | " texts.append(clean_text(line, remove_stopwords=False))\n",
133 | " labels.append(int(0))"
134 | ]
135 | },
136 | {
137 | "cell_type": "code",
138 | "execution_count": null,
139 | "metadata": {},
140 | "outputs": [],
141 | "source": [
142 | "data_pos = open(DATA_DIR+\"/stanford_movie_pos.txt\", \"rb\") \n",
143 | "for line in tqdm_notebook(data_pos, total=5331): \n",
144 | " texts.append(clean_text(line, remove_stopwords=False))\n",
145 | " labels.append(int(1))"
146 | ]
147 | },
148 | {
149 | "cell_type": "code",
150 | "execution_count": null,
151 | "metadata": {},
152 | "outputs": [],
153 | "source": [
154 | "print(\"Sample negative:\", texts[0], labels[0])\n",
155 | "print(\"Sample positive:\", texts[9000], labels[9000])"
156 | ]
157 | },
158 | {
159 | "cell_type": "markdown",
160 | "metadata": {},
161 | "source": [
162 | "**Generate the array of sentences from dataset**"
163 | ]
164 | },
165 | {
166 | "cell_type": "code",
167 | "execution_count": null,
168 | "metadata": {},
169 | "outputs": [],
170 | "source": [
171 | "all_text = [' '.join(t.split()[0:150]) for t in texts]\n",
172 | "all_text = np.array(all_text, dtype=object)[:, np.newaxis]\n",
173 | "\n",
174 | "labels = to_categorical(np.asarray(labels)) # convert the category label to one-hot encoding\n",
175 | "print('[i] Shape of data tensor:', all_text.shape)\n",
176 | "print('[i] Shape of label tensor:', labels.shape)\n",
177 | "\n",
178 | "indices = np.arange(all_text.shape[0])\n",
179 | "np.random.shuffle(indices)\n",
180 | "all_text = all_text[indices]\n",
181 | "labels = labels[indices]\n",
182 | "nb_validation_samples = int(VALIDATION_SPLIT * all_text.shape[0])\n",
183 | "x_train = all_text[:-nb_validation_samples]\n",
184 | "y_train = labels[:-nb_validation_samples]\n",
185 | "x_val = all_text[-nb_validation_samples:]\n",
186 | "y_val = labels[-nb_validation_samples:]\n",
187 | "\n",
188 | "print('[i] Number of entries in each category:')\n",
189 | "print(\"[+] Training:\",y_train.sum(axis=0))\n",
190 | "print(\"[+] Validation:\",y_val.sum(axis=0))"
191 | ]
192 | },
193 | {
194 | "cell_type": "markdown",
195 | "metadata": {},
196 | "source": [
197 | "**What does the data look like?**"
198 | ]
199 | },
200 | {
201 | "cell_type": "code",
202 | "execution_count": null,
203 | "metadata": {},
204 | "outputs": [],
205 | "source": [
206 | "print(\"Sentence input\", all_text[0])\n",
207 | "print(\"\")\n",
208 | "print(\"One-hot label\", labels[0])"
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {},
214 | "source": [
215 | "### 2. Create the model\n",
216 | "\n",
217 | "We will now start to create the model in `Keras`."
218 | ]
219 | },
220 | {
221 | "cell_type": "markdown",
222 | "metadata": {},
223 | "source": [
224 | "**Create the `ELMo` layer**\n",
225 | "\n",
226 | "Computes deep contextualized word representations using character-based word representations and bidirectional LSTMs. Paper: [Deep contextualized word representations](https://arxiv.org/abs/1802.05365)"
227 | ]
228 | },
229 | {
230 | "cell_type": "code",
231 | "execution_count": null,
232 | "metadata": {},
233 | "outputs": [],
234 | "source": [
235 | "# Initialize session\n",
236 | "sess = tf.Session()\n",
237 | "K.set_session(sess)"
238 | ]
239 | },
240 | {
241 | "cell_type": "code",
242 | "execution_count": null,
243 | "metadata": {},
244 | "outputs": [],
245 | "source": [
246 | "elmo_model = hub.Module(\"https://tfhub.dev/google/elmo/2\", trainable=False)\n",
247 | "sess.run(tf.global_variables_initializer())\n",
248 | "sess.run(tf.tables_initializer())\n",
249 | "\n",
250 | "def ElmoEmbedding(x):\n",
251 | " return elmo_model(tf.squeeze(tf.cast(x, tf.string)), signature=\"default\", as_dict=True)[\"default\"]"
252 | ]
253 | },
254 | {
255 | "cell_type": "markdown",
256 | "metadata": {},
257 | "source": [
258 | "**Rest of the model**"
259 | ]
260 | },
261 | {
262 | "cell_type": "code",
263 | "execution_count": null,
264 | "metadata": {},
265 | "outputs": [],
266 | "source": [
267 | "sequence_input = Input(shape=(1,), dtype=tf.string)\n",
268 | "embedded_sequences = Lambda(ElmoEmbedding, output_shape=(1024,))(sequence_input)\n",
269 | "embedded_sequences = Reshape((1024, 1,))(embedded_sequences)"
270 | ]
271 | },
272 | {
273 | "cell_type": "code",
274 | "execution_count": null,
275 | "metadata": {},
276 | "outputs": [],
277 | "source": [
278 | "l_drop = Dropout(0.5)(embedded_sequences)\n",
279 | "l_flat = Flatten()(l_drop)\n",
280 | "l_dense = Dense(32, activation='relu')(l_flat)\n",
281 | "preds = Dense(2, activation='softmax')(l_dense) #follows the number of classes"
282 | ]
283 | },
284 | {
285 | "cell_type": "markdown",
286 | "metadata": {},
287 | "source": [
288 | "**Compile the model into a static graph for training**"
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "execution_count": null,
294 | "metadata": {},
295 | "outputs": [],
296 | "source": [
297 | "model = Model(sequence_input, preds)\n",
298 | "model.compile(loss='binary_crossentropy',\n",
299 | " optimizer=\"rmsprop\",\n",
300 | " metrics=['acc'])\n",
301 | "model.summary()"
302 | ]
303 | },
304 | {
305 | "cell_type": "markdown",
306 | "metadata": {},
307 | "source": [
308 | "**Visualisation**"
309 | ]
310 | },
311 | {
312 | "cell_type": "code",
313 | "execution_count": null,
314 | "metadata": {},
315 | "outputs": [],
316 | "source": [
317 | "from IPython.display import SVG\n",
318 | "from keras.utils.vis_utils import model_to_dot\n",
319 | "SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))"
320 | ]
321 | },
322 | {
323 | "cell_type": "markdown",
324 | "metadata": {},
325 | "source": [
326 | "### 3. Train the model"
327 | ]
328 | },
329 | {
330 | "cell_type": "code",
331 | "execution_count": null,
332 | "metadata": {
333 | "scrolled": false
334 | },
335 | "outputs": [],
336 | "source": [
337 | "print(\"Training Progress:\")\n",
338 | "model_log = model.fit(x_train, y_train, validation_data=(x_val, y_val),\n",
339 | " epochs=15, batch_size=64)"
340 | ]
341 | },
342 | {
343 | "cell_type": "markdown",
344 | "metadata": {},
345 | "source": [
346 | "### 4. Evaluate the model"
347 | ]
348 | },
349 | {
350 | "cell_type": "code",
351 | "execution_count": null,
352 | "metadata": {},
353 | "outputs": [],
354 | "source": [
355 | "import matplotlib.pyplot as plt\n",
356 | "%matplotlib inline\n",
357 | "%config InlineBackend.figure_format = 'retina'\n",
358 | "\n",
359 | "plt.plot(model_log.history['acc'])\n",
360 | "plt.plot(model_log.history['val_acc'])\n",
361 | "plt.title('Accuracy (Higher Better)')\n",
362 | "plt.ylabel('Accuracy')\n",
363 | "plt.xlabel('Epoch')\n",
364 | "plt.legend(['train', 'validation'], loc='upper left')\n",
365 | "plt.show()\n",
366 | "\n",
367 | "plt.plot(model_log.history['loss'])\n",
368 | "plt.plot(model_log.history['val_loss'])\n",
369 | "plt.title('Loss (Lower Better)')\n",
370 | "plt.ylabel('Loss')\n",
371 | "plt.xlabel('Epoch')\n",
372 | "plt.legend(['train', 'validation'], loc='upper left')\n",
373 | "plt.show()"
374 | ]
375 | },
376 | {
377 | "cell_type": "code",
378 | "execution_count": null,
379 | "metadata": {},
380 | "outputs": [],
381 | "source": [
382 | "from sklearn.metrics import classification_report, confusion_matrix\n",
383 | "import itertools\n",
384 | "\n",
385 | "classes = [\"positive\", \"negative\"]"
386 | ]
387 | },
388 | {
389 | "cell_type": "code",
390 | "execution_count": null,
391 | "metadata": {},
392 | "outputs": [],
393 | "source": [
394 | "Y_test = np.argmax(y_val, axis=1) # Convert one-hot to index\n",
395 | "y_pred = model.predict(x_val)\n",
396 | "y_pred_class = np.argmax(y_pred,axis=1)\n",
397 | "print(classification_report(Y_test, y_pred_class, target_names=classes))"
398 | ]
399 | },
400 | {
401 | "cell_type": "code",
402 | "execution_count": null,
403 | "metadata": {},
404 | "outputs": [],
405 | "source": [
406 | "plt.style.use('seaborn-dark')\n",
407 | "def plot_confusion_matrix(cm, labels,\n",
408 | " normalize=True,\n",
409 | " title='Confusion Matrix (Validation Set)',\n",
410 | " cmap=plt.cm.Blues):\n",
411 | " \"\"\"\n",
412 | " This function prints and plots the confusion matrix.\n",
413 | " Normalization can be applied by setting `normalize=True`.\n",
414 | " \"\"\"\n",
415 | " if normalize:\n",
416 | " cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
417 | " #print(\"Normalized confusion matrix\")\n",
418 | " else:\n",
419 | " #print('Confusion matrix, without normalization')\n",
420 | " pass\n",
421 | "\n",
422 | " #print(cm)\n",
423 | "\n",
424 | " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
425 | " plt.title(title)\n",
426 | " plt.colorbar()\n",
427 | " tick_marks = np.arange(len(labels))\n",
428 | " plt.xticks(tick_marks, labels, rotation=45)\n",
429 | " plt.yticks(tick_marks, labels)\n",
430 | "\n",
431 | " fmt = '.2f' if normalize else 'd'\n",
432 | " thresh = cm.max() / 2.\n",
433 | " for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
434 | " plt.text(j, i, format(cm[i, j], fmt),\n",
435 | " horizontalalignment=\"center\",\n",
436 | " color=\"white\" if cm[i, j] > thresh else \"black\")\n",
437 | "\n",
438 | " plt.tight_layout()\n",
439 | " plt.ylabel('True label')\n",
440 | " plt.xlabel('Predicted label')\n",
441 | "\n",
442 | "plt.figure(figsize=(14,7))\n",
443 | "cnf_matrix = confusion_matrix(Y_test, y_pred_class)\n",
444 | "plot_confusion_matrix(cnf_matrix, labels=classes)"
445 | ]
446 | },
447 | {
448 | "cell_type": "code",
449 | "execution_count": null,
450 | "metadata": {},
451 | "outputs": [],
452 | "source": []
453 | }
454 | ],
455 | "metadata": {
456 | "kernelspec": {
457 | "display_name": "Python 3",
458 | "language": "python",
459 | "name": "python3"
460 | },
461 | "language_info": {
462 | "codemirror_mode": {
463 | "name": "ipython",
464 | "version": 3
465 | },
466 | "file_extension": ".py",
467 | "mimetype": "text/x-python",
468 | "name": "python",
469 | "nbconvert_exporter": "python",
470 | "pygments_lexer": "ipython3",
471 | "version": "3.6.7"
472 | }
473 | },
474 | "nbformat": 4,
475 | "nbformat_minor": 2
476 | }
477 |
--------------------------------------------------------------------------------
/day_1/Sample - EDA Titanic.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "colab_type": "text",
7 | "id": "Ffy0K-fYmF1E"
8 | },
9 | "source": [
10 | "# EDA: Titanic Dataset\n",
11 | "\n",
12 | "Who lives and who dies?"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 1,
18 | "metadata": {
19 | "colab": {
20 | "base_uri": "https://localhost:8080/",
21 | "height": 459
22 | },
23 | "colab_type": "code",
24 | "executionInfo": {
25 | "elapsed": 7780,
26 | "status": "ok",
27 | "timestamp": 1546957324044,
28 | "user": {
29 | "displayName": "Timothy Liu",
30 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
31 | "userId": "03413426750796061565"
32 | },
33 | "user_tz": -480
34 | },
35 | "id": "gOprH9WElm1S",
36 | "outputId": "b151df53-b07a-4af5-d4e8-02278bbd46ed"
37 | },
38 | "outputs": [
39 | {
40 | "name": "stdout",
41 | "output_type": "stream",
42 | "text": [
43 | "Requirement already up-to-date: seaborn in /opt/conda/lib/python3.6/site-packages (0.9.0)\n",
44 | "Requirement already up-to-date: pandas in /opt/conda/lib/python3.6/site-packages (0.24.2)\n",
45 | "Requirement already satisfied, skipping upgrade: matplotlib>=1.4.3 in /opt/conda/lib/python3.6/site-packages (from seaborn) (3.0.3)\n",
46 | "Requirement already satisfied, skipping upgrade: numpy>=1.9.3 in /opt/conda/lib/python3.6/site-packages (from seaborn) (1.16.2)\n",
47 | "Requirement already satisfied, skipping upgrade: scipy>=0.14.0 in /opt/conda/lib/python3.6/site-packages (from seaborn) (1.2.1)\n",
48 | "Requirement already satisfied, skipping upgrade: pytz>=2011k in /opt/conda/lib/python3.6/site-packages (from pandas) (2018.9)\n",
49 | "Requirement already satisfied, skipping upgrade: python-dateutil>=2.5.0 in /opt/conda/lib/python3.6/site-packages (from pandas) (2.8.0)\n",
50 | "Requirement already satisfied, skipping upgrade: cycler>=0.10 in /opt/conda/lib/python3.6/site-packages (from matplotlib>=1.4.3->seaborn) (0.10.0)\n",
51 | "Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib>=1.4.3->seaborn) (1.0.1)\n",
52 | "Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib>=1.4.3->seaborn) (2.3.1)\n",
53 | "Requirement already satisfied, skipping upgrade: six>=1.5 in /opt/conda/lib/python3.6/site-packages (from python-dateutil>=2.5.0->pandas) (1.12.0)\n",
54 | "Requirement already satisfied, skipping upgrade: setuptools in /opt/conda/lib/python3.6/site-packages (from kiwisolver>=1.0.1->matplotlib>=1.4.3->seaborn) (40.8.0)\n"
55 | ]
56 | }
57 | ],
58 | "source": [
59 | "# this cell is needed in Colab\n",
60 | "!pip install seaborn pandas -U"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 2,
66 | "metadata": {
67 | "colab": {},
68 | "colab_type": "code",
69 | "id": "LF7fKrycl3uJ"
70 | },
71 | "outputs": [],
72 | "source": [
73 | "import pandas as pd\n",
74 | "\n",
75 | "import matplotlib.pyplot as plt\n",
76 | "import seaborn\n",
77 | "\n",
78 | "%matplotlib inline"
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": 3,
84 | "metadata": {},
85 | "outputs": [
86 | {
87 | "name": "stderr",
88 | "output_type": "stream",
89 | "text": [
90 | "Using TensorFlow backend.\n"
91 | ]
92 | },
93 | {
94 | "name": "stdout",
95 | "output_type": "stream",
96 | "text": [
97 | "Dataset present at: /home/jovyan/.keras/datasets/titanic.csv\n"
98 | ]
99 | }
100 | ],
101 | "source": [
102 | "import keras\n",
103 | "\n",
104 | "DATA_URL = \"https://s3-ap-southeast-1.amazonaws.com/deeplearning-mat/titanic.csv\"\n",
105 | "DATA_DIR = keras.utils.get_file(\"titanic.csv\", DATA_URL, cache_subdir='datasets', extract=True)\n",
106 | "\n",
107 | "print(\"Dataset present at:\", DATA_DIR)"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 4,
113 | "metadata": {
114 | "colab": {
115 | "base_uri": "https://localhost:8080/",
116 | "height": 204
117 | },
118 | "colab_type": "code",
119 | "executionInfo": {
120 | "elapsed": 7768,
121 | "status": "ok",
122 | "timestamp": 1546957324046,
123 | "user": {
124 | "displayName": "Timothy Liu",
125 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
126 | "userId": "03413426750796061565"
127 | },
128 | "user_tz": -480
129 | },
130 | "id": "YGAGobyQl5sD",
131 | "outputId": "a377dbb8-906d-428c-987a-68f3bcfd4d2d"
132 | },
133 | "outputs": [
134 | {
135 | "data": {
136 | "text/html": [
137 | "
\n",
138 | "\n",
151 | "
\n",
152 | " \n",
153 | " \n",
154 | " | \n",
155 | " PassengerId | \n",
156 | " Survived | \n",
157 | " Pclass | \n",
158 | " Name | \n",
159 | " Sex | \n",
160 | " Age | \n",
161 | " SibSp | \n",
162 | " Parch | \n",
163 | " Ticket | \n",
164 | " Fare | \n",
165 | " Cabin | \n",
166 | " Embarked | \n",
167 | "
\n",
168 | " \n",
169 | " \n",
170 | " \n",
171 | " | 0 | \n",
172 | " 1 | \n",
173 | " 0 | \n",
174 | " 3 | \n",
175 | " Braund, Mr. Owen Harris | \n",
176 | " male | \n",
177 | " 22.0 | \n",
178 | " 1 | \n",
179 | " 0 | \n",
180 | " A/5 21171 | \n",
181 | " 7.2500 | \n",
182 | " NaN | \n",
183 | " S | \n",
184 | "
\n",
185 | " \n",
186 | " | 1 | \n",
187 | " 2 | \n",
188 | " 1 | \n",
189 | " 1 | \n",
190 | " Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
191 | " female | \n",
192 | " 38.0 | \n",
193 | " 1 | \n",
194 | " 0 | \n",
195 | " PC 17599 | \n",
196 | " 71.2833 | \n",
197 | " C85 | \n",
198 | " C | \n",
199 | "
\n",
200 | " \n",
201 | " | 2 | \n",
202 | " 3 | \n",
203 | " 1 | \n",
204 | " 3 | \n",
205 | " Heikkinen, Miss. Laina | \n",
206 | " female | \n",
207 | " 26.0 | \n",
208 | " 0 | \n",
209 | " 0 | \n",
210 | " STON/O2. 3101282 | \n",
211 | " 7.9250 | \n",
212 | " NaN | \n",
213 | " S | \n",
214 | "
\n",
215 | " \n",
216 | " | 3 | \n",
217 | " 4 | \n",
218 | " 1 | \n",
219 | " 1 | \n",
220 | " Futrelle, Mrs. Jacques Heath (Lily May Peel) | \n",
221 | " female | \n",
222 | " 35.0 | \n",
223 | " 1 | \n",
224 | " 0 | \n",
225 | " 113803 | \n",
226 | " 53.1000 | \n",
227 | " C123 | \n",
228 | " S | \n",
229 | "
\n",
230 | " \n",
231 | " | 4 | \n",
232 | " 5 | \n",
233 | " 0 | \n",
234 | " 3 | \n",
235 | " Allen, Mr. William Henry | \n",
236 | " male | \n",
237 | " 35.0 | \n",
238 | " 0 | \n",
239 | " 0 | \n",
240 | " 373450 | \n",
241 | " 8.0500 | \n",
242 | " NaN | \n",
243 | " S | \n",
244 | "
\n",
245 | " \n",
246 | "
\n",
247 | "
"
248 | ],
249 | "text/plain": [
250 | " PassengerId Survived Pclass \\\n",
251 | "0 1 0 3 \n",
252 | "1 2 1 1 \n",
253 | "2 3 1 3 \n",
254 | "3 4 1 1 \n",
255 | "4 5 0 3 \n",
256 | "\n",
257 | " Name Sex Age SibSp \\\n",
258 | "0 Braund, Mr. Owen Harris male 22.0 1 \n",
259 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
260 | "2 Heikkinen, Miss. Laina female 26.0 0 \n",
261 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
262 | "4 Allen, Mr. William Henry male 35.0 0 \n",
263 | "\n",
264 | " Parch Ticket Fare Cabin Embarked \n",
265 | "0 0 A/5 21171 7.2500 NaN S \n",
266 | "1 0 PC 17599 71.2833 C85 C \n",
267 | "2 0 STON/O2. 3101282 7.9250 NaN S \n",
268 | "3 0 113803 53.1000 C123 S \n",
269 | "4 0 373450 8.0500 NaN S "
270 | ]
271 | },
272 | "execution_count": 4,
273 | "metadata": {},
274 | "output_type": "execute_result"
275 | }
276 | ],
277 | "source": [
278 | "# use Pandas to load the csv file\n",
279 | "df = pd.read_csv(DATA_DIR)\n",
280 | "\n",
281 | "# look at the top few rows of the dataset\n",
282 | "df.head()"
283 | ]
284 | },
285 | {
286 | "cell_type": "markdown",
287 | "metadata": {
288 | "colab_type": "text",
289 | "id": "p8CTz7qvqkjE"
290 | },
291 | "source": [
292 | "### Search for Missing Data\n",
293 | "\n",
294 | "We will want to correct them"
295 | ]
296 | },
297 | {
298 | "cell_type": "code",
299 | "execution_count": 5,
300 | "metadata": {
301 | "colab": {
302 | "base_uri": "https://localhost:8080/",
303 | "height": 204
304 | },
305 | "colab_type": "code",
306 | "executionInfo": {
307 | "elapsed": 7763,
308 | "status": "ok",
309 | "timestamp": 1546957324047,
310 | "user": {
311 | "displayName": "Timothy Liu",
312 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
313 | "userId": "03413426750796061565"
314 | },
315 | "user_tz": -480
316 | },
317 | "id": "-wnHsqMxotCf",
318 | "outputId": "a62191e3-78d2-4dac-e297-211a32fa8ee9"
319 | },
320 | "outputs": [
321 | {
322 | "data": {
323 | "text/html": [
324 | "\n",
325 | "\n",
338 | "
\n",
339 | " \n",
340 | " \n",
341 | " | \n",
342 | " PassengerId | \n",
343 | " Survived | \n",
344 | " Pclass | \n",
345 | " Name | \n",
346 | " Sex | \n",
347 | " Age | \n",
348 | " SibSp | \n",
349 | " Parch | \n",
350 | " Ticket | \n",
351 | " Fare | \n",
352 | " Cabin | \n",
353 | " Embarked | \n",
354 | "
\n",
355 | " \n",
356 | " \n",
357 | " \n",
358 | " | 0 | \n",
359 | " False | \n",
360 | " False | \n",
361 | " False | \n",
362 | " False | \n",
363 | " False | \n",
364 | " False | \n",
365 | " False | \n",
366 | " False | \n",
367 | " False | \n",
368 | " False | \n",
369 | " True | \n",
370 | " False | \n",
371 | "
\n",
372 | " \n",
373 | " | 1 | \n",
374 | " False | \n",
375 | " False | \n",
376 | " False | \n",
377 | " False | \n",
378 | " False | \n",
379 | " False | \n",
380 | " False | \n",
381 | " False | \n",
382 | " False | \n",
383 | " False | \n",
384 | " False | \n",
385 | " False | \n",
386 | "
\n",
387 | " \n",
388 | " | 2 | \n",
389 | " False | \n",
390 | " False | \n",
391 | " False | \n",
392 | " False | \n",
393 | " False | \n",
394 | " False | \n",
395 | " False | \n",
396 | " False | \n",
397 | " False | \n",
398 | " False | \n",
399 | " True | \n",
400 | " False | \n",
401 | "
\n",
402 | " \n",
403 | " | 3 | \n",
404 | " False | \n",
405 | " False | \n",
406 | " False | \n",
407 | " False | \n",
408 | " False | \n",
409 | " False | \n",
410 | " False | \n",
411 | " False | \n",
412 | " False | \n",
413 | " False | \n",
414 | " False | \n",
415 | " False | \n",
416 | "
\n",
417 | " \n",
418 | " | 4 | \n",
419 | " False | \n",
420 | " False | \n",
421 | " False | \n",
422 | " False | \n",
423 | " False | \n",
424 | " False | \n",
425 | " False | \n",
426 | " False | \n",
427 | " False | \n",
428 | " False | \n",
429 | " True | \n",
430 | " False | \n",
431 | "
\n",
432 | " \n",
433 | "
\n",
434 | "
"
435 | ],
436 | "text/plain": [
437 | " PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket \\\n",
438 | "0 False False False False False False False False False \n",
439 | "1 False False False False False False False False False \n",
440 | "2 False False False False False False False False False \n",
441 | "3 False False False False False False False False False \n",
442 | "4 False False False False False False False False False \n",
443 | "\n",
444 | " Fare Cabin Embarked \n",
445 | "0 False True False \n",
446 | "1 False False False \n",
447 | "2 False True False \n",
448 | "3 False False False \n",
449 | "4 False True False "
450 | ]
451 | },
452 | "execution_count": 5,
453 | "metadata": {},
454 | "output_type": "execute_result"
455 | }
456 | ],
457 | "source": [
458 | "df.isnull().head()"
459 | ]
460 | },
461 | {
462 | "cell_type": "code",
463 | "execution_count": 6,
464 | "metadata": {
465 | "colab": {
466 | "base_uri": "https://localhost:8080/",
467 | "height": 221
468 | },
469 | "colab_type": "code",
470 | "executionInfo": {
471 | "elapsed": 7759,
472 | "status": "ok",
473 | "timestamp": 1546957324047,
474 | "user": {
475 | "displayName": "Timothy Liu",
476 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
477 | "userId": "03413426750796061565"
478 | },
479 | "user_tz": -480
480 | },
481 | "id": "vWIOwpVApFwS",
482 | "outputId": "2b2917bc-e7d9-48a4-d121-1d4d6e087af3"
483 | },
484 | "outputs": [
485 | {
486 | "name": "stdout",
487 | "output_type": "stream",
488 | "text": [
489 | "Column PassengerId has null value is: False\n",
490 | "Column Survived has null value is: False\n",
491 | "Column Pclass has null value is: False\n",
492 | "Column Name has null value is: False\n",
493 | "Column Sex has null value is: False\n",
494 | "Column Age has null value is: True\n",
495 | "Column SibSp has null value is: False\n",
496 | "Column Parch has null value is: False\n",
497 | "Column Ticket has null value is: False\n",
498 | "Column Fare has null value is: False\n",
499 | "Column Cabin has null value is: True\n",
500 | "Column Embarked has null value is: True\n"
501 | ]
502 | }
503 | ],
504 | "source": [
505 | "for col in df.columns:\n",
506 | " col_has_null = df[col].isnull().values.any()\n",
507 | " print(\"Column\", col, \"has null value is:\", col_has_null)"
508 | ]
509 | },
510 | {
511 | "cell_type": "code",
512 | "execution_count": 7,
513 | "metadata": {
514 | "colab": {},
515 | "colab_type": "code",
516 | "id": "ihopIciiphHk"
517 | },
518 | "outputs": [],
519 | "source": [
520 | "# fill missing ages/fares with mean value\n",
521 | "\n",
522 | "df[\"Age\"].fillna(df[\"Age\"].mean(), inplace=True)\n",
523 | "df[\"Fare\"].fillna(df[\"Fare\"].mean(), inplace=True)\n",
524 | "\n",
525 | "# fill cabin and embarked with \"unknown\" category\n",
526 | "\n",
527 | "df[\"Cabin\"].fillna(\"\", inplace=True)\n",
528 | "df[\"Embarked\"].fillna(\"\", inplace=True)"
529 | ]
530 | },
531 | {
532 | "cell_type": "code",
533 | "execution_count": 8,
534 | "metadata": {
535 | "colab": {
536 | "base_uri": "https://localhost:8080/",
537 | "height": 306
538 | },
539 | "colab_type": "code",
540 | "executionInfo": {
541 | "elapsed": 8066,
542 | "status": "ok",
543 | "timestamp": 1546957324363,
544 | "user": {
545 | "displayName": "Timothy Liu",
546 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
547 | "userId": "03413426750796061565"
548 | },
549 | "user_tz": -480
550 | },
551 | "id": "GFjtirLNl8Wa",
552 | "outputId": "2113975c-42ab-4c10-e366-e3e515a330b5"
553 | },
554 | "outputs": [
555 | {
556 | "name": "stdout",
557 | "output_type": "stream",
558 | "text": [
559 | "\n",
560 | "RangeIndex: 891 entries, 0 to 890\n",
561 | "Data columns (total 12 columns):\n",
562 | "PassengerId 891 non-null int64\n",
563 | "Survived 891 non-null int64\n",
564 | "Pclass 891 non-null int64\n",
565 | "Name 891 non-null object\n",
566 | "Sex 891 non-null object\n",
567 | "Age 891 non-null float64\n",
568 | "SibSp 891 non-null int64\n",
569 | "Parch 891 non-null int64\n",
570 | "Ticket 891 non-null object\n",
571 | "Fare 891 non-null float64\n",
572 | "Cabin 891 non-null object\n",
573 | "Embarked 891 non-null object\n",
574 | "dtypes: float64(2), int64(5), object(5)\n",
575 | "memory usage: 83.6+ KB\n"
576 | ]
577 | }
578 | ],
579 | "source": [
580 | "df.info()"
581 | ]
582 | },
583 | {
584 | "cell_type": "code",
585 | "execution_count": 9,
586 | "metadata": {
587 | "colab": {
588 | "base_uri": "https://localhost:8080/",
589 | "height": 297
590 | },
591 | "colab_type": "code",
592 | "executionInfo": {
593 | "elapsed": 8062,
594 | "status": "ok",
595 | "timestamp": 1546957324365,
596 | "user": {
597 | "displayName": "Timothy Liu",
598 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
599 | "userId": "03413426750796061565"
600 | },
601 | "user_tz": -480
602 | },
603 | "id": "PmZfjwa0ma3T",
604 | "outputId": "770ef5fd-b69d-42d6-f82c-7b1aa7bac759"
605 | },
606 | "outputs": [
607 | {
608 | "data": {
609 | "text/html": [
610 | "\n",
611 | "\n",
624 | "
\n",
625 | " \n",
626 | " \n",
627 | " | \n",
628 | " PassengerId | \n",
629 | " Survived | \n",
630 | " Pclass | \n",
631 | " Age | \n",
632 | " SibSp | \n",
633 | " Parch | \n",
634 | " Fare | \n",
635 | "
\n",
636 | " \n",
637 | " \n",
638 | " \n",
639 | " | count | \n",
640 | " 891.000000 | \n",
641 | " 891.000000 | \n",
642 | " 891.000000 | \n",
643 | " 891.000000 | \n",
644 | " 891.000000 | \n",
645 | " 891.000000 | \n",
646 | " 891.000000 | \n",
647 | "
\n",
648 | " \n",
649 | " | mean | \n",
650 | " 446.000000 | \n",
651 | " 0.383838 | \n",
652 | " 2.308642 | \n",
653 | " 29.699118 | \n",
654 | " 0.523008 | \n",
655 | " 0.381594 | \n",
656 | " 32.204208 | \n",
657 | "
\n",
658 | " \n",
659 | " | std | \n",
660 | " 257.353842 | \n",
661 | " 0.486592 | \n",
662 | " 0.836071 | \n",
663 | " 13.002015 | \n",
664 | " 1.102743 | \n",
665 | " 0.806057 | \n",
666 | " 49.693429 | \n",
667 | "
\n",
668 | " \n",
669 | " | min | \n",
670 | " 1.000000 | \n",
671 | " 0.000000 | \n",
672 | " 1.000000 | \n",
673 | " 0.420000 | \n",
674 | " 0.000000 | \n",
675 | " 0.000000 | \n",
676 | " 0.000000 | \n",
677 | "
\n",
678 | " \n",
679 | " | 25% | \n",
680 | " 223.500000 | \n",
681 | " 0.000000 | \n",
682 | " 2.000000 | \n",
683 | " 22.000000 | \n",
684 | " 0.000000 | \n",
685 | " 0.000000 | \n",
686 | " 7.910400 | \n",
687 | "
\n",
688 | " \n",
689 | " | 50% | \n",
690 | " 446.000000 | \n",
691 | " 0.000000 | \n",
692 | " 3.000000 | \n",
693 | " 29.699118 | \n",
694 | " 0.000000 | \n",
695 | " 0.000000 | \n",
696 | " 14.454200 | \n",
697 | "
\n",
698 | " \n",
699 | " | 75% | \n",
700 | " 668.500000 | \n",
701 | " 1.000000 | \n",
702 | " 3.000000 | \n",
703 | " 35.000000 | \n",
704 | " 1.000000 | \n",
705 | " 0.000000 | \n",
706 | " 31.000000 | \n",
707 | "
\n",
708 | " \n",
709 | " | max | \n",
710 | " 891.000000 | \n",
711 | " 1.000000 | \n",
712 | " 3.000000 | \n",
713 | " 80.000000 | \n",
714 | " 8.000000 | \n",
715 | " 6.000000 | \n",
716 | " 512.329200 | \n",
717 | "
\n",
718 | " \n",
719 | "
\n",
720 | "
"
721 | ],
722 | "text/plain": [
723 | " PassengerId Survived Pclass Age SibSp \\\n",
724 | "count 891.000000 891.000000 891.000000 891.000000 891.000000 \n",
725 | "mean 446.000000 0.383838 2.308642 29.699118 0.523008 \n",
726 | "std 257.353842 0.486592 0.836071 13.002015 1.102743 \n",
727 | "min 1.000000 0.000000 1.000000 0.420000 0.000000 \n",
728 | "25% 223.500000 0.000000 2.000000 22.000000 0.000000 \n",
729 | "50% 446.000000 0.000000 3.000000 29.699118 0.000000 \n",
730 | "75% 668.500000 1.000000 3.000000 35.000000 1.000000 \n",
731 | "max 891.000000 1.000000 3.000000 80.000000 8.000000 \n",
732 | "\n",
733 | " Parch Fare \n",
734 | "count 891.000000 891.000000 \n",
735 | "mean 0.381594 32.204208 \n",
736 | "std 0.806057 49.693429 \n",
737 | "min 0.000000 0.000000 \n",
738 | "25% 0.000000 7.910400 \n",
739 | "50% 0.000000 14.454200 \n",
740 | "75% 0.000000 31.000000 \n",
741 | "max 6.000000 512.329200 "
742 | ]
743 | },
744 | "execution_count": 9,
745 | "metadata": {},
746 | "output_type": "execute_result"
747 | }
748 | ],
749 | "source": [
750 | "df.describe()"
751 | ]
752 | },
753 | {
754 | "cell_type": "code",
755 | "execution_count": 10,
756 | "metadata": {
757 | "colab": {
758 | "base_uri": "https://localhost:8080/",
759 | "height": 300
760 | },
761 | "colab_type": "code",
762 | "executionInfo": {
763 | "elapsed": 8059,
764 | "status": "ok",
765 | "timestamp": 1546957324366,
766 | "user": {
767 | "displayName": "Timothy Liu",
768 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
769 | "userId": "03413426750796061565"
770 | },
771 | "user_tz": -480
772 | },
773 | "id": "Ca4KtBwzmeoG",
774 | "outputId": "7cbbf65f-d284-441e-c3a6-a0a88bc35b8e"
775 | },
776 | "outputs": [
777 | {
778 | "name": "stdout",
779 | "output_type": "stream",
780 | "text": [
781 | "Survival ratio: 0.3838383838383838\n"
782 | ]
783 | },
784 | {
785 | "data": {
786 | "image/png": "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\n",
787 | "text/plain": [
788 | ""
789 | ]
790 | },
791 | "metadata": {
792 | "needs_background": "light"
793 | },
794 | "output_type": "display_data"
795 | }
796 | ],
797 | "source": [
798 | "ratio = df.Survived.sum()/df.Survived.count()\n",
799 | "print(\"Survival ratio:\", ratio)\n",
800 | "\n",
801 | "seaborn.countplot(x='Survived', data=df);"
802 | ]
803 | },
804 | {
805 | "cell_type": "markdown",
806 | "metadata": {
807 | "colab_type": "text",
808 | "id": "-kRnCezfnMeZ"
809 | },
810 | "source": [
811 | "### Let's guess: more females survived?"
812 | ]
813 | },
814 | {
815 | "cell_type": "code",
816 | "execution_count": 11,
817 | "metadata": {
818 | "colab": {
819 | "base_uri": "https://localhost:8080/",
820 | "height": 369
821 | },
822 | "colab_type": "code",
823 | "executionInfo": {
824 | "elapsed": 8336,
825 | "status": "ok",
826 | "timestamp": 1546957324649,
827 | "user": {
828 | "displayName": "Timothy Liu",
829 | "photoUrl": "https://lh4.googleusercontent.com/-dGSoF3PTUms/AAAAAAAAAAI/AAAAAAAAEjo/onM3a4Ivxls/s64/photo.jpg",
830 | "userId": "03413426750796061565"
831 | },
832 | "user_tz": -480
833 | },
834 | "id": "bcqRN18ZnH-y",
835 | "outputId": "40c060cc-9ef6-4500-fca9-79ba4d9072fb"
836 | },
837 | "outputs": [
838 | {
839 | "data": {
840 | "image/png": "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\n",
841 | "text/plain": [
842 | ""
843 | ]
844 | },
845 | "metadata": {
846 | "needs_background": "light"
847 | },
848 | "output_type": "display_data"
849 | }
850 | ],
851 | "source": [
852 | "seaborn.catplot(x='Sex', col='Survived', kind='count', data=df);"
853 | ]
854 | },
855 | {
856 | "cell_type": "code",
857 | "execution_count": null,
858 | "metadata": {
859 | "colab": {},
860 | "colab_type": "code",
861 | "id": "uGcm_1qhnJAg"
862 | },
863 | "outputs": [],
864 | "source": []
865 | }
866 | ],
867 | "metadata": {
868 | "colab": {
869 | "collapsed_sections": [],
870 | "name": "4 - EDA Titanic.ipynb",
871 | "provenance": [],
872 | "version": "0.3.2"
873 | },
874 | "kernelspec": {
875 | "display_name": "Python 3",
876 | "language": "python",
877 | "name": "python3"
878 | },
879 | "language_info": {
880 | "codemirror_mode": {
881 | "name": "ipython",
882 | "version": 3
883 | },
884 | "file_extension": ".py",
885 | "mimetype": "text/x-python",
886 | "name": "python",
887 | "nbconvert_exporter": "python",
888 | "pygments_lexer": "ipython3",
889 | "version": "3.6.7"
890 | }
891 | },
892 | "nbformat": 4,
893 | "nbformat_minor": 1
894 | }
895 |
--------------------------------------------------------------------------------
/day_3/Sample - Loading and Visualising NLP Data.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {
7 | "colab": {
8 | "base_uri": "https://localhost:8080/",
9 | "height": 34
10 | },
11 | "colab_type": "code",
12 | "executionInfo": {
13 | "elapsed": 2053,
14 | "status": "ok",
15 | "timestamp": 1547020080104,
16 | "user": {
17 | "displayName": "Soh Jun De",
18 | "photoUrl": "",
19 | "userId": "15246530694083866298"
20 | },
21 | "user_tz": -480
22 | },
23 | "id": "3c_NsS9gS8Vl",
24 | "outputId": "8f0ac2ac-168a-43df-fd0c-2571e40f162f"
25 | },
26 | "outputs": [
27 | {
28 | "name": "stderr",
29 | "output_type": "stream",
30 | "text": [
31 | "Using TensorFlow backend.\n"
32 | ]
33 | }
34 | ],
35 | "source": [
36 | "import csv\n",
37 | "import numpy as np\n",
38 | "import matplotlib.pyplot as plt\n",
39 | "\n",
40 | "import keras\n",
41 | "\n",
42 | "%matplotlib inline\n",
43 | "#%config InlineBackend.figure_format = 'retina'"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 2,
49 | "metadata": {
50 | "colab": {
51 | "base_uri": "https://localhost:8080/",
52 | "height": 51
53 | },
54 | "colab_type": "code",
55 | "executionInfo": {
56 | "elapsed": 9369,
57 | "status": "ok",
58 | "timestamp": 1547020087422,
59 | "user": {
60 | "displayName": "Soh Jun De",
61 | "photoUrl": "",
62 | "userId": "15246530694083866298"
63 | },
64 | "user_tz": -480
65 | },
66 | "id": "KdCxcCmwUFHG",
67 | "outputId": "8c01ebcd-0c8c-4810-f9cc-0c89285e1f1f"
68 | },
69 | "outputs": [
70 | {
71 | "name": "stdout",
72 | "output_type": "stream",
73 | "text": [
74 | "Downloading data from https://s3.amazonaws.com/text-datasets/imdb.npz\n",
75 | "17465344/17464789 [==============================] - 16s 1us/step\n"
76 | ]
77 | }
78 | ],
79 | "source": [
80 | "from keras.datasets import imdb\n",
81 | "\n",
82 | "(x_train, y_train), (x_test, y_test) = imdb.load_data(path=\"imdb.npz\", num_words=None,\n",
83 | " skip_top=0, maxlen=None,\n",
84 | " start_char=1, oov_char=2,\n",
85 | " index_from=3)"
86 | ]
87 | },
88 | {
89 | "cell_type": "code",
90 | "execution_count": 3,
91 | "metadata": {
92 | "colab": {
93 | "base_uri": "https://localhost:8080/",
94 | "height": 88
95 | },
96 | "colab_type": "code",
97 | "executionInfo": {
98 | "elapsed": 9354,
99 | "status": "ok",
100 | "timestamp": 1547020087423,
101 | "user": {
102 | "displayName": "Soh Jun De",
103 | "photoUrl": "",
104 | "userId": "15246530694083866298"
105 | },
106 | "user_tz": -480
107 | },
108 | "id": "DFpqExwBUYyd",
109 | "outputId": "cadf9037-e4fa-4714-f77b-f4f8a4a83ccb"
110 | },
111 | "outputs": [
112 | {
113 | "name": "stdout",
114 | "output_type": "stream",
115 | "text": [
116 | "Training set: (25000,) (25000,)\n",
117 | "Evaluation set: (25000,) (25000,)\n",
118 | "Example: [1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 22665, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 21631, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 19193, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 10311, 8, 4, 107, 117, 5952, 15, 256, 4, 31050, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 12118, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32] 1\n"
119 | ]
120 | }
121 | ],
122 | "source": [
123 | "print(\"Training set:\", x_train.shape, y_train.shape)\n",
124 | "print(\"Evaluation set:\", x_test.shape, y_test.shape)\n",
125 | "\n",
126 | "print(\"Example:\", x_train[0], y_train[0])"
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": 4,
132 | "metadata": {
133 | "colab": {},
134 | "colab_type": "code",
135 | "id": "yRFVdzD0TpY6"
136 | },
137 | "outputs": [],
138 | "source": [
139 | "def plot_distribution(data, labels):\n",
140 | " plt.style.use('ggplot')\n",
141 | " \n",
142 | " # distribution of text lengths\n",
143 | " lengths = np.array([len(row) for row in data])\n",
144 | " summary = \"mean: \"+str(int(np.mean(lengths)))+\" , min/max: \"+str(np.min(lengths))+\"/\"+str(np.max(lengths))+\" (95%: \"+ str(round(np.percentile(lengths, 95), 2)) + \")\"\n",
145 | " plt.figure(1, figsize=(10,6))\n",
146 | " plt.hist(lengths, bins='auto')\n",
147 | " plt.title(\"Distribution of text lengths\")\n",
148 | " plt.xlabel(\"Text Length: \" + summary); plt.ylabel(\"Examples\")\n",
149 | " plt.axvline(np.mean(lengths), ls=\"-\", color=\"k\")\n",
150 | " plt.axvline(np.percentile(lengths, 95), ls=\"--\", color=\"k\")\n",
151 | " plt.xlim(0, int(np.percentile(lengths, 99)))\n",
152 | " plt.show()\n",
153 | " \n",
154 | " # distribution of label counts\n",
155 | " labels = [str(label) for label in labels]\n",
156 | " plt.figure(2, figsize=(10,4))\n",
157 | " plt.hist(labels, bins='auto')\n",
158 | " plt.title(\"Distribution of labels\")\n",
159 | " plt.xlabel(\"Labels\"); plt.ylabel(\"Examples\")\n",
160 | " plt.show()"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 5,
166 | "metadata": {
167 | "colab": {
168 | "base_uri": "https://localhost:8080/",
169 | "height": 688
170 | },
171 | "colab_type": "code",
172 | "executionInfo": {
173 | "elapsed": 10386,
174 | "status": "ok",
175 | "timestamp": 1547020088465,
176 | "user": {
177 | "displayName": "Soh Jun De",
178 | "photoUrl": "",
179 | "userId": "15246530694083866298"
180 | },
181 | "user_tz": -480
182 | },
183 | "id": "5VNVKzXsVEBM",
184 | "outputId": "98baa8c2-086a-423e-dbfb-dc60602757a9"
185 | },
186 | "outputs": [
187 | {
188 | "data": {
189 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAGHCAYAAADfrgShAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xl8VNX9//H3TBYStpAFSINhCQkoKDsIqICQUtwtIi4FJELYKgq0dW0VRctWCFADCLII2P5AK4tilcYAscQlZanQKBABJRIJyUTWhCTk/P7gwXwJJGFAknsnvJ6Phw8z996587lzZpI359xzr8MYYwQAAACv4rS6AAAAAFw+QhwAAIAXIsQBAAB4IUIcAACAFyLEAQAAeCFCHAAAgBcixAHXiIkTJyo6OrpS9r1p0yY5HA5lZmaW+fhqW7p0qXx9fStl31fi4MGD6tOnj2rVqiWHw2F1ORVyOBxasWKF1WW4VfZnBajOCHGAFxs6dKgcDoccDod8fX0VEhKibt266eWXX5bL5Sq17e9//3t9/vnnHu87OjpaEydO9Gjb7t27KysrSxEREZdT/iVlZmbK4XBo06ZNpZY/9NBD+uGHH67qa/0cf/7zn5Wdna0dO3YoKyurzG1WrFhRaQGvMvd9NV3OZwrApRHiAC932223KSsrS99//70+/fRTxcfH6+9//7tat26tPXv2uLerXbu2wsLCrvrrFxYWyt/fX+Hh4XI6q+ZXSmBgoBo2bFglr+WJvXv3qkuXLoqJiVF4eLjV5QC4RhDiAC93LkBFRESodevWevzxx/Xll1+qZs2aGjVqlHu7C4dTMzMz9cADDygsLEyBgYGKiorS9OnTJUm9evXSt99+q5dfftnd03fgwAH30Nf69et16623KiAgQAsWLCh3SGz79u3q0qWLAgIC1Lp1a/3rX/9yryvvOb6+vlq6dKkkKTIyUpJ0++23y+FwqGnTppLKHk798MMP1bFjR9WoUUMNGjTQmDFjdPLkSff6oUOHKjY2VgsWLFCTJk1Ut25d3XfffTpy5EiF7+/x48c1cuRI1a9fXwEBAerUqZM2bNjgXu9wOPTJJ59o8eLFcjgcGjp06EX72LRpkwYPHuze/sLt/vrXv+r6669XQECAYmJi9Nprr6m4uFiSlJGRobp16yohIcG9/ddff61atWpp3rx5l9z3pZw4cUJPPfWUGjVqpJo1a6p9+/Z677333OsPHDggh8OhVatW6Z577lHNmjUVFRWl5cuXl9rP/v371bdvXwUEBKhx48ZKTExUr169NHz4cEnlf6bOP6YePXqoZs2aatWqlT7++ONS+//zn/+sqKgo1ahRQ/Xr19evfvUr5efne3ycQLVkAHitxx57zPTp06fMddOnTzcOh8NkZ2cbY4x56aWXTPPmzd3r77nnHtOnTx+zfft2s3//fpOcnGz+9re/GWOMyc3NNU2bNjW/+93vTFZWlsnKyjLFxcVm48aNRpJp2bKlWbt2rdm3b585ePCge/nBgweNMcb9ODo62rz//vsmPT3dPP744yYgIMBkZmaW2ubcc87x8fExS5YsMcYYs23bNiPJ/OMf/zBZWVnuY1myZInx8fFxP+e///2v8fHxMePGjTPp6enmww8/NJGRkWbQoEGl3qu6deuahx9+2OzcudNs2bLFNG7c2AwZMqTC93jAgAGmSZMm5qOPPjLp6enmySefNH5+fubrr782xhiTlZVlunXrZh599FGTlZVlfvrpp4v2cfr0afP6668bSe7389x2L730kmncuLF57733zL59+8z69etNZGSk+eMf/+h+/ooVK4y/v7/ZunWryc/PNzfddJPp37//JfddFklm+fLlxhhjSkpKTK9evUzPnj3Np59+ar799lvzxhtvGD8/P5OUlGSMMWb//v1GkmnWrJlZuXKl2bt3r3nmmWeMj4+P2bNnj3s/bdu2NV26dDFffPGF2b59u7njjjtM3bp1zbBhw4wxl/5MtWnTxvzzn/80e/bsMYMHDzZBQUEmLy/PGGPMP/7xD1OnTh2zbt06891335nt27ebhIQEc+rUqQrbDqjuCHGAF6soxP3zn/80kswXX3xhjLk4xLVp08a89NJL5e67efPmF60/9wd32bJlZS6/MMS9+eab7m2KiopM48aNzQsvvFDmc845P8QdPHjQSDIbN24stc2FIW7QoEGmc+fOpbZZs2aNcTgc5sCBA8aYs+9VWFiYKSgocG8zefJkEx4eXu57sHfvXiPJrF+/vtTy9u3bm7i4OPfjnj17usNKeZYvX24u/HfzyZMnTWBgoPnnP/9Zavlbb71lgoKCSi0bOnSoiYmJMUOHDjVNmjRxB5zy9l2e80Pcxo0bTY0aNS4KfXFxcea+++4zxvxfiJsxY4Z7fVFRkalVq5aZP3++McaYDRs2GElm79697m1yc3NNYGBgqfelos/UP/7xD/eyrKwsI8l89NFHxhhjZs6caWJiYkxhYaFHxwhcK+wzvQvAVWWMkaRyT3gfN26cRo4cqX/+85/q1auX7rrrLvXo0cOjfXfp0sWj7bp16+b+2dfXV126dFF6erpHz70c//vf/9S7d+9Sy3r27CljjNLT09WkSRNJ0g033KAaNWq4t2nUqJEOHz5c7n7P1Xrh+9KjRw999tlnV6Xu/Px8PfDAA6Xa6cyZMyooKNCRI0dUv359SdLrr7+um266ScuWLdO///1v1atX72e/flpamgoLC9WoUaNSywsLCxUTE1NqWbt27dw/+/r6qmHDhu73Lj09XWFhYaWG60NCQtSyZUuPazl//+Hh4fLx8XHvf+DAgZozZ46aNGmivn37qk+fPrr//vtVp04dzw8WqIYIcUA1tWvXLjkcDkVFRZW5Pi4uTv369dNHH32kjRs36o477tCvf/1rjy4/UatWrSuq6VywlOSeBHH+sjNnzqikpOSK9l1eWD1/ub+//0Xrzn99Txljrsps0HPH+s4776hFixYXrQ8JCXH/nJGRoUOHDsnhcCgjI6NUQP45rx8UFKS0tLSL1l34XpX13p3fVj/3/bhw/+fqk86G7W+++UYbN25UcnKyJk2apGeeeUZffPGF+7xJ4FrExAagGjp27JjmzZunPn36KDQ0tNztfvGLXyguLk7Lli3TokWL9Pbbb+vYsWOSzv5RPXPmzM+q4/xLmhQXFystLU033HCDJKlBgwaSpEOHDrm32bFjR6lQde4P+6XqaN26tTZv3lxq2ebNm+VwONSqVasrrr9169aSpJSUlFLLP/30U/c6T5V1LK1bt1ZAQID27dun6Ojoi/7z8fGRJJ06dUoPP/ywBgwYoISEBI0ZM0Z79+6tcN+e6NSpk3766ScVFBRc9NqNGzf2eD+tWrXSkSNHlJGR4V6Wl5dXanb0uTqv9DNVo0YN9evXT9OmTdPOnTt16tQprVmz5or2BVQX9MQBXq6wsFA//vijjDHKy8vT559/rmnTpun06dOaN29euc974okndOedd6ply5YqKCjQe++9p8jISPcQVbNmzbRlyxZ9//33qlmzZqleIU9NmTJF4eHhatasmWbOnKnDhw9r9OjRks5eM6xJkyaaOHGiEhISlJOTo+eff75Uj05YWJhq166tDRs2qHXr1qpRo4aCg4Mvep0//OEP6tChgyZMmKARI0bowIEDGjt2rH7zm99cVhi5UPPmzfXggw9qzJgxeuONN9SkSRPNmzdPu3bt0t/+9rfL2lezZs0kSevWrdOtt96qwMBA1a5dW88//7yef/55SdIvf/lLFRcXa+fOndq+fbumTp0qSRo7dqyKi4s1b9481alTR//617/08MMP67PPPpO/v3+5+76U3r17KzY2Vv3799fUqVPVtm1b5eXlKTU1VQEBAYqPj/fo2GJjY9W2bVsNGTJEs2fPlr+/v1544QX5+vqWas8r/UwtWrRIJSUl6tKli+rVq6dPPvlEx48f/1kBHagWrDsdD8DP9dhjjxlJRpLx8fEx9erVMzfffLN5+eWXjcvlKrXthRMbxowZY2JiYkxAQIAJCQkxd955p9m1a5d7fVpamunQoYMJCAgwksz+/fvLnYxQ3sSGtWvXmg4dOhh/f39zww03uE9UP+fzzz93v0abNm1MSkpKqYkNxpw9yb9p06bG19fXNGnSxBhz8cQGY4xZv369+7XCwsLMqFGjzIkTJ0q9VxdOAvFkQsDRo0fNiBEjTFhYmPH39zcdO3Y0H3/8caltPJnYYIwxTz31lGnQoIFxOBzmsccecy9/8803Tdu2bU2NGjVMvXr1TJcuXczcuXONMcasXLnS+Pv7m//85z/u7XNyckxERIQZP378Jfd9IZ03scEYY06dOmWeeeYZ07RpU+Pn52caNmxofvWrX5lPPvnEGPN/Exs+/fTTUvu5cJLCvn37TGxsrKlRo4a57rrrzOuvv246d+5snnjiCfc2l/OZOv9z8I9//MN069bN1KtXzwQGBprWrVuXmjQDXKscxlzBCSEAAFTg+PHjuu666/Tqq69q7NixVpcDVEsMpwIAfrZ169bJ19dXN9xwg7Kzs90X9R04cKDVpQHVFiEOAPCznTp1Sq+88ooOHDigWrVqqWPHjvr3v/9tq9ujAdUNw6kAAABeiEuMAAAAeCFCHAAAgBcixAEAAHiha2Ziw/lXhUf1EhYWppycnErZ94ABAyRJ7777bqXsH56pzDaG9Wjf6o82vjwREREebUdPHADAdpYuXaqlS5daXQZga4Q4AIDtfPDBB/rggw+sLgOwNUIcAACAFyLEAQAAeCFCHAAAgBcixAEAAHiha+YSIwAA78FlfYBLoycOAADACxHiAAC2M3/+fM2fP9/qMgBbI8QBAGwnKSlJSUlJVpcB2BohDgAAwAsR4gAAALwQIQ4AAMALcYkRSJLOxN9b5nKfheuquBIAkAICAqwuAbA9QhwAwHZWrFhhdQmA7TGcCgAA4IUIcQAA20lISFBCQoLVZQC2RogDANjOli1btGXLFqvLAGyNEAcAAOCFCHEAAABeiBAHAADghbjECADAdoKDg60uAbA9QhwAwHYWLlxodQmA7RHiUKHy7uQgcTcHAACsxDlxAADbmTx5siZPnmx1GYCt0RMHALCdrVu3Wl0CYHv0xAEAAHghQhwAAIAXIsQBAAB4Ic6JAwDYzi9+8QurSwBsjxAHALCdv/71r1aXANhelYS4uXPnatu2bQoKCtKMGTMkSQkJCTp06JAk6dSpU6pZs6amT5+u7OxsjR8/XhEREZKkmJgYjRgxQpK0b98+JSYmqrCwUO3bt1dcXJwcDkdVHAIAAICtVEmI69Wrl/r166fExET3svHjx7t/XrZsmWrWrOl+HB4erunTp1+0n4ULF2rkyJGKiYnR5MmTtWPHDrVv375yiwcAVLkXX3xRkvTKK69YXAlgX1UysaFVq1aqXbt2meuMMfrss890yy23VLiPvLw85efnq0WLFnI4HOrRo4fS0tIqo1wAgMXS09OVnp5udRmArVl+TtzXX3+toKCgUiexZmdn6+mnn1ZgYKAefvhh3XDDDXK5XAoNDXVvExoaKpfLVe5+k5KSlJSUJEmaMmWKwsLCKu8gqoHDV/Acu7ynvr6+lVaLn5+fJPsc67WqMtsY1iurffnuVS98hyuH5SFuy5YtpXrhgoODNXfuXNWpU0f79u3T9OnTNWPGDBljLmu/sbGxio2NdT/Oycm5ajXjLLu8p2FhYZVWS1FRkST7HOu1qjLbGNYrq3357lUvfIcvz7l5AZdi6XXizpw5oy+//FLdu3d3L/Pz81OdOnUkSVFRUWrYsKGysrIUGhqq3Nxc93a5ubkKCQmp8poBAADswNIQt3PnTkVERJQaJj127JhKSkokSYcPH1ZWVpYaNmyo4OBgBQYGas+ePTLGKCUlRZ06dbKqdABAJYqKilJUVJTVZQC2ViXDqbNmzVJ6erqOHz+uUaNGaeDAgerdu/dFQ6nS2ZNZV61aJR8fHzmdTsXHx7snRQwfPlxz585VYWGh2rVrx8xUAKimpk2bZnUJgO1VSYgbN25cmct/+9vfXrSsa9eu6tq1a5nbN2/e3H2dOQAAgGsZ904FANjO008/raefftrqMgBbs3x2KgAAF9q3b5/VJQC2R08cAACAFyLEAQAAeCFCHAAAgBfinDgAgO20atXK6hIA2yPEAQBs55VXXrG6BMD2GE4FAADwQoQ4AIDtjB07VmPHjrW6DMDWGE4FANhOVlaW1SUAtkdPHAAAgBcixAEAAHghQhwAAIAX4pw4AIDtdOzY0eoSANsjxAEAbOe5556zugTA9hhOBQAA8EKEOACA7cTHxys+Pt7qMgBbYzgVAGA7eXl5VpcA2B49cQAAAF6IEAcAAOCFCHEAAABeiHPiAAC2c8stt1hdAmB7hDgAgO2MHz/e6hIA22M4FQAAwAsR4gAAtjNo0CANGjTI6jIAW2M4FQBgOwUFBVaXANgePXEAAABeiBAHAADghQhxAAAAXohz4gAAthMbG2t1CYDtEeIAALYzatQoq0sAbI/hVAAAAC9UJT1xc+fO1bZt2xQUFKQZM2ZIklatWqVPPvlEdevWlSQ98sgj6tChgyRp9erVSk5OltPpVFxcnNq1aydJ2rdvnxITE1VYWKj27dsrLi5ODoejKg4BAFCFBgwYIEl69913La4EsK8qCXG9evVSv379lJiYWGr5XXfdpXvvvbfUsszMTKWmpmrmzJnKy8vTpEmTNHv2bDmdTi1cuFAjR45UTEyMJk+erB07dqh9+/ZVcQgAAAC2UiXDqa1atVLt2rU92jYtLU3du3eXn5+fGjRooPDwcGVkZCgvL0/5+flq0aKFHA6HevToobS0tEquHAAAwJ4sndjw8ccfKyUlRVFRURoyZIhq164tl8ulmJgY9zYhISFyuVzy8fFRaGioe3loaKhcLle5+05KSlJSUpIkacqUKQoLC6u8A6kGDl/Bc+zynvr6+lZaLX5+fpLsc6zXqspsY1ivrPblu1e98B2uHJaFuL59+7rPeVi5cqWWLVumMWPGyBhT5vblLS9PbGxsqSnqOTk5V14symSX9zQsLKzSaikqKpJkn2O9VlVmG8N6ZbUv373qhe/w5YmIiPBoO8tmp9arV09Op1NOp1N9+vTRt99+K+lsD1tubq57O5fLpZCQkIuW5+bmKiQkpMrrBgBUvrvvvlt333231WUAtmZZiMvLy3P//OWXXyoyMlKS1KlTJ6WmpqqoqEjZ2dnKyspSdHS0goODFRgYqD179sgYo5SUFHXq1Mmq8gEAlWjo0KEaOnSo1WUAtlYlw6mzZs1Senq6jh8/rlGjRmngwIH63//+pwMHDsjhcKh+/foaMWKEJCkyMlLdunXThAkT5HQ6NWzYMDmdZ7Pm8OHDNXfuXBUWFqpdu3bMTAWAaio/P1+SFBgYaHElgH1VSYgbN27cRct69+5d7vb9+/dX//79L1revHlz93XmAADV1+DBgyVxnTigItx2C1fsTPy9ZS73WbiuiisBAODaw223AAAAvBAhDgAAwAsR4gAAALwQ58QBAGznwQcftLoEwPYIcQAA23nooYesLgGwPYZTAQC243K5Krw/NgB64gAANnTuAvBcJw4oHz1xAAAAXogQBwAA4IUIcQAAAF6IEAcAAOCFmNgAALCdwYMHW10CYHuEOACA7dx3331WlwDYHsOpAADb+eGHH/TDDz9YXQZga/TEAQBs56mnnpLEdeKAitATBwAA4IUIcQAAAF6IEAcAAOCFCHEAAABeiIkNAADbGTFihNUlALZHiAMA2E7fvn2tLgGwPYZTAQC2k5GRoYyMDKvLAGyNnjgAgO08++yzkrhOHFAReuIAAAC8ECEOAADACxHiAAAAvBAhDgAAwAsxsQEAYDtPPvmk1SUAtkeIAwDYTo8ePawuAbA9hlMBALaza9cu7dq1y+oyAFujJw5X3Zn4e8td57NwXRVWAsBbTZw4URLXiQMqUiUhbu7cudq2bZuCgoI0Y8YMSdLy5cu1detW+fr6qmHDhhozZoxq1aql7OxsjR8/XhEREZKkmJgY9z309u3bp8TERBUWFqp9+/aKi4uTw+GoikMAAACwlSoJcb169VK/fv2UmJjoXtamTRs9+uij8vHx0YoVK7R69WoNGjRIkhQeHq7p06dftJ+FCxdq5MiRiomJ0eTJk7Vjxw61b9++Kg4BAADAVqrknLhWrVqpdu3apZa1bdtWPj4+kqQWLVrI5XJVuI+8vDzl5+erRYsWcjgc6tGjh9LS0iqtZgAAADuzxTlxycnJ6t69u/txdna2nn76aQUGBurhhx/WDTfcIJfLpdDQUPc2oaGhlwx+KK2ic9UAAIB3sTzEvffee/Lx8dFtt90mSQoODtbcuXNVp04d7du3T9OnT9eMGTNkjLms/SYlJSkpKUmSNGXKFIWFhV312r3NYasLkCqlHXx9fSutff38/CRVTt3wXGW2MaxXVvtOnjxZEt+96oLvcOWwNMRt2rRJW7du1YsvvuieoODn5+f+wxkVFaWGDRsqKytLoaGhys3NdT83NzdXISEh5e47NjZWsbGx7sc5OTmVdBS4HJXRDmFhYZXWvkVFRZL4/FitMtsY1iurfWNiYiTx3asu+A5fnnOTOy/FsuvE7dixQ2vXrtUzzzyjGjVquJcfO3ZMJSUlkqTDhw8rKytLDRs2VHBwsAIDA7Vnzx4ZY5SSkqJOnTpZVT4AoBKlpaVx3jNwCVXSEzdr1iylp6fr+PHjGjVqlAYOHKjVq1eruLhYkyZNkvR/lxJJT0/XqlWr5OPjI6fTqfj4ePekiOHDh2vu3LkqLCxUu3btmJkKANXU1KlTJXGdOKAiVRLixo0bd9Gy3r17l7lt165d1bVr1zLXNW/e3H2dOQAAgGsZt90CAADwQoQ4AAAAL0SIAwAA8EKWXycOAIALTZw40eoSANsjxAEAbOfGG2+0ugTA9hhOBQDYTkpKilJSUqwuA7A1euIAALYzZ84cSVKPHj0srgSwL0IcqtSZ+HvLXeezcF0VVgIAgHdjOBUAAMALEeIAAAC8ECEOAADAC3FOHADAdqZMmWJ1CYDtEeIAALYTHR1tdQmA7TGcCgCwnQ0bNmjDhg1WlwHYmsch7oMPPtCBAwckSXv27NHo0aP1xBNPaM+ePZVVGwDgGrVgwQItWLDA6jIAW/M4xK1fv14NGjSQJP3973/X3Xffrf79+2vp0qWVVRsAAADK4XGIO3XqlGrWrKn8/HwdOHBAd9xxh3r37q1Dhw5VZn0AAAAog8cTG0JDQ7V7924dPHhQN9xwg5xOp06dOiWnk9PqAAAAqprHIW7QoEGaOXOmfH199bvf/U6StG3bNmYQAQAAWMDjENehQwe98cYbpZZ17dpVXbt2vepFAQCubbNnz7a6BMD2Lus6cZmZmfr888919OhRDRs2TIcPH1ZxcbGaNGlSWfUBAK5BjRo1sroEwPY8PqHts88+00svvSSXy6WUlBRJUkFBgZYtW1ZpxQEArk1r167V2rVrrS4DsDWPe+JWrVqlP/3pT2ratKk+++wzSVKTJk3c144DAOBqWb58uSTpvvvus7gSwL487ok7evToRcOmDodDDofjqhcFAACAinkc4qKiotzDqOds2bKF2akAAAAW8Hg4NS4uTq+++qqSk5N1+vRpvfbaazp06JD++Mc/VmZ9AAAAKIPHIa5Ro0aaNWuWtm7dqo4dOyo0NFQdO3ZUQEBAZdYHAACAMlzWJUZq1Kih7t27V1YtAABIkhYsWGB1CYDtVRjiXnzxRY8mLrz88stXrSAAAEJCQqwuAbC9CkNc7969q6oOAADcVq5cKUl66KGHLK4EsK8KQ1yvXr2qqAwAAP7PO++8I4kQB1Tkss6JS05O1pYtW5SXl6fg4GDdcsstuv3227lWHAAAQBXzOMStWLFCaWlpuuuuuxQWFqacnBy9//77OnTokAYNGlSZNQIAAOACHoe4TZs2aerUqQoNDXUv69Chg5555plLhri5c+dq27ZtCgoK0owZMyRJJ06cUEJCgo4cOaL69etr/Pjxql27tiRp9erVSk5OltPpVFxcnNq1aydJ2rdvnxITE1VYWKj27dsrLi6OXkAAAHBN8viODYGBgQoMDLxoWc2aNS/53F69eun5558vtWzNmjW66aabNGfOHN10001as2aNJCkzM1OpqamaOXOmXnjhBS1atEglJSWSpIULF2rkyJGaM2eOfvzxR+3YscPT8gEAAKoVj0PcnXfeqb/85S/66quvlJmZqf/+97+aOXOm7rrrLh0+fNj9X1latWrl7mU7Jy0tTT179pQk9ezZU2lpae7l3bt3l5+fnxo0aKDw8HBlZGQoLy9P+fn5atGihRwOh3r06OF+DgCgelm+fLmWL19udRmArXk8nLp06VJJ0v/+979Sy3ft2qUlS5a4H5+bFn4pR48eVXBwsCQpODhYx44dkyS5XC7FxMS4twsJCZHL5ZKPj0+podzQ0FC5XK5y95+UlKSkpCRJ0pQpUxQWFuZRXdVZ2RHbPq60jXx9fSutff38/CRdeW24OiqzjWE92rf6o40rh8chztNw9nMZYy5reXliY2MVGxvrfpyTk/Oz6kLlu9I2OjfRpjIUFRVJ4vNjtcpsY1ivrPY913EwdOjQqi8IVx3f4csTERHh0XYeD6debUFBQcrLy5Mk5eXlqW7dupLO9rDl5ua6t3O5XAoJCbloeW5uLlf0BoBq6oMPPtAHH3xgdRmArXncE5eTk6N33nlHBw4cUEFBQal1s2fPvuwX7tSpkzZv3qz7779fmzdvVufOnd3L58yZo7vvvlt5eXnKyspSdHS0nE6nAgMDtWfPHsXExCglJUX9+vW77NeFfZ2Jv7fM5T4L11VxJQAA2J/HIW7mzJmKiIjQwIED5e/vf1kvMmvWLKWnp+v48eMaNWqUBg4cqPvvv18JCQlKTk5WWFiYJkyYIEmKjIxUt27dNGHCBDmdTg0bNkxO59kOw+HDh2vu3LkqLCxUu3bt1L59+8uqAwAAoLrwOMT98MMPevXVV92B6nKMGzeuzOUvvvhimcv79++v/v37X7S8efPm7uvMAQAAXMt9xqDEAAAgAElEQVQ8TmQdO3ZUenp6ZdYCAAAAD3ncE/f444/rj3/8oxo2bKigoKBS68aMGXPVCwMAXLveffddq0sAbM/jEDd37lw5nU41atToss+JAwAAwNXlcYjbtWuX3njjjYtuvQUAwNU2f/58SdKoUaMsrgSwL4/PiWvSpImOHz9embUAACCp9F13AJTN45641q1b67XXXlOvXr0uOieud+/eV70wAAAAlM/jELd7926FhIToq6++umgdIQ4AAKBqeRziXnrppcqsAwAAAJfB4xB3PmNMqRvSX8kFgAEAKE9AQIDVJQC253GIc7lcWrRokb7++mudPHmy1LqVK1de9cIAANeuFStWWF0CYHsed6EtWLBAvr6+evHFFxUQEKCpU6eqU6dOio+Pr8z6AAAAUAaPQ9yePXs0evRoNW3aVA6HQ02bNtXo0aP1wQcfVGZ9AIBrUEJCghISEqwuA7A1j0Oc0+mUj4+PJKlWrVo6duyYatSoIZfLVWnFAQCuTVu2bNGWLVusLgOwNY/PiYuOjtb27dvVpUsXtW3bVgkJCfL391fz5s0rsz4AAACUweMQN3bsWPeM1KFDh+r9999Xfn6+7rrrrkorDgAAAGXzOMTVqlXL/bO/v78eeOABSVJxcfHVrwoAAAAV8vicuEmTJikvL6/Usu+++07PPffcVS8KAHBtCw4OVnBwsNVlALbmcU9cs2bN9Ic//EGPP/64unXrprVr12rt2rV65JFHKrM+AMA1aOHChVaXANiexyFu0KBB6tixo15//XW9/fbbCg4O1uTJkxUeHl6Z9QEAAKAMl3XbrezsbOXn56thw4Y6ffq0CgsLK6suwO1M/L3lrvNZuK4KKwFQVSZPnixJnLIDVMDjEDdz5kx9//33ev755xUdHa2PPvpIL730kn7961/r3nvL/yMLAMDl2rp1q9UlALbn8cSGunXratq0aYqOjpYk9evXT6+99pq++OKLSisOAAAAZbtkiFu8eLEkafjw4fL391dycrJ7XUREBLOHAAAALHDJELd58+ZSj5cvX17q8c6dO69uRQAAALikS54Td+4uDVe6HgCAy/WLX/zC6hIA27tkiHM4HD9rPQAAl+uvf/2r1SUAtnfJEHfmzBnt2rXL/bikpOSixwAAAKhalwxxQUFBmjdvnvtx7dq1Sz2uW7du5VQGALhmvfjii5KkV155xeJKAPu6ZIhLTEysijoAAHBLT0+3ugTA9jy+ThwAAADs47JuuwXYzZn4e3W4jOXcjgsAUN3REwcAAOCFLO2JO3TokBISEtyPs7OzNXDgQJ08eVKffPKJe9LEI488og4dOkiSVq9ereTkZDmdTsXFxaldu3aW1A4AqDxRUVFWlwDYnqUhLiIiQtOnT5d09lIlI0eOVJcuXbRx40bddddduvfee0ttn5mZqdTUVM2cOVN5eXmaNGmSZs+eLaeTDkUAqE6mTZtmdQmA7dkm/ezcuVPh4eGqX79+udukpaWpe/fu8vPzU4MGDRQeHq6MjIwqrBIAAMAebDOxYcuWLbrlllvcjz/++GOlpKQoKipKQ4YMUe3ateVyuRQTE+PeJiQkRC6Xy4pyAQCV6Omnn5ZEjxxQEVuEuOLiYm3dulWPPvqoJKlv374aMGCAJGnlypVatmyZxowZc1n3aU1KSlJSUpIkacqUKQoLC7v6hXuZsmZxVldXq739/Pyu6v5wZXx9fWmDaqys9j148KAkvnvVBd/hymGLELd9+3Y1a9ZM9erVkyT3/yWpT58+mjp1qiQpNDRUubm57nUul0shISFl7jM2NlaxsbHuxzk5OZVROmzqarV3UVHRVd0frkxYWBhtUI2V1b5896oXvsOXJyIiwqPtbHFO3IVDqXl5ee6fv/zyS0VGRkqSOnXqpNTUVBUVFSk7O1tZWVmKjo6u8noBAACsZnlP3OnTp/XVV19pxIgR7mUrVqzQgQMH5HA4VL9+ffe6yMhIdevWTRMmTJDT6dSwYcOYmQoAAK5Jloe4GjVqaPHixaWWjR07ttzt+/fvr/79+1d2WQAAC7Vq1crqEgDbszzEAQBwoVdeecXqEgDbYywSAADACxHiAAC2M3bs2ApPrQHAcCoAwIaysrKsLgGwPXriAAAAvBAhDgAAwAsR4gAAALwQ58ShWjoTf2+563wWrqvCSgBciY4dO1pdAmB7hLhqpqLwAgDe4rnnnrO6BMD2GE4FAADwQoQ4AIDtxMfHKz4+3uoyAFtjOBUAYDt5eXlWlwDYHj1xAAAAXogQBwAA4IUIcQAAAF6Ic+IAALZzyy23WF0CYHuEOFxzuBAwYH/jx4+3ugTA9hhOBQAA8EKEOACA7QwaNEiDBg2yugzA1hhOBQDYTkFBgdUlALZHTxwAAIAXIsQBAAB4IUIcAACAF+KcOACA7cTGxlpdAmB7hDjgPBdeQ87s3m1RJcC1bdSoUVaXANgew6kAAABeiBAHALCdAQMGaMCAAVaXAdgaIQ4AAMALEeIAAAC8ECEOAADACzE7tYpcOOvxHJ+F66q4EgAAUB0Q4gAAtnP33XdbXQJge4Q4AIDtDB061OoSANuzPMT99re/VUBAgJxOp3x8fDRlyhSdOHFCCQkJOnLkiOrXr6/x48erdu3akqTVq1crOTlZTqdTcXFxateuncVHgGtBecPhl8JwOXBl8vPzJUmBgYEWVwLYl+UhTpJeeukl1a1b1/14zZo1uummm3T//fdrzZo1WrNmjQYNGqTMzEylpqZq5syZysvL06RJkzR79mw5nczPAIDqZPDgwZKkd9991+JKAPuyZfpJS0tTz549JUk9e/ZUWlqae3n37t3l5+enBg0aKDw8XBkZGVaWCgAAYAlb9MS99tprkqRf/vKXio2N1dGjRxUcHCxJCg4O1rFjxyRJLpdLMTEx7ueFhITI5XKVuc+kpCQlJSVJkqZMmaKwsLDKPIRLOlzO8iut6/Cvu195MagyVn/uqgtfX1/ey2qsrPb18/OTxHeouuA7XDksD3GTJk1SSEiIjh49qldffVURERHlbmuM8Xi/sbGxio2NdT/Oycn5WXVWlorqutLzsGAfdv3ceZuwsDDey2qsrPYtKiqSxHeouuA7fHkqykLnszzEhYSESJKCgoLUuXNnZWRkKCgoSHl5eQoODlZeXp77fLnQ0FDl5ua6n+tyudzP91YENQAAcCUsPSeuoKDAPQOpoKBAX331lRo3bqxOnTpp8+bNkqTNmzerc+fOkqROnTopNTVVRUVFys7OVlZWlqKjoy2rHwBQOR588EE9+OCDVpcB2JqlPXFHjx7VX/7yF0nSmTNndOutt6pdu3Zq3ry5EhISlJycrLCwME2YMEGSFBkZqW7dumnChAlyOp0aNmwYM1MBoBp66KGHrC4BsD2HuZwTzbzYoUOHLH19hk2908DPd0uSVnVteUXP5zpxVwfn01RvZbXvuUlr3n7KDM7iO3x5vOacOAAALjRixAhJXCcOqAgh7iqitw0AAFQVTigDAADwQvTEAZWovN5ZzpUDAPxc9MQBAAB4IXriAAC2M3jwYKtLAGyPEAcAsJ377rvP6hIA22M4FQBgOz/88IN++OEHq8sAbI2eOACA7Tz11FOSuE4cUBF64gAAALwQIQ4AAMALEeIAAAC8ECEOAADACzGxAQBgOyNGjLC6BMD2CHEAANvp27ev1SUAtkeIAyxQ3j1VJe6rCkhSRkaGJCk6OtriSgD7IsQBAGzn2WeflcR14oCKMLEBAADAC9ETB9hMeUOtDLMCAM5HTxwAAIAXoicO8BJMhgAAnI8QB1QDBDxUN08++aTVJQC2R4gDANhOjx49rC4BsD1CHFDNMVEC3mjXrl2SpBtvvNHiSgD7IsQBAGxn4sSJkrhOHFARZqcCAAB4IUIcAACAFyLEAQAAeCFCHAAAgBdiYgMAwHaeeeYZq0sAbI8QB1yjuEAw7Kxz585WlwDYHiEOwEUIeLBaWlqaJMIcUBFLQ1xOTo4SExP1008/yeFwKDY2VnfeeadWrVqlTz75RHXr1pUkPfLII+rQoYMkafXq1UpOTpbT6VRcXJzatWtn5SEAACrB1KlTJXGdOKAiloY4Hx8fDR48WFFRUcrPz9ezzz6rNm3aSJLuuusu3Xtv6d6AzMxMpaamaubMmcrLy9OkSZM0e/ZsOZ3MzwAAANcWS0NccHCwgoODJUmBgYFq1KiRXC5XudunpaWpe/fu8vPzU4MGDRQeHq6MjAy1aNGiqkoGUA6GYAGgatnmnLjs7Gzt379f0dHR+uabb/Txxx8rJSVFUVFRGjJkiGrXri2Xy6WYmBj3c0JCQsoNfUlJSUpKSpIkTZkyRWFhYZV+DIcr/RUA61UU1srzc79/vr6+VfIdhjXKal8/Pz9JP/+zA3vgO1w5bBHiCgoKNGPGDA0dOlQ1a9ZU3759NWDAAEnSypUrtWzZMo0ZM0bGGI/3GRsbq9jYWPfjnJycq143AM/83O9fWFgY3+FqrKz2LSoqksTv7uqC7/DliYiI8Gg7y0NccXGxZsyYodtuu00333yzJKlevXru9X369HGf4BoaGqrc3Fz3OpfLpZCQkKotGABQ6SZOnGh1CYDtWTojwBij+fPnq1GjRrr77rvdy/Py8tw/f/nll4qMjJQkderUSampqSoqKlJ2draysrIUHR1d5XUDACrXjTfeqBtvvNHqMgBbs7Qnbvfu3UpJSVHjxo31hz/8QdLZy4ls2bJFBw4ckMPhUP369TVixAhJUmRkpLp166YJEybI6XRq2LBhzEwFvEB559Ex4QHlSUlJkST16NHD4koA+7I0xF1//fVatWrVRcvPXROuLP3791f//v0rsywAgMXmzJkjiRAHVIRuLAAAAC9EiAMAAPBChDgAAAAvRIgDAADwQpZfJw4AynL+jFZP74bCbNfqY8qUKVaXANgeIe4KXMlthwAAnuMaoMClMZwKALCdDRs2aMOGDVaXAdgaPXEALEOvNsqzYMECSVLfvn0trgSwL0IcgGqjolDI+XIAqhtCHIBrHrcFA+CNCHEArgkM3QKobghxAHAF6L0DYDVCHADAdmbPnm11CYDtEeIAoBwMwVqnUaNGVpcA2B4hDgCqCLNnPbd27VpJ0n333WdxJYB9EeIAALazfPlySYQ4oCKEOAC4iq50CJaJEgAuF7fdAgAA8EL0xAFANcO5d8C1gZ44AAAAL0RPHADYWFVe5sRO5+UtWLCgyl8T8DaEOACA7YSEhFhdAmB7hDgAQKX4OT17K1eulCQ99NBDV7UmoDohxAEAKnS1J0pcuL/DZezvnXfekUSIAypCiAOAa4i33kqMGbfAxQhxAIAr5q2hEKgOCHEAANs4FwrN7t2lHnvynLLQS4fqjBAHAKi27HTZFOBqI8QBAGznrc4xlr32lQwRVxQKCZKoLIS4cnCeBwBYJ9Cncm8odLV/x1/J/ip71u/P3R/sjxAHALCdZd9lS5KGNGlgcSXWqMqQeTUDI2GxahHiAAC280FWnqRrN8RVpasZGMvb1+Eyl/48BEYvDXE7duzQkiVLVFJSoj59+uj++++3uiQAAFCFquq0p6sdFq9mr6jXhbiSkhItWrRIf/zjHxUaGqrnnntOnTp10nXXXXfZ++K8NwAAUJGqzAru11r/H4+2r9wzRytBRkaGwsPD1bBhQ/n6+qp79+5KS0uzuiwAAIAq5XUhzuVyKTQ01P04NDRULpfLwooAAACqntcNpxpjLlrmcDguWpaUlKSkpCRJ0pQpUxQREXHxzjzsrsS16zOrCwCuUXz3gEvzup640NBQ5ebmuh/n5uYqODj4ou1iY2M1ZcoUTZkyRc8++2xVlogqRvtWf7Rx9Ub7Vn+0ceXwuhDXvHlzZWVlKTs7W8XFxUpNTVWnTp2sLgsAAKBKed1wqo+Pjx5//HG99tprKikp0e23367IyEirywIAAKhSXhfiJKlDhw7q0KGDx9vHxsZWYjWwGu1b/dHG1RvtW/3RxpXDYcqaKQAAAABb87pz4gAAAOClw6me4vZc3i8nJ0eJiYn66aef5HA4FBsbqzvvvFMnTpxQQkKCjhw5ovr162v8+PGqXbu2JGn16tVKTk6W0+lUXFyc2rVrZ/FRwBMlJSV69tlnFRISomeffZY2rkZOnjyp+fPn6+DBg3I4HBo9erQiIiJo32rkgw8+UHJyshwOhyIjIzVmzBgVFhbSxpXNVFNnzpwxTzzxhPnxxx9NUVGR+f3vf28OHjxodVm4TC6Xy3z77bfGGGNOnTplnnzySXPw4EGzfPlys3r1amOMMatXrzbLly83xhhz8OBB8/vf/94UFhaaw4cPmyeeeMKcOXPGsvrhuffff9/MmjXLTJ482RhjaONq5K9//atJSkoyxhhTVFRkTpw4QftWI7m5uWbMmDHm9OnTxhhjZsyYYTZu3EgbV4FqO5zK7bmqh+DgYEVFRUmSAgMD1ahRI7lcLqWlpalnz56SpJ49e7rbNi0tTd27d5efn58aNGig8PBwZWRkWFY/PJObm6tt27apT58+7mW0cfVw6tQpff311+rdu7ckydfXV7Vq1aJ9q5mSkhIVFhbqzJkzKiwsVHBwMG1cBartcGpZt+fau3evhRXh58rOztb+/fsVHR2to0ePui/yHBwcrGPHjkk62+4xMTHu54SEhHBbNi+wdOlSDRo0SPn5+e5ltHH1kJ2drbp162ru3Ln67rvvFBUVpaFDh9K+1UhISIjuuecejR49Wv7+/mrbtq3atm1LG1eBatsTZzy8PRe8Q0FBgWbMmKGhQ4eqZs2a5W5XVrvD3rZu3aqgoCB3j+ul0Mbe5cyZM9q/f7/69u2radOmqUaNGlqzZk2529O+3ufEiRNKS0tTYmKi3njjDRUUFCglJaXc7Wnjq6fa9sR5ensu2F9xcbFmzJih2267TTfffLMkKSgoSHl5eQoODlZeXp7q1q0r6eJ2d7lcCgkJsaRueGb37t36z3/+o+3bt6uwsFD5+fmaM2cObVxNhIaGKjQ01N3z0rVrV61Zs4b2rUZ27typBg0auNvw5ptv1p49e2jjKlBte+K4PVf1YIzR/Pnz1ahRI919993u5Z06ddLmzZslSZs3b1bnzp3dy1NTU1VUVKTs7GxlZWUpOjraktrhmUcffVTz589XYmKixo0bpxtvvFFPPvkkbVxN1KtXT6GhoTp06JCks3/wr7vuOtq3GgkLC9PevXt1+vRpGWO0c+dONWrUiDauAtX6Yr/btm3TW2+95b49V//+/a0uCZfpm2++0YsvvqjGjRu7h8MfeeQRxcTEKCEhQTk5OQoLC9OECRPcU9ffe+89bdy4UU6nU0OHDlX79u2tPARchv/97396//339eyzz+r48eO0cTVx4MABzZ8/X8XFxWrQoIHGjBkjYwztW42sWrVKqamp8vHxUdOmTTVq1CgVFBTQxpWsWoc4AACA6qraDqcCAABUZ4Q4AAAAL0SIAwAA8EKEOAAAAC9EiAMAAPBChDjABjZs2KBJkyZZXQbKkZiYqLVr11pdBsrx4Ycf6u2337a6DNtKTU1VYmKi1WWgElTbOzbAewwePNj9c2FhoXx9feV0nv33xYgRI3Tbbbdd0X4LCws1aNAgzZs3r9R9dM+3YcMGffHFF/rTn/50Ra9xJX744Qf97ne/0//7f/+vyl7TLhYvXqzt27fr6NGjCg0N1QMPPKBbb71V0tmrts+YMUOHDh2SMUaRkZEaMmSI+0r/JSUl+tvf/qZPP/1Up0+fVlRUlIYPH66IiIhKr/u3v/3tFT3n5ZdfVlhYWCVUdPlycnL05ptv6ttvv9XRo0e1YMEC1atXz73+008/1UcffaQDBw6oVatWeuGFFy7aR3Jysr755hvdc889evvtt7V3716VlJSoRYsWiouLU3h4eKntjTF68cUXtXfv3lKf9++//16LFi3SgQMHVK9ePT322GPq0KHDRa/3t7/9TWvWrNErr7yi66+/vszjKiws1Nq1azVt2jT3ss8//1wrV65UTk6OmjVrplGjRrk/Jxs2bNDixYvl5+fn3v5Pf/qTWrRoIUl68803tWXLFkVGRmrChAnu9yg5OVmHDh3SoEGDLvleny8jI0NvvfWWDhw4oMDAQA0YMEB9+/aVJK1YsULbt29XZmamHnnkEd1///2lnrtp0yatXLlSJ06cULt27TR69Ohybzv4448/au7cudq3b58aNGig4cOHq1WrVpLO3iVj5cqVOnToUJV8X1B16ImD5ZYvX+7+LywsTM8884z78ZUGONhTzZo19dxzz2np0qUaOXKkFi5cqH379kmSatWqpd/+9rdatGiRlixZojvuuEPTpk1z32fx008/VWpqql599VUtWrRITZo00dy5c608nHJ9//33CggIsE2AkySn06kOHTpo/PjxZa6vU6eO7rnnnlJ3RrnQ9u3b1aFDB508eVJdu3bV7NmztXDhQkVGRmrGjBkXbX/uYq7nKyoq0tSpU9WtWzctWbJEcXFxSkhIUHZ2dqntMjMztX37dtWpU6fC4/r888/VrFkzBQUFSZIOHjyoefPmacyYMVq6dKluvPFGTZ8+XSUlJe7ntG7dutTvnXMBLj09XVlZWVq4cKGaNm2qdevWSZKOHz+ujz/+WAMGDKiwlgvl5eVp8uTJuuOOO7RkyRLNmjVLrVu3dq+PiIjQ4MGD1aZNm4ueu3//fi1ZskTjx4/XggULZIzRkiVLyn2tmTNn6vrrr9fixYvVv39/TZ8+XSdPnpR0tu27deumpKSky6of9kdPHGyvpKRE7733njZt2qT8/Hy1bdtWw4YNU61atbRp0yatXr1aU6dOVUBAgL788kstXrxYf/nLX/Taa69JksaNGydJGjt2rLp06eLx6544cUJLly7Vf//7X/n6+qp379564IEH5HQ6tWHDBn3++ee67rrrlJKSojp16ig+Pt79y/jHH39UYmKivvvuO7Vs2VL169dXSUmJRo0apZdeekklJSXuHshXXnlF0tlei8WLF5e5v0uJj4/Xfffdp+TkZB05ckQ9evTQgAED9PrrrysjI0MtWrTQ+PHj3f+K//rrr7V8+XIdOnRIDRs2VFxcnLun41//+pfWr18vl8uloKAg/frXv1bv3r0lSTt27NCiRYt0++23a/369fL19dWgQYM8DtsPP/yw++frr79eMTEx2rNnj6KiolSjRg13L0FJSYkcDoeOHj2q/Px81axZU9nZ2WrVqpXq168vSbrtttuUnJzs0eteaMOGDfrss8/c7RcUFKSnnnpK+/fv1zvvvKOSkhINHTpUt9xyiyRp1qxZioyM1AMPPODRe7B9+3b3FehnzZqloKAgZWZmas+ePWrevLnGjx+vd955R//+978VEhKicePGqXHjxpKkd999Vxs3btTx48dVv359/eY3v3H3Us2dO1fFxcV68sknJUlLlizRjz/+qOeee+6SxxwSEqK+ffuqoKCgzPXt2rWTJP30009lrj9z5ozS09PdvUHn94zdeeedWrdunQoKChQQECDpbPBZu3atRo8erYkTJ7q3/f7775Wfn69+/fq5XzcqKkr//ve/S91VZ9GiRRoyZIjmzJlT4XFt377d3eN07vFNN93k7sHt37+/3nvvPe3Zs6fc3rxzsrOzdf3118vX11c33nij+ybub7/9tvr37+8+Nk+tW7dOnTt3Vvfu3SVJvr6+pXrSzn2vPvnkk4uem5KSoptvvtkdMB966CE9++yzio+Pl7+/f6ltv/vuO2VlZenVV1+Vv7+/br31Vq1fv15paWnq1auXpLPBdfHixRoyZMhlHQPsjZ442N66dev01Vdf6ZVXXtG8efPk4+Ojt956S5LUq1cvRUZGatmyZfrpp5+0cOFCjRkzRrVr19bLL78s6ewf0eXLl19WgJOkOXPmqGbNmnr99df15z//WWlpae5f6tLZINS8eXMtXrxYv/rVr/TGG2+41yUkJKhVq1ZavHix7r//fn366afudS+//LKcTqe7F6BZs2aX3N8777xTZk/H+b788ktNnDhRCQkJSk1N1bRp0/TYY49p4cKFKigo0IYNGySd/UM1ffp0Pfzww1q8eLEeeughTZ8+XSdOnJAkBQcH6/nnn9dbb72l+Ph4LVq0SAcPHnS/Tk5OjiTpjTfe0LBhw9z7l872vHgSKCSpoKBA+/fvV2RkZKnlTz31lH7zm98oISFB/fr1c//Ru+2225SZmakff/xRxcXF2rx588+6Vc8333yjli1bavHixercubNmzJihzMxMJSYmauTIkXrzzTdVWFhY5nMreg+k/+uxOic1NVWDBw/WokWLdObMGb3wwgvuz0f79u21YsUK97YRERF69dVXtXTpUt13332aNWuWjh07JkmKi4vT7t27tWXLFu3cuVNbtmzR6NGjJZ3t4Ro6dKi+/fbbK35PKvLNN9+ocePGZQ7nff3116pfv36pkLNixQrdddddF/WklXWTIGOMvv/+e/fjlJQU1a1bVzfddNMl6/r+++89GiI8/zO8Z88eDRs2TE899ZRWr17t7qVr3Lix0tPTVVhYqF27dum6667T7t27lZeXp5tvvvmife7cuVPx8fHlvubevXvdvc/Dhw/XtGnT5HK5LlmrdLYnsmnTpu7HkZGRKikp0eHDh8s8tl/84helwl2TJk1KHXOjRo30ww8/qKioyKPXh3cgxMH2/vWvf+nRRx9VSEiI/P399eCDDyo1NdX9x2DkyJHaunWrJk2apO7du3vce1WRI0eO6Ouvv9aQIUNUo0YNBQcH64477lBqaqp7m4iICPXs2VNOp1O9evXSkSNHdPLkSR06dEiZmZkaMGCAfH191bp1a3cvR0XK258kPfjgg/rd735X4fPvvPNO1a1bV2FhYWrRooVatmypxo0by9/fX507d9aBAwcknb0RdZcuXdSmTRv3ENt1112nr776StLZmwRrk8oAAAtMSURBVFM3aNBADodDbdq0UatWrfTNN9+4X8ff31/333+/fH191aVLFzkcDv3444+SpNtvv12TJ0++5LEaYzR//ny1bNmy1PCSJM2ePVtvvfWWnnjiCXcvhHS2Jyk6OlpPPvmkBg0apG3btl32+Unni4iI0K233iofHx9169ZNOTk5GjhwoHx9fdWpUycVFxfryJEjZT63ovfg1KlTOnjwoFq2bOnevlu3bmratKm7LWrWrKnu3bu7h7n279/v3rZ79+4KDg6W0+lUjx49FBIS4h5yDgwM1BNPPKHFixcrMTFR8fHx7nO2/Pz8tHTpUjVv3vyK35OKbNu2rczQnJ2draVLl5bq4dm9e7e+++47xcbGXrR948aNVaNGDX344YcqLi7Wtm3btGfPHndgPnnypN555x2Pe4xOnTqlwMBA9+O2bdvqv//9r7755hsVFxfr3XfflTFGp0+fliS1adNGM2bM0MKFCzV+/Hht2rRJH374ofT/27v/mKjLOIDj7zsOssADih1jp1EHOCMbxdTlj/wxpf6gKMXpptXQpVbiZCpR2WLTTocUrYEoi0JKliIw56/NFDcrwBqBZjJn1jpCYLJTOgzuvverP9g948sdiUYK7XltbN73+X6f5/l++d7xuef5PF8Bk8lEUlISW7Zsoaenh9TUVMrLy1m5ciWHDx8mNzeXoqIi+vr6AHjiiSf49NNPh+yb1WrlzJkzrFmzhuLiYiIi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\n",
190 | "text/plain": [
191 | ""
192 | ]
193 | },
194 | "metadata": {},
195 | "output_type": "display_data"
196 | },
197 | {
198 | "data": {
199 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAncAAAEaCAYAAABzSHF7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XtYVPedx/HPDIgiCJkZbsEYraKpGiJENGpWMIZ92lTXmmQ37WbNs6CxXtJklTY3zc02WraJoEQwiYuaW9sku0JuNmkJEVyJ3YnKxmvwnhBQhJn1ShyB2T+s84SCOiDDjCfv1/PwPDnn/M75fX/O8/R8+vvNnGNyu91uAQAAwBDM/i4AAAAAXYdwBwAAYCCEOwAAAAMh3AEAABgI4Q4AAMBACHcAAAAGQrgD4BPPPPOMEhISfHLtDRs2yGQyqbq6ut3trrZ27VoFBwf75Nqd8dVXX+n2229XWFiYTCZTu20682/SVZ+ZLz97AJdHuAPgtYyMDJlMJplMJgUHB8tqtWrs2LFatGiRHA5Hq7a//OUvtXnzZq+vnZCQoGeeecartuPGjVNtba3i4+M7Uv5lVVdXy2QyacOGDa32/+QnP9HXX3/dpX1diSVLlqiurk6VlZWqra31dzkAAgzhDkCHjB8/XrW1tfryyy+1ceNGzZw5U7///e81fPhwVVVVedqFh4crKiqqy/t3uVwKCQlRXFyczObu+Z+w0NBQxcbGdktf3ti7d69Gjx6twYMHKy4uzt/lAAgwhDsAHXIhWMXHx2v48OGaPn26/ud//ke9e/fW7NmzPe3+dmmuurpad999t6KiohQaGqqBAwfqueeekyRNmDBB+/fv16JFizwzg4cOHfIsLX7wwQf6u7/7O/Xq1Usvv/zyRZcct23bptGjR6tXr14aPny4/vznP3uOXeyc4OBgrV27VpLUr18/SdJtt90mk8mkAQMGSGp/WXb9+vUaOXKkevbsqZiYGM2dO1enT5/2HM/IyFB6erpefvll9e/fXxEREfrxj3+sY8eOXfLf9+TJk5o1a5aio6PVq1cvpaSk6E9/+pPnuMlk0scff6zVq1fLZDIpIyPjkte7wO12a+bMmRo0aJDn33/BggU6e/Zsm7a/+93vNHDgQPXq1Uvp6ek6ePBgq+N//vOfdeuttyo0NFR9+/ZVZmamGhoaLtr3pT57AF2PcAfgikVERGjOnDnasGHDRcPL3Llzdfz4cZWUlGj37t0qLCzUddddJ0lat26dBgwYoF/84heqra1VbW2tJ2hJ0i9+8Qs98sgj2r17t6ZOnXrROrKysvTUU09p27ZtGjNmjKZMmdKh5dStW7dKkv7rv/5LtbW1stvt7bb7/PPPNWXKFKWmpqqyslKvvPKK3n///VbhVpLsdrs++eQTffDBB/rwww9VWVmpX/7yl5esYfr06froo4/0+uuva9u2bbr11ls1efJk7dmzR5JUW1ursWPH6t5771Vtba2WL1/u1djcbrdiY2P1u9/9Trt379ayZcu0Zs0aLVmypFW72tpaFRQU6M0339TGjRt18uRJTZ06VRfeVFlaWqof//jH+ulPf6rPP/9cxcXFOnTokO68805d7G2Wl/rsAXS9wPmGMICr2o033ii3262DBw8qOjq6zfHDhw/rzjvvVFJSkiR5ZsUkyWq1KigoSOHh4e0uMy5cuFBTpkzxbO/bt6/dGh577DFNnjxZkvTSSy+ppKREK1eu1LPPPuvVGC7UbbVaL7nc+dxzz+nmm29Wbm6uJGno0KF64YUXdOedd+rZZ59V//79JZ2f5Vy7dq169uwpSZozZ84lw9i+ffv0n//5n/rggw/0gx/8QJK0fPlybdy4Ub/97W+1evVqxcXFKSQkRKGhoR1akjWbza3+HQYMGKD9+/eroKBAixYt8uw/c+aM1q5d65l1fe2113TDDTfo448/Vnp6un71q1/poYce0oMPPug555VXXlH//v31v//7v57P99su9dkD6HrM3AHoEhdmbS7268158+ZpyZIluuWWW/Too4+qvLzc62uPHj3aq3Zjx471/HdwcLBGjx6tXbt2ed2Pt3bu3KnU1NRW+9LS0uR2u1v1N3ToUE+wk6S+ffvq6NGjF73uhXP/9tqpqanauXPnFde9atUq3XLLLYqNjVV4eLgef/xxHT58uFWb6OjoVsvpQ4YMUVRUlKc2u92uZcuWKTw83PM3bNgwSee/C9ieK/nsAXQc4Q5Al9ixY4dMJpMGDhzY7vHMzEwdPnxYs2fPVm1tre644w5NmzbNq2uHhYV1qqZvLxNe+PHFt/c1NzerpaWlU9e+WIj99v6QkJA2xy62dHkpbrf7ov156+2339YDDzygn/zkJ1q/fr22bdump556SufOnfOq/wtaWlr06KOPqrKystXf3r17dccdd7R7/pV89gA6jnAH4IqdOHFCK1eu1O233y6bzXbRdtdee60yMzP16quvqrCwUG+88YZOnDgh6XwQam5uvqI6vv3olaamJtntdg0dOlSSFBMTI0mqqanxtKmsrGwVXC6EscvVMXz4cJWVlbXaV1ZWJpPJ5JnF6ozhw4dLUpuZrY0bN3qOdVZ5ebmSk5OVlZWlkSNHavDgwTp06FCbdseOHdP+/fs921VVVWpoaPD8O6akpGjnzp1KSEho8xceHn7R/i/12QPoWoQ7AB3icrl05MgR1dbWateuXVq9erVGjx6ts2fPauXKlRc97+c//7nWr1+v/fv3a+fOnVq3bp369eunPn36SJK+973vadOmTfryyy9VX1/fqRm17OxsrV+/Xrt379acOXN09OhRzZkzR9L55+j1799fzzzzjPbs2aP//u//1vz581vNiEVFRSk8PFx/+tOfdOTIETmdznb7efjhh7V161ZlZWVpz549+vDDD/Xggw/qX/7lX3T99dd3uO4LBg0apH/6p3/S3Llz9dFHH2nPnj36t3/7N+3YsUMPP/xwp68rSTfccIO2b9+ud955R/v379fy5cu1bt26Nu169+6tzMxMbdmyRZ999pn+9V//VYmJiUpPT5ck/epXv9I777yj+fPnq7KyUvv379eHH36oGTNmqLGxsd2+L/fZA+hahDsAHbJx40Zde+216tevn2699Va9/PLLuvfee7Vjx45LvpXA7XZr3rx5uvHGG5WamqrTp0/rj3/8oydcLVq0SMePH9cNN9yg6Ohoffnllx2u7fnnn9eTTz6ppKQkbdq0Se+8847nV5nBwcF68803VVdXp+TkZD3wwANavHhxq2flmc1m5efn66233lK/fv2UnJzcbj833XST3n33XZWVlWnEiBG67777NGnSJL344osdrvlv/cd//Id+8IMfaNq0aRoxYoQ2bdqk999/X9///vev6LqzZs3Sfffdp8zMTCUnJ+svf/lLuw+Nvvbaa/Wzn/1Md999t+dxJ0VFRZ7P6bbbblNpaam2b9+u8ePH66abbtL8+fPVp08f9ejRo92+L/fZA+haJndnvgACAACAgMTMHQAAgIEQ7gAAAAyEcAcAAGAghDsAAAADIdwBAAAYyHf+3bLffqCpL0RFRam+vt6nfQAA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\n",
200 | "text/plain": [
201 | ""
202 | ]
203 | },
204 | "metadata": {},
205 | "output_type": "display_data"
206 | }
207 | ],
208 | "source": [
209 | "plot_distribution(x_train, y_train)"
210 | ]
211 | },
212 | {
213 | "cell_type": "code",
214 | "execution_count": 6,
215 | "metadata": {
216 | "colab": {
217 | "base_uri": "https://localhost:8080/",
218 | "height": 688
219 | },
220 | "colab_type": "code",
221 | "executionInfo": {
222 | "elapsed": 11487,
223 | "status": "ok",
224 | "timestamp": 1547020089577,
225 | "user": {
226 | "displayName": "Soh Jun De",
227 | "photoUrl": "",
228 | "userId": "15246530694083866298"
229 | },
230 | "user_tz": -480
231 | },
232 | "id": "5kRn4fohVhCo",
233 | "outputId": "044303f3-d758-4f97-faa3-0a9d84fdda68"
234 | },
235 | "outputs": [
236 | {
237 | "data": {
238 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAGHCAYAAADfrgShAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XlcVmX+//H3fQMCbsiiEoYagpVWLqmlTWrKOE012ZiZNWqSu5O5TGNWM2pZqRmiTpjpaKY289Myl3IqI0waaaHSSXMltFxIhJtcEmS7fn/48P5KitwocDjwej4e8xjvc859zvvc1018uK5zneMwxhgBAADAVpxWBwAAAEDZUcQBAADYEEUcAACADVHEAQAA2BBFHAAAgA1RxAEAANgQRRxQQ0ydOlWRkZEVsu9PPvlEDodDhw4duujr8rZ06VJ5e3tXyL4vx8GDB9WzZ0/VqVNHDofD6jiX5HA4tGLFCqtjuFX0dwWozijiABsbPHiwHA6HHA6HvL29FRQUpM6dO+vZZ5+Vy+Uqtu0TTzyhzz//3ON9R0ZGaurUqR5t26VLF6WnpyssLKws8Ut16NAhORwOffLJJ8WWP/jggzp8+HC5HutKvPjii8rIyNC2bduUnp5+0W1WrFhRYQVeRe67PJXlOwWgdBRxgM3dfvvtSk9P148//qhPP/1Uw4YN07///W+1bt1ae/fudW9Xt25dhYSElPvx8/LyVKtWLYWGhsrprJz/pPj7+6tx48aVcixP7Nu3T506dVJUVJRCQ0OtjgOghqCIA2zuXAEVFham1q1b69FHH9WXX36p2rVra+TIke7tfj2ceujQId1///0KCQmRv7+/IiIiNGvWLElS9+7d9f333+vZZ5919/QdOHDAPfS1YcMG/eY3v5Gfn58WLlxY4pDY1q1b1alTJ/n5+al169b66KOP3OtKeo+3t7eWLl0qSQoPD5ck3XHHHXI4HGrevLmkiw+n/uc//9HNN98sX19fNWrUSKNHj9Yvv/ziXj948GBFR0dr4cKFatasmerXr6/evXvr2LFjl/x8T548qREjRqhhw4by8/NThw4dtHHjRvd6h8Ohjz/+WEuWLJHD4dDgwYMv2Mcnn3yigQMHurf/9Xb/+Mc/dN1118nPz09RUVF64YUXVFBQIElKTU1V/fr1FRcX595+165dqlOnjl599dVS912aU6dOaezYsWrSpIlq166tdu3a6Z133nGvP3DggBwOh1atWqU//OEPql27tiIiIrR8+fJi+9m/f7969eolPz8/NW3aVPHx8erevbuGDh0qqeTv1Pnn1LVrV9WuXVutWrXShx9+WGz/L774oiIiIuTr66uGDRvqd7/7nXJycjw+T6BaMgBs65FHHjE9e/a86LpZs2YZh8NhMjIyjDHGTJkyxbRo0cK9/g9/+IPp2bOn2bp1q9m/f79JTEw0//rXv4wxxmRlZZnmzZubv/zlLyY9Pd2kp6ebgoICs2nTJiPJXHvttWbdunUmLS3NHDx40L384MGDxhjjfh0ZGWneffdds3PnTvPoo48aPz8/c+jQoWLbnHvPOV5eXub11183xhjzzTffGElm9erVJj093X0ur7/+uvHy8nK/53//+5/x8vIy48aNMzt37jT/+c9/THh4uBkwYECxz6p+/fqmf//+Zvv27WbLli2madOmZtCgQZf8jPv27WuaNWtmPvjgA7Nz507z+OOPGx8fH7Nr1y5jjDHp6emmc+fO5uGHHzbp6enm559/vmAfZ86cMa+88oqR5P48z203ZcoU07RpU/POO++YtLQ0s2HDBhMeHm7+9re/ud+/YsUKU6tWLfP111+bnJwcc+ONN5o+ffqUuu+LkWSWL19ujDGmqKjIdO/e3XTr1s18+umn5vvvvzevvfaa8fHxMQkJCcYYY/bv328kmWuuucasXLnS7Nu3zzz55JPGy8vL7N27172fNm3amE6dOpkvvvjCbN261fz+97839evXN0OGDDHGlP6duummm8z7779v9u7dawYOHGgCAgJMdna2McaY1atXm3r16pn169ebH374wWzdutXExcWZ06dPX7LtgOqOIg6wsUsVce+//76RZL744gtjzIVF3E033WSmTJlS4r5btGhxwfpzv3CXLVt20eW/LuL++c9/urfJz883TZs2Nc8888xF33PO+UXcwYMHjSSzadOmYtv8uogbMGCA6dixY7Ft1q5daxwOhzlw4IAx5uxnFRISYnJzc93bTJ8+3YSGhpb4Gezbt89IMhs2bCi2vF27diYmJsb9ulu3bu5ipSTLly83v/67+ZdffjH+/v7m/fffL7b8jTfeMAEBAcWWDR482ERFRZnBgwebZs2auQuckvZdkvOLuE2bNhlfX98L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puiPf/yj7r333orMCACoxr7++murIwC25HFPXP369fXSSy8pMjJSknTnnXfqhRde0BdffFFh4QAAAHBxpRZxS5YskSQNHTpUtWrVUmJiontdWFgYM4oAAAAsUGoRt3nz5mKvly9fXuz19u3byzcRAAAASlXqNXHnntJwuesBALiUq666yuoIgC2VWsQ5HI4rWg/rFA5jwgmAqu8f//iH1REAWyq1iCssLNSOHTvcr4uKii54fbmOHDmiuLg49+uMjAz169dPv/zyiz7++GPVr19fkvTQQw+pffv2kqQ1a9YoMTFRTqdTMTExatu27WUfHwAAwK5KLeICAgL06quvul/XrVu32OtzhdblCAsL06xZsySdLQZHjBihTp06adOmTbr77rsvuHXJoUOHlJycrNmzZys7O1vTpk3T3Llz5XSW6XZ3AIAqZPLkyZKk5557zuIkgL2UWsTFx8dXRg5t375doaGhatiwYYnbpKSkqEuXLvLx8VGjRo0UGhqq1NRUtWzZslIyAgDK386dO62OANiSxzf7rWhbtmzRbbfd5n794YcfKikpSRERERo0aJDq1q0rl8ulqKgo9zZBQUFyuVxWxEUVcv61f0fPW+61aH3lhwEAoJJUiSKuoKBAX3/9tR5++GFJUq9evdS3b19J0sqVK7Vs2TKNHj26TDNhExISlJCQIEmaMWOGQkJCyj94FXe09E2qtStpcx8fnyveByqet7c3bVQNePrzRnvXLLR36apEEbd161Zdc801atCggSS5/1+SevbsqZkzZ0qSgoODlZWV5V7ncrkUFBR00X1GR0crOjra/TozM7MioqMKu5I2z8/Pv+J9oOKFhITQRtWApz9vtHfNUpPbOywszKPtqsSMgF8PpWZnZ7v//eWXXyo8PFyS1KFDByUnJys/P18ZGRlKT093PwYMAGBPERERioiIsDoGYDuW98SdOXNG3377rYYPH+5etmLFCh04cEAOh0MNGzZ0rwsPD1fnzp01YcIEOZ1ODRkyhJmpAGBzL730ktURAFuyvIjz9fV1P5/1nDFjxpS4fZ8+fdSnT5+KjgUAAFCl0Y0FALDUxIkTNXHiRKtjALZjeU8cAKBmS0tLszoCYEv0xAEAANgQRRwAAIANUcQBAADYENfEAQAs1apVK6sjALZEEYdq6/xnqnqK560Cle+5556zOgJgSwynAgAA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BccqKirSsmXLtHnzZjmdTv32t79V//79JUm+vr66/fbb9e677+qhhx7yKDtsygBV2OjRo83//ve/ctnXmTNnzAMPPGAyMzNL3ObDDz80zz33XLkcz1OHDh0yDz74oOU5rPDvf//bHD582BQWFppdu3aZQYMGme+//94YY0xubq57XVFRkdmyZYsZOnSoKSoqMsYY8+WXX5rhw4ebw4cPmxMnTphnnnnGrFy50srTKdEPP/xgJkyYYHWMS1qxYoV58cUXiy376quvzPTp040xV9ZWP/74o0lMTDTJycnm4YcfvuDYTz/9tNm8ebNHOXNzc83gwYPNzz//XOz9K1asMPn5+eb77783gwYNMrt37zbGlP5zP3bsWHP48GGzb98+M2TIEPfy+Ph4k5KS4lGmcy72s3y+t956yzz55JPm+PHj5syZM2b27Nlmzpw57vXvv/++mThxojl8+LApKioyR44cMadOnbrovjZs2GAmTJhgXC6XOXbsmBkzZozZtGmTe316eroZOnSoKSgoKNM5wF7oiYPtFBUV6Z133tEnn3yinJwctWnTRkOGDFGdOnX0ySefaM2aNZo5c6b8/Pz05ZdfasmSJXr55Zf1wgsvSJLGjRsnSRozZoz7r25PnDp1SkuXLtX//vc/eXt7q0ePHrr//vvldDq1ceNGff7557r66quVlJSkevXqadiwYbrpppskST/99JPi4+P1ww8/6Nprr1XDhg1VVFSkkSNHasqUKSoqKnL3QD733HOSzj5ibMmSJRfdX2mGDRum3r17KzExUceOHVPXrl3Vt29fvfLKK0pNTVXLli01fvx4d4/Lrl27tHz5ch05ckSNGzdWTEyMrrvuOknSRx99pA0bNsjlcikgIEB//OMf3b0c27Zt0+LFi3XHHXdow4YN8vb21oABAzzuLT3XcyBJ1113naKiorR3715FRETI19dXYWFhks62ucPh0PHjx5WTk6PatWtr8+bN+u1vf+vepk+fPlq8eLH69evn0bHPt3HjRn322Wfu9gsICNDYsWO1f/9+vfXWWyoqKtLgwYN12223SZLmzJmj8PBw3X///R59Blu3bnXfXX7OnDkKCAjQoUOHtHfvXrVo0ULjx4/XW2+9pf/+978KCgrSuHHj1LRpU0nS22+/rU2bNrl7Zv70pz+pffv2kqT58+eroKBAjz/+uCTp9ddf108//aSnnnqqTOdfVFSkTz/9VIMGDSq2/PzcV9JW4eHhCg8P148//limXBeze/duBQUFKSAgQJJ08uRJ7du3T88884y8vb0VERGhjh07atOmTbr22msvuS9jjAoLC93ZCwoKdPr0af3www86efJkuT+qMSMjQ+3atXM/D7Rz585avXq1+9irV6/WX/7yF3eeq666qsR9bd68Wffee6/7meB33XWXPvnkE3Xv3l3S2d5Mb29vpaWlFeu9RvXCNXGwnfXr1+vbb7/Vc889p1dffVVeXl564403JJ0dJgkPD9eyZcv0888/a9GiRRo9erTq1q2rZ599VtLZX6LLly8vUwEnSfPmzVPt2rX1yiuv6MUXX1RKSoqSkpLc63ft2qUWLVpoyZIl+t3vfqfXXnvNvS4uLk6tWrXSkiVLdN999+nTTz91r3v22WfldDq1fPlyLV++XNdcc02p+3vrrbcUGxt7ybxffvmlpk6dqri4OCUnJ+ull17SI488okWLFik3N1cbN26UdPYXy6xZs9S/f38tWbJEDz74oGbNmuW+niYwMFBPP/203njjDQ0bNkyLFy/WwYMH3cfJzMyUJL322msaMmSIe/+StGnTJo8LitzcXO3fv1/h4eHFlo8dO1Z/+tOfFBcXpzvvvNNdeB48eFDNmjVzb9esWTMdO3bMfeyy2r17t6699lotWbJEHTt2VGxsrA4dOqT4+HiNGDFC//znP5WXl3fR917qM5DOFkPnCi9JSk5O1sCBA7V48WIVFhbqmWeecX8/2rVrpxUrVri3DQsL0/PPP6+lS5eqd+/emjNnjk6cOCFJiomJ0Z49e7RlyxZt375dW7Zs0ahRoyRJ+fn5Gjx4sL7//vtSz3379u06c+bMBUXL+UXc+craVp544403NGTIEE2ZMkW7d+8ucbsff/yxWHFjLvLQIWNMse+oJD399NMaPny4Zs+e7W4vh8Oh2rVr69ChQ0pNTVXt2rVVq1YtLVu2TDExMRc9/tixY/XFF1+UmK+oqEgjRozQqFGjtGDBgmLXpfXs2VM7d+7Uzz//rNzcXG3ZskVt27aVdPbn8Pjx40pLS9PIkSP12GOPafXq1Rc9P0k6dOhQse9/8+bNLzjnJk2a6IcffigxK+yPnjjYzkcffaQxY8YoKChIkvTAAw9owoQJGjVqlBwOh0aMGKEnnnhCe/bsUZcuXTzuvbqUY8eOadeuXZo4caK8vb3l6+ur3//+90pOTnb/5RsWFqZu3bpJOltMLlu2TL/88ouOHz+uQ4cO6fnnn5e3t7dat27t/g/3pZS0vzp16uiBBx4o9f133XWX+y/+li1b6qqrrnL37nTs2FFpaWmSzv5F36lTJ/fn1L59e1199dX69ttv1aVLl2K/2G+66Sa1atVKu3fvdv8Cr1Wrlu677z45nU516tRJDodDP/30k5o3b6477rhDd9xxR6lZjTFasGCBrr32WrVu3brYurlz5yovL0+ff/65+5op6WwhcX6RcO7fubm58vPzK/WYvxYWFua+xqtz585699131a9fP3l7e6tDhw4qKCjQsWPH1KRJkwvee6nP4PTp0zp48GCxXqHOnTurefPmks62xX//+1916dLFve78Pw7OLZekrl276p133lFaWpratm0rf39/PfbYY6NQpPwAAAnqSURBVHr55Zfl4+OjYcOGua+v8vHx0dKlSz06982bN6tz587Frv06ePCgfH19L7ge63LaqjSPPPKImjZtKqfTqaSkJE2fPl2xsbEXvX7wl19+kb+/v/t1/fr1FRERobffflsPPfSQDhw4oK+++sqd29vbW88995wiIyOVm5urN998U7NmzdL06dPldDo1fPhw9zVxjz32mDZs2KCOHTvq1KlTeu2111RUVKT+/fu722/u3LklnkdgYKBmzpypZs2auf+InD9/viZOnCjpbFFVr149DR8+XA6HQxEREe6i2+VySZJ27Nih2bNn68SJE3r++efVsGFDde3atdhxCgoKlJ+ff8H3/9d/wPj5+emXX37xuB1gPxRxsBVjjLKysjR9+nQ5HI5iy0+ePKn69eurXr166tixoz766CNNmjSpXI577Ngx5eXlaejQocWOGRoa6n59/sXJ534Z5ubmKjs7W/Xr15ePj497fXBwcKk9RiXtr06dOh5l/vX7f/363PGPHTumLVu26PPPP3evLywsdP9S+eqrr7T6/7d37yFNtXEcwL9nU5M19PWSYlqiU1kXkqhEgwxLIyMKU/IPNVBJorQ0K8tES1iwCku0sD/cNByIqEmloIQjMowQ8UJidnOi836vuZ3d3j/Eh/bOe72S8XxA2M45nufcdvzt93vOY0UFBgYGYDQaodFosG3bNrKsjY2NyR/sn9e9XFKpFMPDwws+UGJl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\n",
239 | "text/plain": [
240 | ""
241 | ]
242 | },
243 | "metadata": {},
244 | "output_type": "display_data"
245 | },
246 | {
247 | "data": {
248 | "image/png": "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7tw5j/q/oLW1VY8++qgqKira/O3bt0933HFHh+dfyWcPoPMIdwCuWGNjo1atWqXbb79dNpvtou2uvfZaZWRk6NVXX1VBQYHeeOMNNTY2SjofhFpaWq6ojm8/eqW5uVl2u10jRoyQJEVEREiSqqur3W0qKiraBJcLYexydcTFxam0tLTNvtLSUplMJvcsVlfExcVJUruZrU2bNrmPdVVZWZkSExOVmZmp0aNHKzY2VocPH27X7vjx4zpw4IB7u7KyUvX19e5/x6SkJO3atUsxMTHt/oKDgy/a/6U+ewDdi3AHoFOcTqeOHj2qmpoa7d69W2vWrNHYsWN19uxZrVq16qLn/fznP9eGDRt04MAB7dq1S+vXr9egQYM0YMAASdL3vvc9bd68WV9++aXq6uq6NKOWlZWlDRs2aM+ePZo7d66OHTumuXPnSjr/HL3BgwfrmWee0d69e/Xf//3fWrBgQZsZsbCwMAUHB+tPf/qTjh49qoaGhg77efjhh7Vt2zZlZmZq7969+vDDD/Xggw/qX/7lX3T99dd3uu4Lhg0bpn/6p3/SvHnz9NFHH2nv3r36t3/7N+3cuVMPP/xwl68rSTfccIN27Nihd955RwcOHNCKFSu0fv36du369++vjIwMbd26VZ999pn+9V//VfHx8UpLS5Mk/epXv9I777yjBQsWqKKiQgcOHNCHH36omTNnqqmpqcO+L/fZA+hehDsAnbJp0yZde+21GjRokG699Va9/PLLuvfee7Vz585LvpXA5XJp/vz5uvHGG5WSkqLTp0/rj3/8oztcLV68WCdOnNANN9yg8PBwffnll52u7fnnn9eTTz6phIQEbd68We+88477V5n+/v568803VVtbq8TERD3wwANasmRJm2flmc1m5eXl6a233tKgQYOUmJjYYT833XST3n33XZWWlmrUqFG67777NHnyZL344oudrvlv/cd//Id+8IMfaPr06Ro1apQ2b96s999/X9///vev6LqzZ8/Wfffdp4yMDCUmJuovf/lLhw+Nvvbaa/Wzn/1Md999t/txJ4WFhe7P6bbbblNJSYl27NihCRMm6KabbtKCBQs0YMAA9enTp8O+L/fZA+heJldXvgACAACAXomZOwAAAAMh3AEAABgI4Q4AAMBACHcAAAAGQrgDAAAwkO/8u2W//UBTbwgLC1NdXZ1X+wAAAL7V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\n",
249 | "text/plain": [
250 | ""
251 | ]
252 | },
253 | "metadata": {},
254 | "output_type": "display_data"
255 | }
256 | ],
257 | "source": [
258 | "plot_distribution(x_test, y_test)"
259 | ]
260 | },
261 | {
262 | "cell_type": "code",
263 | "execution_count": null,
264 | "metadata": {
265 | "colab": {},
266 | "colab_type": "code",
267 | "id": "RE0SK-ERV00G"
268 | },
269 | "outputs": [],
270 | "source": []
271 | }
272 | ],
273 | "metadata": {
274 | "colab": {
275 | "collapsed_sections": [],
276 | "name": "2_Loading and visualisation notebook.ipynb",
277 | "provenance": [],
278 | "version": "0.3.2"
279 | },
280 | "kernelspec": {
281 | "display_name": "Python 3",
282 | "language": "python",
283 | "name": "python3"
284 | },
285 | "language_info": {
286 | "codemirror_mode": {
287 | "name": "ipython",
288 | "version": 3
289 | },
290 | "file_extension": ".py",
291 | "mimetype": "text/x-python",
292 | "name": "python",
293 | "nbconvert_exporter": "python",
294 | "pygments_lexer": "ipython3",
295 | "version": "3.6.7"
296 | }
297 | },
298 | "nbformat": 4,
299 | "nbformat_minor": 1
300 | }
301 |
--------------------------------------------------------------------------------