{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.25.2) or chardet (3.0.4) doesn't match a supported version!\n", " RequestsDependencyWarning)\n" ] }, { "data": { "text/plain": [ "'1.13.1'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## USE for Multi GPU Systems\n", "#import os\n", "#os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import math\n", "\n", "import tensorflow as tf\n", "\n", "%matplotlib inline\n", "\n", "# Importing SK-learn to calculate precision and recall\n", "import sklearn\n", "from sklearn import metrics\n", "\n", "from sklearn.utils.multiclass import unique_labels\n", "\n", "target_names = [\"tap\", \"twotap\", \"swipeleft\", \"swiperight\", \"swipeup\", \"swipedown\", \"twoswipeup\", \"twoswipedown\", \"circle\", \"arrowheadleft\", \"arrowheadright\", \"checkmark\", \"flashlight\", \"l\", \"lmirrored\", \"screenshot\", \"rotate\"]\n", "\n", "\n", "target_names = [\"Tap\", \"Two tap\", \"Swipe left\", \"Swipe right\", \"Swipe up\", \"Swipe down\",\n", " \"Two swipe up\", \"Two swipe down\", \"Circle\", \"Arrowhead left\", \"Arrowhead right\",\n", " \"$\\checkmark$\", \"$\\Gamma$\", \"L\", \"L mirrored\", \"S\", \"Rotate\"]\n", "\n", "\n", "tf.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = pd.read_pickle(\"DataStudyEvaluation/df_lstm_norm50.pkl\")\n", "\n", "df.TaskID = df.TaskID % 17\n", "\n", "x = np.concatenate(df.Blobs.values).reshape(-1,50,27,15,1)\n", "x = x / 255.0\n", "\n", "# convert class vectors to binary class matrices (one-hot notation)\n", "num_classes = len(df.TaskID.unique())\n", "y = tf.keras.utils.to_categorical(df.TaskID, num_classes)\n", "\n", "labels = sorted(df.TaskID.unique())" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# If GPU is not available: \n", "# GPU_USE = '/cpu:0'\n", "#config = tf.ConfigProto(device_count = {\"GPU\": 1})\n", "\n", "# If GPU is available: \n", "config = tf.ConfigProto()\n", "config.log_device_placement = True\n", "config.allow_soft_placement = True\n", "config.gpu_options.allow_growth=True\n", "config.gpu_options.allocator_type = 'BFC'\n", "\n", "# Limit the maximum memory used\n", "config.gpu_options.per_process_gpu_memory_fraction = 0.3\n", "\n", "# set session config\n", "sess = tf.Session(config=config)\n", "tf.keras.backend.set_session(sess)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Colocations handled automatically by placer.\n", "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/core.py:143: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n", "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Use tf.cast instead.\n" ] } ], "source": [ "model = tf.keras.models.load_model('./ModelSnapshots/LSTM-v2-00398.h5')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 30.4 s, sys: 3.28 s, total: 33.7 s\n", "Wall time: 19.6 s\n" ] } ], "source": [ "%%time\n", "lst = []\n", "batch = 100\n", "for i in range(0, len(x), batch):\n", " _x = x[i : i+batch]\n", " lst.extend(model.predict(_x))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df[\"TaskIDPred\"] = lst\n", "df.TaskIDPred = df.TaskIDPred.apply(lambda x: np.argmax(x))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "df_eval = df" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[221 2 0 0 2 1 0 0 1 0 0 0 2 0 0 0 43]\n", " [ 3 297 0 0 0 1 1 0 0 0 0 0 0 0 0 0 13]\n", " [ 3 1 239 3 0 0 0 0 0 1 0 0 0 0 24 0 1]\n", " [ 2 1 1 244 0 0 0 5 1 0 0 3 5 5 3 0 4]\n", " [ 2 0 0 2 222 0 0 0 0 0 0 1 27 0 0 0 6]\n", " [ 5 0 0 0 0 246 0 1 1 0 0 2 4 21 0 2 3]\n", " [ 0 3 0 0 4 0 306 1 0 0 0 0 1 0 1 0 0]\n", " [ 0 6 0 0 1 12 2 306 0 0 0 0 6 1 0 0 0]\n", " [ 0 0 2 0 0 0 0 0 273 9 0 10 2 1 1 0 0]\n", " [ 1 0 4 1 0 0 0 0 11 249 2 4 0 9 0 8 1]\n", " [ 0 0 0 6 0 0 0 0 0 2 267 1 0 0 2 14 0]\n", " [ 1 0 0 1 4 0 0 1 19 1 0 247 4 0 1 0 0]\n", " [ 1 0 2 3 18 1 0 0 4 7 0 0 239 7 0 8 8]\n", " [ 0 0 0 3 1 6 0 0 5 5 0 7 2 272 0 0 0]\n", " [ 1 0 1 0 0 6 0 0 0 0 5 3 0 3 278 3 4]\n", " [ 0 0 8 0 0 1 0 0 6 10 5 0 3 1 21 250 1]\n", " [ 15 0 0 0 0 0 1 0 0 0 0 0 18 0 1 0 312]]\n", "[[0.8 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.2]\n", " [0. 0.9 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. ]\n", " [0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.9 0. 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0.9 0. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0.1 0. 0. 0. 0. 0. 0. 0. 0.8 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.9 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.9 0. 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.1 0.8 0. ]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0. 0.9]]\n", "Accuray: 0.886\n", "Recall: 0.885\n", "F1-Score: 0.886\n", " precision recall f1-score support\n", "\n", " Tap 0.87 0.81 0.84 272\n", " Two tap 0.96 0.94 0.95 315\n", " Swipe left 0.93 0.88 0.90 272\n", " Swipe right 0.93 0.89 0.91 274\n", " Swipe up 0.88 0.85 0.87 260\n", " Swipe down 0.90 0.86 0.88 285\n", " Two swipe up 0.99 0.97 0.98 316\n", " Two swipe down 0.97 0.92 0.94 334\n", " Circle 0.85 0.92 0.88 298\n", " Arrowhead left 0.88 0.86 0.87 290\n", "Arrowhead right 0.96 0.91 0.94 292\n", " $\\checkmark$ 0.89 0.89 0.89 279\n", " $\\Gamma$ 0.76 0.80 0.78 298\n", " L 0.85 0.90 0.88 301\n", " L mirrored 0.84 0.91 0.87 304\n", " S 0.88 0.82 0.85 306\n", " Rotate 0.79 0.90 0.84 347\n", "\n", " accuracy 0.89 5043\n", " macro avg 0.89 0.88 0.89 5043\n", " weighted avg 0.89 0.89 0.89 5043\n", "\n" ] } ], "source": [ "print(sklearn.metrics.confusion_matrix(df_eval.TaskID.values, df_eval.TaskIDPred.values, labels=labels))\n", "cm = sklearn.metrics.confusion_matrix(df_eval.TaskID.values, df_eval.TaskIDPred.values, labels=labels)\n", "cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", "print(np.round(cm,1))\n", "print(\"Accuray: %.3f\" % sklearn.metrics.accuracy_score(df_eval.TaskID.values, df_eval.TaskIDPred.values))\n", "print(\"Recall: %.3f\" % metrics.recall_score(df_eval.TaskID.values, df_eval.TaskIDPred.values, average=\"macro\"))\n", "#print(\"Precision: %.3f\" % metrics.average_precision_score(df_eval.TaskID.values, df_eval.TaskIDPred.values))\n", "print(\"F1-Score: %.3f\" % metrics.f1_score(df_eval.TaskID.values, df_eval.TaskIDPred.values, average=\"macro\"))\n", "print(sklearn.metrics.classification_report(df_eval.TaskID.values, df_eval.TaskIDPred.values, target_names=target_names))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Normalized confusion matrix\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_confusion_matrix(y_true, y_pred, classes,\n", " normalize=False,\n", " title=None,\n", " cmap=plt.cm.Blues):\n", " \"\"\"\n", " This function prints and plots the confusion matrix.\n", " Normalization can be applied by setting `normalize=True`.\n", " \"\"\"\n", " if not title:\n", " if normalize:\n", " title = 'Normalized confusion matrix'\n", " else:\n", " title = 'Confusion matrix, without normalization'\n", "\n", " # Compute confusion matrix\n", " cm = sklearn.metrics.confusion_matrix(y_true, y_pred)\n", " # Only use the labels that appear in the data\n", " #classes = classes[unique_labels(y_true, y_pred)]\n", " if normalize:\n", " cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", " print(\"Normalized confusion matrix\")\n", " else:\n", " print('Confusion matrix, without normalization')\n", "\n", " #print(cm)\n", "\n", " fig, ax = plt.subplots(figsize=(6,6))\n", " im = ax.imshow(cm, interpolation='nearest', cmap=cmap)\n", " #ax.figure.colorbar(im, ax=ax)\n", " # We want to show all ticks...\n", " ax.set(xticks=np.arange(cm.shape[1]),\n", " yticks=np.arange(cm.shape[0]),\n", " # ... and label them with the respective list entries\n", " xticklabels=classes, yticklabels=classes)\n", " #title=title,\n", " #ylabel='True label',\n", " #xlabel='Predicted label')\n", "\n", " # Rotate the tick labels and set their alignment.\n", " plt.setp(ax.get_xticklabels(), rotation=90, ha=\"right\",\n", " rotation_mode=\"anchor\")\n", "\n", " # Loop over data dimensions and create text annotations.\n", " fmt = '.0f' if normalize else 'd'\n", " thresh = cm.max() / 2.\n", " for i in range(cm.shape[0]):\n", " for j in range(cm.shape[1]):\n", " ax.text(j, i, format(cm[i, j]*100, fmt),\n", " ha=\"center\", va=\"center\",\n", " color=\"white\" if cm[i, j] > thresh else \"black\")\n", " fig.tight_layout()\n", " fig.savefig(\"./out/conf_matrix.pdf\", bbox_inches='tight', transparent=False, pad_inches=0)\n", " return ax\n", "\n", "plot_confusion_matrix(df_eval.TaskID.values, df_eval.TaskIDPred.values, classes=target_names, normalize=True,\n", " title='Normalized confusion matrix')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }