├── _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 | ![](images/dl-iap-header.jpg) 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://img.shields.io/github/license/opensutd/deeplearning-workshop-2019.svg) [![GitHub issues](https://img.shields.io/github/issues/OpenSUTD/deeplearning-workshop-2019.svg)](https://github.com/OpenSUTD/deeplearning-workshop-2019/issues) ![](https://img.shields.io/github/repo-size/opensutd/deeplearning-workshop-2019.svg) 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 | ![](images/colab_1.jpg) 21 | 22 | * Change runtime type to GPU 23 | 24 | ![](images/colab_2.jpg) 25 | 26 | ![](images/colab_3.jpg) 27 | 28 | * On the menu bar, go to **Runtime > Run All** 29 | 30 | ![](images/colab_4.jpg) 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 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\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 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
1FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
3FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
4FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
\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 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | "
PassengerIdSurvivedPclassAgeSibSpParchFare
count891.000000891.000000891.000000891.000000891.000000891.000000891.000000
mean446.0000000.3838382.30864229.6991180.5230080.38159432.204208
std257.3538420.4865920.83607113.0020151.1027430.80605749.693429
min1.0000000.0000001.0000000.4200000.0000000.0000000.000000
25%223.5000000.0000002.00000022.0000000.0000000.0000007.910400
50%446.0000000.0000003.00000029.6991180.0000000.00000014.454200
75%668.5000001.0000003.00000035.0000001.0000000.00000031.000000
max891.0000001.0000003.00000080.0000008.0000006.000000512.329200
\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//33qlmzZqleIU9NmTJF4eHhatasmWbOnKnDhw9r9OjR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Dh3SoEGDLvleny8jI0NvvfWWDhw4oMDAQA0YMEB9+/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 | --------------------------------------------------------------------------------