From bd35d67ee02e4a0f8d2afe040a00e9a146c80a6f Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Fri, 23 Oct 2020 16:28:25 +0200 Subject: [PATCH] add ipynb for assignments in python --- assignment_4.ipynb | 1040 ++++++++++++++++++++++++++++++++++++++++++++ assignment_5.ipynb | 711 ++++++++++++++++++++++++++++++ 2 files changed, 1751 insertions(+) create mode 100644 assignment_4.ipynb create mode 100644 assignment_5.ipynb diff --git a/assignment_4.ipynb b/assignment_4.ipynb new file mode 100644 index 0000000..33e09ba --- /dev/null +++ b/assignment_4.ipynb @@ -0,0 +1,1040 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", + "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", + "execution": { + "iopub.execute_input": "2020-10-23T07:12:26.661165Z", + "iopub.status.busy": "2020-10-23T07:12:26.660203Z", + "iopub.status.idle": "2020-10-23T07:12:26.665167Z", + "shell.execute_reply": "2020-10-23T07:12:26.664447Z" + }, + "papermill": { + "duration": 0.019587, + "end_time": "2020-10-23T07:12:26.665296", + "exception": false, + "start_time": "2020-10-23T07:12:26.645709", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/input/nn-assignment/testset.csv\n", + "/kaggle/input/nn-assignment/samplesubmission.csv\n", + "/kaggle/input/nn-assignment/trainset.csv\n" + ] + } + ], + "source": [ + "# This Python 3 environment comes with many helpful analytics libraries installed\n", + "# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n", + "# For example, here's several helpful packages to load\n", + "\n", + "import numpy as np # linear algebra\n", + "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", + "\n", + "# Input data files are available in the read-only \"../input/\" directory\n", + "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n", + "\n", + "import os\n", + "for dirname, _, filenames in os.walk('/kaggle/input'):\n", + " for filename in filenames:\n", + " print(os.path.join(dirname, filename))\n", + "\n", + "# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n", + "# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:12:26.685951Z", + "iopub.status.busy": "2020-10-23T07:12:26.685373Z", + "iopub.status.idle": "2020-10-23T07:12:28.979037Z", + "shell.execute_reply": "2020-10-23T07:12:28.978440Z" + }, + "papermill": { + "duration": 2.30553, + "end_time": "2020-10-23T07:12:28.979146", + "exception": false, + "start_time": "2020-10-23T07:12:26.673616", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
labelpixel0pixel1pixel2pixel3pixel4pixel5pixel6pixel7pixel8...pixel774pixel775pixel776pixel777pixel778pixel779pixel780pixel781pixel782pixel783
1887990000000255255...0000000000
88202000000000...0000000000
23937700000000255...0000000000
14765000000000...0000000000
4345000000000...0000000000
..................................................................
106841000000000...0000000000
152644000000000...25525525525525500000
193487000000000...0000000000
235799000000000...255255255255255255255000
140541000000000...0000000000
\n", + "

28000 rows × 785 columns

\n", + "
" + ], + "text/plain": [ + " label pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 \\\n", + "18879 9 0 0 0 0 0 0 0 255 \n", + "8820 2 0 0 0 0 0 0 0 0 \n", + "23937 7 0 0 0 0 0 0 0 0 \n", + "1476 5 0 0 0 0 0 0 0 0 \n", + "434 5 0 0 0 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "10684 1 0 0 0 0 0 0 0 0 \n", + "15264 4 0 0 0 0 0 0 0 0 \n", + "19348 7 0 0 0 0 0 0 0 0 \n", + "23579 9 0 0 0 0 0 0 0 0 \n", + "14054 1 0 0 0 0 0 0 0 0 \n", + "\n", + " pixel8 ... pixel774 pixel775 pixel776 pixel777 pixel778 \\\n", + "18879 255 ... 0 0 0 0 0 \n", + "8820 0 ... 0 0 0 0 0 \n", + "23937 255 ... 0 0 0 0 0 \n", + "1476 0 ... 0 0 0 0 0 \n", + "434 0 ... 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "10684 0 ... 0 0 0 0 0 \n", + "15264 0 ... 255 255 255 255 255 \n", + "19348 0 ... 0 0 0 0 0 \n", + "23579 0 ... 255 255 255 255 255 \n", + "14054 0 ... 0 0 0 0 0 \n", + "\n", + " pixel779 pixel780 pixel781 pixel782 pixel783 \n", + "18879 0 0 0 0 0 \n", + "8820 0 0 0 0 0 \n", + "23937 0 0 0 0 0 \n", + "1476 0 0 0 0 0 \n", + "434 0 0 0 0 0 \n", + "... ... ... ... ... ... \n", + "10684 0 0 0 0 0 \n", + "15264 0 0 0 0 0 \n", + "19348 0 0 0 0 0 \n", + "23579 255 255 0 0 0 \n", + "14054 0 0 0 0 0 \n", + "\n", + "[28000 rows x 785 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv(\"/kaggle/input/nn-assignment/trainset.csv\")\n", + "#randomly shuffle data\n", + "data = data.sample(frac = 1) \n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:12:29.001507Z", + "iopub.status.busy": "2020-10-23T07:12:29.000681Z", + "iopub.status.idle": "2020-10-23T07:12:29.004182Z", + "shell.execute_reply": "2020-10-23T07:12:29.004645Z" + }, + "papermill": { + "duration": 0.01646, + "end_time": "2020-10-23T07:12:29.004783", + "exception": false, + "start_time": "2020-10-23T07:12:28.988323", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5600" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "validation_data_percentage = 0.2\n", + "validation_data_amount = round(validation_data_percentage * len(data))\n", + "validation_data_amount" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:12:29.087417Z", + "iopub.status.busy": "2020-10-23T07:12:29.084803Z", + "iopub.status.idle": "2020-10-23T07:12:29.202140Z", + "shell.execute_reply": "2020-10-23T07:12:29.201577Z" + }, + "papermill": { + "duration": 0.188986, + "end_time": "2020-10-23T07:12:29.202254", + "exception": false, + "start_time": "2020-10-23T07:12:29.013268", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "def reshape_input(input_data):\n", + " return np.reshape(input_data, (len(input_data), 28, 28, 1))\n", + "\n", + "def normalize(input_data):\n", + " return input_data / 255.0\n", + "\n", + "def preprocess(input_data):\n", + " return normalize(reshape_input(input_data))\n", + "\n", + "X = data.drop(columns='label').values\n", + "Y = data.loc[:,'label'].values\n", + "\n", + "X = preprocess(X)\n", + "\n", + "validation_X = X[:validation_data_amount]\n", + "validation_Y = Y[:validation_data_amount]\n", + "train_X = X[validation_data_amount:]\n", + "train_Y = Y[validation_data_amount:]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:12:29.225316Z", + "iopub.status.busy": "2020-10-23T07:12:29.224728Z", + "iopub.status.idle": "2020-10-23T07:12:29.565835Z", + "shell.execute_reply": "2020-10-23T07:12:29.566259Z" + }, + "papermill": { + "duration": 0.355532, + "end_time": "2020-10-23T07:12:29.566416", + "exception": false, + "start_time": "2020-10-23T07:12:29.210884", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAFlCAYAAADyArMXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAASZUlEQVR4nO3df5BV9XnH8c8jIIhCZUNwFtQgKkZoAeMWndCktGggdqzaViNNHZjYwWmkFX90akxbnUnNOC0SO451ukQqZBTjKFQn42RFakIN1gqEn90Ilq6pLoVaTYEhEhee/nEPzWa9y97v3nvO3efu+zXD3Lvffe49z5nDfvxy9n6/mrsLABDPKfVuAADQPwQ4AARFgANAUAQ4AARFgANAUAQ4AAQ1tMiDnWrDfYROL/KQABDeIb3/rrt/vOd4oQE+QqfrMptT5CEBILyX/Jm3yo1zCwUAgiLAASAoAhwAgiLAASAoAhwAgiLAASAoAhwAgiLAASAoAhwAgiLAASCoQpfSDyRtndvq3QIGkLnjp9e7BSAZM3AACIoAB4CgCHAACIoAB4CgCHAACIoAB4CgCHAACIoAB4CgCHAACIoAB4CgBu1SepZOA4iOGTgABEWAA0BQBDgABEWAA0BQBDgABEWAA0BQBDgABNVngJvZOWb2spm1m9kuM7stG7/PzN4xs63Zn6vybxcAcEIlC3m6JN3p7lvMbJSkzWa2LvveN9x9aX7tAQB602eAu/s+Sfuy54fMrF3ShLwbAwCcXNI9cDObKOkSSa9lQ4vNbLuZrTCzMTXuDQBwEhUHuJmdIelZSUvc/aCkRyWdL2mGSjP0B3t53SIz22Rmmz7U0Rq0DACQKgxwMxumUng/4e5rJMnd97v7MXc/Lmm5pJnlXuvure7e4u4twzS8Vn0DwKBXyadQTNJjktrdfVm38eZuZddJ2ln79gAAvankUyizJN0kaYeZbc3G7pE038xmSHJJHZJuyaVDAEBZlXwK5RVJVuZbL9S+HQBApViJCQBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBVbKQB6i5ts5t9W4BA8jc8dPr3UJIzMABICgCHACCIsABICgCHACCIsABICgCHACCIsABICgCHACCIsABICgCHACCGrBL6Vlqje4ePzguqf6Lozpz6qQY6z8YmVT/8JWfT6rv2tuRVI+BiRk4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARl7l7YwUZbk19mcwo7Horz7w9dnlTffv0jOXVSctG6RUn1Uyem7Z2y5sLvJNXnbeqqP06qP+8rG3PqJH+DcZ+kIc17Nrt7S89xZuAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEFShe6G0TB/h/9p2bmHHi2Tu+On1buEX7Fl5aVL9riseTaofqiFJ9Z/ZdmNS/ZlX702qtyFp/RydPS2p/va/W51UP++0g0n1XTqWVP/Ze5ck1Td9c+DsncJeKD/HDBwAgiLAASAoAhwAgiLAASAoAhwAgiLAASCoPgPczM4xs5fNrN3MdpnZbdl4k5mtM7M92eOY/NsFAJxQyQy8S9Kd7n6xpMsl3WpmUyTdLWm9u18oaX32NQCgIH0GuLvvc/ct2fNDktolTZB0jaSVWdlKSdfm1SQA4KOS7oGb2URJl0h6TdJZ7r5PKoW8pHG1bg4A0LuhlRaa2RmSnpW0xN0Pmlmlr1skaZEknTuh4sOhzl6f83BS/VANz6mTkocufiqpfvnGX0+q3/2TtPnH6D/oSKp/qGNOUv28i9cm1aduTeCBP74w0LadKMaesqMVXUYzG6ZSeD/h7muy4f1m1px9v1nSgXKvdfdWd29x95aPfyztLxkAoHeVfArFJD0mqd3dl3X71vOSFmTPF0h6rvbtAQB6U8k9jVmSbpK0w8y2ZmP3SHpA0tNmdrOkH0u6Pp8WAQDl9Bng7v6KpN5ueKfd2AMA1EzgX2UAwOBGgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARV6OYku7ePHKT7GKBal56aWH/295Pqp2xYnFQ/8r/3JtVL5ybW58uueTftBa359IHqMAMHgKAIcAAIigAHgKAIcAAIigAHgKAIcAAIigAHgKAIcAAIigAHgKAIcAAIigAHgKAK3QsFcVz9p3ck1S/7+iNJ9al7m6SaveOGpPoL7t2WVH88qVoavuS0tBe0JR4g0Yqpq5Lq79LlOXWSv7bOtGs7EA1pLj/ODBwAgiLAASAoAhwAgiLAASAoAhwAgiLAASAoAhwAgiLAASAoAhwAgiLAASCoQpfST552RG1t8Ze1DgRzx0/P9f1Hrf6XpPolwxYn1d/556uT6pfePz+pfuxLbyXVdx05klSf6ke3npnr+6N3ef+sFGNP2VFm4AAQFAEOAEER4AAQFAEOAEER4AAQFAEOAEER4AAQFAEOAEER4AAQFAEOAEER4AAQVKF7oezePrJB9iVAT7+06tWk+m+umphUf6bS3r8rqVo6/IXLk+r/a1ba+39l9vNpL8jZKeb1bgE1wAwcAIIiwAEgKAIcAIIiwAEgKAIcAIIiwAEgKAIcAILqM8DNbIWZHTCznd3G7jOzd8xsa/bnqnzbBAD0VMkM/HFJ88qMf8PdZ2R/XqhtWwCAvvQZ4O6+QdJ7BfQCAEhQzT3wxWa2PbvFMqa3IjNbZGabzGzThzpaxeEAAN31dy+URyV9TZJnjw9K+lK5QndvldQqSaOtiQ0Y0C9DL5iUVN/0rbR/NC6fsDSpvnnIaUn1A81xt3q3gBro1wzc3fe7+zF3Py5puaSZtW0LANCXfgW4mTV3+/I6STt7qwUA5KPPWyhmtlrSbEljzextSfdKmm1mM1S6hdIh6ZYcewQAlNFngLv7/DLDj+XQCwAgASsxASAoAhwAgiLAASAoAhwAgiLAASAoAhwAgurvUvp+mTztiNrathV5SAxQv/Urv5lUP+HJ/Un1j0zYkFQvxV4an+rsoWm7WnS9dG5S/bCvnplU769tT6pHCTNwAAiKAAeAoAhwAAiKAAeAoAhwAAiKAAeAoAhwAAiKAAeAoAhwAAiKAAeAoAhwAAjK3NP2RKjGaGvyy2xOYcdDcYZOGJ9UP2Ht/ybVp+9tkmbhW1ck1T8x8Xv5NIJw5o6fnvsxXvJnNrt7S89xZuAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAENTQejeAgWnoBZOS6sd+63+S6lP3NvnB0WFJ9bfvvCGpfvwfpvU/+Y4/SqrfddPDSfWptv4sbU+jZZ1zk+pXTXwxqf794x8k1c/69l0V106669Wk925kzMABICgCHACCIsABICgCHACCIsABICgCHACCIsABICgCHACCIsABICgCHACCYik9yvrE6s6k+r8d/4OcOin58pYvJtWf83s7kup91Kik+lVfyHdpfKov/9WfJNWPffKHSfVT/+FLSfXbPrM8qf6HNz5Uce2n992e9N7ND25Mqo+EGTgABEWAA0BQBDgABEWAA0BQBDgABEWAA0BQBDgABNVngJvZCjM7YGY7u401mdk6M9uTPY7Jt00AQE+VzMAflzSvx9jdkta7+4WS1mdfAwAK1GeAu/sGSe/1GL5G0srs+UpJ19a4LwBAH/p7D/wsd98nSdnjuN4KzWyRmW0ys00f6mg/DwcA6Cn3vVDcvVVSqySNtibP+3ioja81/1PiK4YnVS9864qk+okL/yOp/lhStfTG/VOT6i899XuJR0hzW+espPpx33kzqb7rpz9Nqj/vxm1J9TO+viSpfuHV6yuuHfEeMXJCf2fg+82sWZKyxwO1awkAUIn+BvjzkhZkzxdIeq427QAAKlXJxwhXS3pV0kVm9raZ3SzpAUlXmtkeSVdmXwMACtTnPXB3n9/Lt+bUuBcAQAJWYgJAUAQ4AARFgANAUAQ4AARFgANAUAQ4AASV+1J6DAynXDIlrV6vJtU/fbjX7XDK+snvpi29P3b4/aT6I79zWVL907/9cFJ96tznoKftA/TKtz+VVN+8f2NSfd4m3pPWzyutn6y4dkxH2t/NVG2dadsGFGFIc/lxZuAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEFShe6FMnnZEbW0Db5+BwWDSi5cm1Z9hpybVHzp+WlK9HzqcVH/06plJ9X/5NyuS6qcNy3cuM3PNHUn1FywdWHub5K2r4616t/D/5o6fXu8WythTdpQZOAAERYADQFAEOAAERYADQFAEOAAERYADQFAEOAAERYADQFAEOAAERYADQFAEOAAEVeheKLu3jxyg+ww0vqZbhifVH72iK6n+5tFpe1nc/Ebq3hffT6zP19OHxyXVX/DUBzl1gsGMGTgABEWAA0BQBDgABEWAA0BQBDgABEWAA0BQBDgABEWAA0BQBDgABEWAA0BQhS6lR/187O83JtUf/YtjSfXDg/9VumjdLUn1n1x6KO0AO7em1QMVYAYOAEER4AAQFAEOAEER4AAQFAEOAEER4AAQFAEOAEFV9eFdM+uQdEjSMUld7t5Si6YAAH2rxeqL33D3d2vwPgCABNxCAYCgqg1wl/SimW02s0W1aAgAUJlqb6HMcvdOMxsnaZ2Z/cjdN3QvyIJ9kSSN0MgqD4fB6qsHfjWp/rtPXJ5Uf/7rHyTVH9v5RlI9kIeqZuDu3pk9HpC0VtLMMjWt7t7i7i3DNLyawwEAuul3gJvZ6WY26sRzSZ+TtLNWjQEATq6aWyhnSVprZife50l3/25NugIA9KnfAe7ueyVNr2EvAIAEfIwQAIIiwAEgKAIcAIIiwAEgKAIcAIIiwAEgKAIcAIKqxXayaEC/f/an691CD8eTqpu1Mac+gF/U1rkt92MMaS4/zgwcAIIiwAEgKAIcAIIiwAEgKAIcAIIiwAEgKAIcAIIiwAEgKAIcAIIiwAEgqEKX0k+edkRtbfkvO0X15o7n/5YHVKKYn5U9ZUeZgQNAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUIXuhbJ7+0j22ACAGmEGDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEBQBDgBBEeAAEFRVAW5m88zsDTN708zurlVTAIC+9TvAzWyIpEckfV7SFEnzzWxKrRoDAJxcNTPwmZLedPe97v4zSU9JuqY2bQEA+lJNgE+Q9J/dvn47GwMAFGBoFa+1MmP+kSKzRZIWZV8efcmf2VnFMaMZK+ndejdRoMF0voPpXCXOt94+UW6wmgB/W9I53b4+W1JnzyJ3b5XUKklmtsndW6o4Ziicb+MaTOcqcb4DVTW3UF6XdKGZnWdmp0q6UdLztWkLANCXfs/A3b3LzBZLapM0RNIKd99Vs84AACdVzS0UufsLkl5IeElrNccLiPNtXIPpXCXOd0Ay94/83hEAEABL6QEgqEICfLAtuTezDjPbYWZbzWxTvfupNTNbYWYHzGxnt7EmM1tnZnuyxzH17LGWejnf+8zsnewabzWzq+rZY62Y2Tlm9rKZtZvZLjO7LRtvyOt7kvMNcX1zv4WSLbnfLelKlT56+Lqk+e7+b7keuI7MrENSi7sPpM+R1oyZfVbSYUmr3P2Xs7G/lvSeuz+Q/Ud6jLv/WT37rJVezvc+SYfdfWk9e6s1M2uW1OzuW8xslKTNkq6VtFANeH1Pcr43KMD1LWIGzpL7BuPuGyS912P4Gkkrs+crVfohaAi9nG9Dcvd97r4le35IUrtKK6wb8vqe5HxDKCLAB+OSe5f0opltzlaiDgZnufs+qfRDIWlcnfspwmIz257dYmmIWwrdmdlESZdIek2D4Pr2OF8pwPUtIsArWnLfYGa5+6dU2qnx1uyf4Ggsj0o6X9IMSfskPVjfdmrLzM6Q9KykJe5+sN795K3M+Ya4vkUEeEVL7huJu3dmjwckrVXpNlKj25/dTzxxX/FAnfvJlbvvd/dj7n5c0nI10DU2s2EqhdkT7r4mG27Y61vufKNc3yICfFAtuTez07NfhsjMTpf0OUmDYQOv5yUtyJ4vkPRcHXvJ3Ykwy1ynBrnGZmaSHpPU7u7Lun2rIa9vb+cb5foWspAn+wjOQ/r5kvv7cz9onZjZJJVm3VJppeuTjXa+ZrZa0myVdmzbL+leSf8o6WlJ50r6saTr3b0hfvHXy/nOVumf1y6pQ9ItJ+4RR2ZmvybpnyXtkHQ8G75HpfvCDXd9T3K+8xXg+rISEwCCYiUmAARFgANAUAQ4AARFgANAUAQ4AARFgANAUAQ4AARFgANAUP8HxDUa8nyHYAYAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure(figsize=(6,6))\n", + "plot_data = np.reshape(data.drop(columns='label').values, (len(data.drop(columns='label').values), 28, 28))\n", + "plt.pcolor(plot_data[6][::-1][:])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:12:29.594754Z", + "iopub.status.busy": "2020-10-23T07:12:29.593939Z", + "iopub.status.idle": "2020-10-23T07:12:35.838442Z", + "shell.execute_reply": "2020-10-23T07:12:35.837675Z" + }, + "papermill": { + "duration": 6.26273, + "end_time": "2020-10-23T07:12:35.838594", + "exception": false, + "start_time": "2020-10-23T07:12:29.575864", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 26, 26, 32) 320 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 11, 11, 64) 18496 \n", + "_________________________________________________________________\n", + "max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0 \n", + "_________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 3, 3, 64) 36928 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 576) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 128) 73856 \n", + "_________________________________________________________________\n", + "dropout (Dropout) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 64) 8256 \n", + "_________________________________________________________________\n", + "dropout_1 (Dropout) (None, 64) 0 \n", + "_________________________________________________________________\n", + "dense_2 (Dense) (None, 10) 650 \n", + "=================================================================\n", + "Total params: 138,506\n", + "Trainable params: 138,506\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "from tensorflow.keras import datasets, layers, models\n", + "import keras\n", + "\n", + "shape = train_X[0].shape\n", + "\n", + "\n", + "model = models.Sequential()\n", + "model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=shape))\n", + "model.add(layers.MaxPooling2D((2, 2)))\n", + "model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n", + "model.add(layers.MaxPooling2D((2, 2)))\n", + "model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n", + "model.add(layers.Flatten())\n", + "model.add(layers.Dense(128, activation = 'relu'))\n", + "model.add(layers.Dropout(0.25))\n", + "model.add(layers.Dense(64, activation='relu'))\n", + "model.add(layers.Dropout(0.5))\n", + "model.add(layers.Dense(10, activation='softmax'))\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:12:35.873662Z", + "iopub.status.busy": "2020-10-23T07:12:35.872894Z", + "iopub.status.idle": "2020-10-23T07:15:27.735039Z", + "shell.execute_reply": "2020-10-23T07:15:27.734394Z" + }, + "papermill": { + "duration": 171.885215, + "end_time": "2020-10-23T07:15:27.735182", + "exception": false, + "start_time": "2020-10-23T07:12:35.849967", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/15\n", + "700/700 [==============================] - 12s 17ms/step - loss: 1.7676 - accuracy: 0.6979 - val_loss: 1.5428 - val_accuracy: 0.9195\n", + "Epoch 2/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.5487 - accuracy: 0.9154 - val_loss: 1.5261 - val_accuracy: 0.9352\n", + "Epoch 3/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.5251 - accuracy: 0.9375 - val_loss: 1.5113 - val_accuracy: 0.9493\n", + "Epoch 4/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.5136 - accuracy: 0.9487 - val_loss: 1.5112 - val_accuracy: 0.9507\n", + "Epoch 5/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.5088 - accuracy: 0.9531 - val_loss: 1.4994 - val_accuracy: 0.9620\n", + "Epoch 6/15\n", + "700/700 [==============================] - 12s 17ms/step - loss: 1.5021 - accuracy: 0.9598 - val_loss: 1.5121 - val_accuracy: 0.9482\n", + "Epoch 7/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4991 - accuracy: 0.9625 - val_loss: 1.5026 - val_accuracy: 0.9582\n", + "Epoch 8/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4964 - accuracy: 0.9650 - val_loss: 1.5044 - val_accuracy: 0.9566\n", + "Epoch 9/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4988 - accuracy: 0.9623 - val_loss: 1.4946 - val_accuracy: 0.9661\n", + "Epoch 10/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4977 - accuracy: 0.9633 - val_loss: 1.4984 - val_accuracy: 0.9620\n", + "Epoch 11/15\n", + "700/700 [==============================] - 12s 17ms/step - loss: 1.4931 - accuracy: 0.9682 - val_loss: 1.4963 - val_accuracy: 0.9645\n", + "Epoch 12/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4914 - accuracy: 0.9698 - val_loss: 1.4914 - val_accuracy: 0.9702\n", + "Epoch 13/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4924 - accuracy: 0.9690 - val_loss: 1.4924 - val_accuracy: 0.9684\n", + "Epoch 14/15\n", + "700/700 [==============================] - 12s 17ms/step - loss: 1.4876 - accuracy: 0.9740 - val_loss: 1.4899 - val_accuracy: 0.9711\n", + "Epoch 15/15\n", + "700/700 [==============================] - 11s 16ms/step - loss: 1.4883 - accuracy: 0.9729 - val_loss: 1.5007 - val_accuracy: 0.9602\n" + ] + } + ], + "source": [ + "from keras import losses\n", + "# Read more https://keras.io/api/optimizers/\n", + "optimizer = 'adam' # sdg, rmsprop, adam, adadelta, adagrad, adamax, nadam, ftrl\n", + "# Read more https://www.tutorialspoint.com/keras/keras_model_compilation.htm\n", + "loss = losses.SparseCategoricalCrossentropy(from_logits=True)\n", + "# Read more at https://www.tutorialspoint.com/keras/keras_model_compilation.htm\n", + "metrics = ['accuracy'] # accuracy, binary_accuracy, categorical_accuracy, ...\n", + "\n", + "model.compile(optimizer=optimizer,\n", + " loss=loss,\n", + " metrics=metrics)\n", + "\n", + "\n", + "epochs = 15\n", + "shuffle = True # True, False or \"batch\"\n", + "batch_size = 32 # Integer or None -> default 32\n", + "callbacks = [] # List of callbacks during training\n", + "\n", + "history = model.fit(train_X, train_Y, \n", + " validation_data=(validation_X, validation_Y),\n", + " epochs=epochs,\n", + " shuffle=shuffle,\n", + " batch_size=batch_size,\n", + " callbacks=callbacks)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:15:29.295413Z", + "iopub.status.busy": "2020-10-23T07:15:29.294471Z", + "iopub.status.idle": "2020-10-23T07:15:29.443107Z", + "shell.execute_reply": "2020-10-23T07:15:29.442237Z" + }, + "papermill": { + "duration": 0.951328, + "end_time": "2020-10-23T07:15:29.443239", + "exception": false, + "start_time": "2020-10-23T07:15:28.491911", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(history.history['accuracy'], label='accuracy')\n", + "plt.plot(history.history['val_accuracy'], label = 'val_accuracy')\n", + "plt.xlabel('Epoch')\n", + "plt.ylabel('Accuracy')\n", + "plt.ylim([0.8, 1])\n", + "plt.legend(loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:15:30.950554Z", + "iopub.status.busy": "2020-10-23T07:15:30.949956Z", + "iopub.status.idle": "2020-10-23T07:15:33.901103Z", + "shell.execute_reply": "2020-10-23T07:15:33.901654Z" + }, + "papermill": { + "duration": 3.706087, + "end_time": "2020-10-23T07:15:33.901808", + "exception": false, + "start_time": "2020-10-23T07:15:30.195721", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "test_data_unprocessed = pd.read_csv(\"/kaggle/input/nn-assignment/testset.csv\")\n", + "test_data_X = preprocess(test_data_unprocessed.values)\n", + "\n", + "prediction = model.predict(test_data_X)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:15:35.421782Z", + "iopub.status.busy": "2020-10-23T07:15:35.420230Z", + "iopub.status.idle": "2020-10-23T07:15:36.302679Z", + "shell.execute_reply": "2020-10-23T07:15:36.303099Z" + }, + "papermill": { + "duration": 1.650328, + "end_time": "2020-10-23T07:15:36.303252", + "exception": false, + "start_time": "2020-10-23T07:15:34.652924", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import random\n", + "plot_data = np.reshape(test_data_unprocessed.values, (len(test_data_unprocessed.values), 28, 28))\n", + "\n", + "subplots_x = 4\n", + "subplots_y = 4\n", + "\n", + "\n", + "\n", + "plt.figure(figsize=(10,10))\n", + "fig, ax = plt.subplots(subplots_y, subplots_x)\n", + "fig.tight_layout()\n", + "\n", + "randomlist = random.sample(range(0, len(plot_data)), subplots_x * subplots_y)\n", + "r_index = 0\n", + "\n", + "for x in range(subplots_x):\n", + " for y in range(subplots_y):\n", + " index = randomlist[r_index]\n", + " ax[y][x].axes.xaxis.set_visible(False)\n", + " ax[y][x].axes.yaxis.set_visible(False)\n", + " ax[y][x].pcolor(plot_data[index][::-1][:])\n", + " ax[y][x].set_title('Prediction: {}'.format(np.argmax(prediction[index])))\n", + " r_index += 1\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:15:37.845380Z", + "iopub.status.busy": "2020-10-23T07:15:37.844722Z", + "iopub.status.idle": "2020-10-23T07:15:38.098061Z", + "shell.execute_reply": "2020-10-23T07:15:38.097439Z" + }, + "papermill": { + "duration": 1.045857, + "end_time": "2020-10-23T07:15:38.098169", + "exception": false, + "start_time": "2020-10-23T07:15:37.052312", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ImageIdLabel
013
121
233
348
450
.........
13995139960
13996139971
13997139987
13998139996
13999140009
\n", + "

14000 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " ImageId Label\n", + "0 1 3\n", + "1 2 1\n", + "2 3 3\n", + "3 4 8\n", + "4 5 0\n", + "... ... ...\n", + "13995 13996 0\n", + "13996 13997 1\n", + "13997 13998 7\n", + "13998 13999 6\n", + "13999 14000 9\n", + "\n", + "[14000 rows x 2 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# generating the result file\n", + "result = np.argmax(prediction[:], axis = 1 )\n", + "\n", + "df = pd.DataFrame(result)\n", + "df.index += 1\n", + "df.to_csv(\"prediction.csv\", index_label=\"ImageId\", header=[\"Label\"])\n", + "\n", + "# load data again to test correct file format\n", + "pd.read_csv(\"prediction.csv\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + }, + "papermill": { + "duration": 196.572998, + "end_time": "2020-10-23T07:15:38.971256", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2020-10-23T07:12:22.398258", + "version": "2.1.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/assignment_5.ipynb b/assignment_5.ipynb new file mode 100644 index 0000000..e1cb6ae --- /dev/null +++ b/assignment_5.ipynb @@ -0,0 +1,711 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", + "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", + "execution": { + "iopub.execute_input": "2020-10-23T07:01:24.034522Z", + "iopub.status.busy": "2020-10-23T07:01:24.033481Z", + "iopub.status.idle": "2020-10-23T07:01:24.040184Z", + "shell.execute_reply": "2020-10-23T07:01:24.039289Z" + }, + "papermill": { + "duration": 0.026939, + "end_time": "2020-10-23T07:01:24.040385", + "exception": false, + "start_time": "2020-10-23T07:01:24.013446", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/input/rl-assignment/samplesubmission.csv\n" + ] + } + ], + "source": [ + "# This Python 3 environment comes with many helpful analytics libraries installed\n", + "# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n", + "# For example, here's several helpful packages to load\n", + "\n", + "import numpy as np # linear algebra\n", + "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", + "\n", + "# Input data files are available in the read-only \"../input/\" directory\n", + "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n", + "\n", + "import os\n", + "for dirname, _, filenames in os.walk('/kaggle/input'):\n", + " for filename in filenames:\n", + " print(os.path.join(dirname, filename))\n", + "\n", + "# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n", + "# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0", + "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a", + "execution": { + "iopub.execute_input": "2020-10-23T07:01:24.069878Z", + "iopub.status.busy": "2020-10-23T07:01:24.068972Z", + "iopub.status.idle": "2020-10-23T07:01:25.495962Z", + "shell.execute_reply": "2020-10-23T07:01:25.494876Z" + }, + "papermill": { + "duration": 1.44331, + "end_time": "2020-10-23T07:01:25.496099", + "exception": false, + "start_time": "2020-10-23T07:01:24.052789", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---------+\n", + "|\u001b[34;1mR\u001b[0m: |\u001b[43m \u001b[0m: :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |B: |\n", + "+---------+\n", + "\n" + ] + } + ], + "source": [ + "import gym\n", + "\n", + "env = gym.make(\"Taxi-v3\").env\n", + "\n", + "env.reset() # reset environment to a new, random state\n", + "env.render()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:01:25.526480Z", + "iopub.status.busy": "2020-10-23T07:01:25.525487Z", + "iopub.status.idle": "2020-10-23T07:01:25.530094Z", + "shell.execute_reply": "2020-10-23T07:01:25.529110Z" + }, + "papermill": { + "duration": 0.022214, + "end_time": "2020-10-23T07:01:25.530278", + "exception": false, + "start_time": "2020-10-23T07:01:25.508064", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Action Space Discrete(6)\n", + "State Space Discrete(500)\n" + ] + } + ], + "source": [ + "# action space\n", + "print(\"Action Space {}\".format(env.action_space))\n", + "\n", + "print(\"State Space {}\".format(env.observation_space))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:01:25.561002Z", + "iopub.status.busy": "2020-10-23T07:01:25.560068Z", + "iopub.status.idle": "2020-10-23T07:01:25.563851Z", + "shell.execute_reply": "2020-10-23T07:01:25.564479Z" + }, + "papermill": { + "duration": 0.022719, + "end_time": "2020-10-23T07:01:25.564666", + "exception": false, + "start_time": "2020-10-23T07:01:25.541947", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "State: 328\n", + "+---------+\n", + "|\u001b[35mR\u001b[0m: | : :G|\n", + "| : | : : |\n", + "| : : : : |\n", + "| |\u001b[43m \u001b[0m: | : |\n", + "|\u001b[34;1mY\u001b[0m| : |B: |\n", + "+---------+\n", + "\n" + ] + } + ], + "source": [ + "# state encoding\n", + "\n", + "state = env.encode(3, 1, 2, 0) # (taxi row, taxi column, passenger index, destination index)\n", + "print(\"State:\", state)\n", + "\n", + "env.s = state\n", + "env.render()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:01:25.599957Z", + "iopub.status.busy": "2020-10-23T07:01:25.599051Z", + "iopub.status.idle": "2020-10-23T07:01:25.604442Z", + "shell.execute_reply": "2020-10-23T07:01:25.603711Z" + }, + "papermill": { + "duration": 0.027519, + "end_time": "2020-10-23T07:01:25.604618", + "exception": false, + "start_time": "2020-10-23T07:01:25.577099", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: [(1.0, 428, -1, False)],\n", + " 1: [(1.0, 228, -1, False)],\n", + " 2: [(1.0, 348, -1, False)],\n", + " 3: [(1.0, 328, -1, False)],\n", + " 4: [(1.0, 328, -10, False)],\n", + " 5: [(1.0, 328, -10, False)]}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# rewards table\n", + "env.P[328]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:01:25.639997Z", + "iopub.status.busy": "2020-10-23T07:01:25.638924Z", + "iopub.status.idle": "2020-10-23T07:01:25.643756Z", + "shell.execute_reply": "2020-10-23T07:01:25.642988Z" + }, + "papermill": { + "duration": 0.025446, + "end_time": "2020-10-23T07:01:25.643881", + "exception": false, + "start_time": "2020-10-23T07:01:25.618435", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0.]])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Defining q table\n", + "\n", + "import numpy as np\n", + "q_table = np.zeros([env.observation_space.n, env.action_space.n])\n", + "q_table" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:01:25.677831Z", + "iopub.status.busy": "2020-10-23T07:01:25.676776Z", + "iopub.status.idle": "2020-10-23T07:01:25.680343Z", + "shell.execute_reply": "2020-10-23T07:01:25.679723Z" + }, + "papermill": { + "duration": 0.022979, + "end_time": "2020-10-23T07:01:25.680493", + "exception": false, + "start_time": "2020-10-23T07:01:25.657514", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# hyperparameters\n", + "alpha = 0.1\n", + "gamma = 0.6\n", + "epsiolon = 0.1" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:01:25.765603Z", + "iopub.status.busy": "2020-10-23T07:01:25.726090Z", + "iopub.status.idle": "2020-10-23T07:10:37.138058Z", + "shell.execute_reply": "2020-10-23T07:10:37.138886Z" + }, + "papermill": { + "duration": 551.443876, + "end_time": "2020-10-23T07:10:37.139105", + "exception": false, + "start_time": "2020-10-23T07:01:25.695229", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 999999 Iterations: 14810058\r\n" + ] + } + ], + "source": [ + "import random\n", + "\n", + "max_epochs = 1000000 # stops after x epochs or max_iterations\n", + "max_iterations = -1 # 1000000 # -1 to not stop based on iterations\n", + "\n", + "iteration = 0\n", + "for epoch in range(max_epochs):\n", + " done = False\n", + " new_state = env.reset()\n", + " \n", + " while not done and (iteration < max_iterations or max_iterations == -1):\n", + " iteration += 1\n", + " old_state = new_state\n", + " if random.uniform(0,1) < epsiolon:\n", + " action = env.action_space.sample()\n", + " else:\n", + " action = np.argmax(q_table[old_state])\n", + " \n", + " new_state, reward, done, info = env.step(action)\n", + " env.s = new_state # update state of the environment (not sure if )\n", + " \n", + " q_table[old_state, action] = q_table[old_state][action] + alpha * (reward + gamma * np.max(q_table[new_state]) - q_table[old_state][action])\n", + " \n", + " if iteration >= max_iterations and max_iterations != -1:\n", + " break\n", + "print(\"Epoch: {} Iterations: {}\\r\".format(epoch, iteration))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:10:37.176308Z", + "iopub.status.busy": "2020-10-23T07:10:37.175458Z", + "iopub.status.idle": "2020-10-23T07:10:37.179942Z", + "shell.execute_reply": "2020-10-23T07:10:37.180484Z" + }, + "papermill": { + "duration": 0.026804, + "end_time": "2020-10-23T07:10:37.180659", + "exception": false, + "start_time": "2020-10-23T07:10:37.153855", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0. , 0. , 0. , 0. ,\n", + " 0. , 0. ],\n", + " [ -2.41837066, -2.3639511 , -2.41837066, -2.3639511 ,\n", + " -2.27325184, -11.3639511 ],\n", + " [ -1.870144 , -1.45024 , -1.870144 , -1.45024 ,\n", + " -0.7504 , -10.45024 ],\n", + " ...,\n", + " [ -0.75955193, 0.416 , -0.75945955, -1.44283176,\n", + " -9.1295566 , -9.26328213],\n", + " [ -2.26879216, -2.1220864 , -2.24661946, -2.1220864 ,\n", + " -10.7816137 , -10.43290413],\n", + " [ 5.6 , 2.36 , 5.6 , 11. ,\n", + " -3.4 , -3.4 ]])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "q_table" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:10:37.220686Z", + "iopub.status.busy": "2020-10-23T07:10:37.219859Z", + "iopub.status.idle": "2020-10-23T07:10:37.228862Z", + "shell.execute_reply": "2020-10-23T07:10:37.229575Z" + }, + "papermill": { + "duration": 0.033495, + "end_time": "2020-10-23T07:10:37.229780", + "exception": false, + "start_time": "2020-10-23T07:10:37.196285", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| :\u001b[43m \u001b[0m: : : |\n", + "| | : | : |\n", + "|Y| : |\u001b[34;1mB\u001b[0m: |\n", + "+---------+\n", + " (East)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : :\u001b[43m \u001b[0m: : |\n", + "| | : | : |\n", + "|Y| : |\u001b[34;1mB\u001b[0m: |\n", + "+---------+\n", + " (East)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : :\u001b[43m \u001b[0m: |\n", + "| | : | : |\n", + "|Y| : |\u001b[34;1mB\u001b[0m: |\n", + "+---------+\n", + " (East)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : |\u001b[43m \u001b[0m: |\n", + "|Y| : |\u001b[34;1mB\u001b[0m: |\n", + "+---------+\n", + " (South)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |\u001b[34;1m\u001b[43mB\u001b[0m\u001b[0m: |\n", + "+---------+\n", + " (South)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |\u001b[42mB\u001b[0m: |\n", + "+---------+\n", + " (Pickup)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : |\u001b[42m_\u001b[0m: |\n", + "|Y| : |B: |\n", + "+---------+\n", + " (North)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : :\u001b[42m_\u001b[0m: |\n", + "| | : | : |\n", + "|Y| : |B: |\n", + "+---------+\n", + " (North)\n", + "+---------+\n", + "|R: | : :\u001b[35mG\u001b[0m|\n", + "| : | :\u001b[42m_\u001b[0m: |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |B: |\n", + "+---------+\n", + " (North)\n", + "+---------+\n", + "|R: | :\u001b[42m_\u001b[0m:\u001b[35mG\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |B: |\n", + "+---------+\n", + " (North)\n", + "+---------+\n", + "|R: | : :\u001b[35m\u001b[42mG\u001b[0m\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |B: |\n", + "+---------+\n", + " (East)\n", + "+---------+\n", + "|R: | : :\u001b[35m\u001b[34;1m\u001b[43mG\u001b[0m\u001b[0m\u001b[0m|\n", + "| : | : : |\n", + "| : : : : |\n", + "| | : | : |\n", + "|Y| : |B: |\n", + "+---------+\n", + " (Dropoff)\n" + ] + } + ], + "source": [ + "# example game\n", + "\n", + "new_state = env.reset()\n", + "\n", + "done = False\n", + "max_iterations = 100\n", + "iteration = 0\n", + "while not done and (iteration <= max_iterations or max_iterations == -1):\n", + " old_state = new_state\n", + " action = np.argmax(q_table[old_state])\n", + " new_state, reward, done, info = env.step(action)\n", + " env.s = new_state\n", + " env.render()\n", + " iteration += 1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2020-10-23T07:10:37.269410Z", + "iopub.status.busy": "2020-10-23T07:10:37.268454Z", + "iopub.status.idle": "2020-10-23T07:10:37.659363Z", + "shell.execute_reply": "2020-10-23T07:10:37.658561Z" + }, + "papermill": { + "duration": 0.413907, + "end_time": "2020-10-23T07:10:37.659523", + "exception": false, + "start_time": "2020-10-23T07:10:37.245616", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IdValue
010.00
120.00
230.00
340.00
450.00
.........
299529962.36
299629975.60
2997299811.00
29982999-3.40
29993000-3.40
\n", + "

3000 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " Id Value\n", + "0 1 0.00\n", + "1 2 0.00\n", + "2 3 0.00\n", + "3 4 0.00\n", + "4 5 0.00\n", + "... ... ...\n", + "2995 2996 2.36\n", + "2996 2997 5.60\n", + "2997 2998 11.00\n", + "2998 2999 -3.40\n", + "2999 3000 -3.40\n", + "\n", + "[3000 rows x 2 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#generate output file\n", + "df = pd.DataFrame(q_table.ravel())\n", + "\n", + "df.index += 1\n", + "df.to_csv(\"q_table.csv\", index_label=\"Id\", header=[\"Value\"])\n", + "df\n", + "\n", + "# load data again to test correct file format\n", + "pd.read_csv(\"q_table.csv\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + }, + "papermill": { + "duration": 559.137382, + "end_time": "2020-10-23T07:10:37.784395", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2020-10-23T07:01:18.647013", + "version": "2.1.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}