{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "## USE for Multi GPU Systems\n", "#import os\n", "#os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import tensorflow as tf\n", "\n", "# Importing SK-learn to calculate precision and recall\n", "import sklearn\n", "from sklearn import metrics\n", "\n", "target_names = [\"Knuckle\", \"Finger\"]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# the data, split between train and test sets\n", "df = pd.read_pickle(\"DataStudyEvaluation/df_blobs_area.pkl\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1, 3, 5, 6, 7, 8, 9, 10, 11, 12])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.userID.unique()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "x = np.vstack(df.Blobs)\n", "x = x.reshape(-1, 27, 15, 1)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# convert class vectors to binary class matrices (one-hot notation)\n", "num_classes = 2\n", "y = utils.to_categorical(df.InputMethod, num_classes)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Label for image 1 is: [1. 0.]')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "i = 1\n", "plt.imshow(x[i].reshape(27, 15)) #np.sqrt(784) = 28\n", "plt.title(\"Label for image %i is: %s\" % (i, y[i]))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# If GPU is not available: \n", "# GPU_USE = '/cpu:0'\n", "#config = tf.ConfigProto(device_count = {\"GPU\": 1})\n", "\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.4\n", "\n", "# set session config\n", "tf.keras.backend.set_session(tf.Session(config=config))" ] }, { "cell_type": "code", "execution_count": 11, "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": [ "loadpath = \"./ModelSnapshots/CNN-33767.h5\"\n", "model = tf.keras.models.load_model(loadpath)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 14.2 s, sys: 1.25 s, total: 15.5 s\n", "Wall time: 11 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": 13, "metadata": {}, "outputs": [], "source": [ "df[\"InputMethodPred\"] = lst\n", "df.InputMethodPred = df.InputMethodPred.apply(lambda x: np.argmax(x))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df_eval = df" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[21071 3651]\n", " [ 2096 57783]]\n", "[[0.85231777 0.14768223]\n", " [0.03500392 0.96499608]]\n", "Accuray: 0.932\n", "Recall: 0.909\n", "Precision: 0.932\n", "F1-Score: 0.916\n", " precision recall f1-score support\n", "\n", " Knuckle 0.91 0.85 0.88 24722\n", " Finger 0.94 0.96 0.95 59879\n", "\n", " accuracy 0.93 84601\n", " macro avg 0.93 0.91 0.92 84601\n", "weighted avg 0.93 0.93 0.93 84601\n", "\n" ] } ], "source": [ "print(sklearn.metrics.confusion_matrix(df_eval.InputMethod.values, df_eval.InputMethodPred.values, labels=[0, 1]))\n", "cm = sklearn.metrics.confusion_matrix(df_eval.InputMethod.values, df_eval.InputMethodPred.values, labels=[0, 1], )\n", "cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", "print(cm)\n", "print(\"Accuray: %.3f\" % sklearn.metrics.accuracy_score(df_eval.InputMethod.values, df_eval.InputMethodPred.values))\n", "print(\"Recall: %.3f\" % metrics.recall_score(df_eval.InputMethod.values, df_eval.InputMethodPred.values, average=\"macro\"))\n", "print(\"Precision: %.3f\" % metrics.average_precision_score(df_eval.InputMethod.values, df_eval.InputMethodPred.values, average=\"macro\"))\n", "print(\"F1-Score: %.3f\" % metrics.f1_score(df_eval.InputMethod.values, df_eval.InputMethodPred.values, average=\"macro\"))\n", "print(sklearn.metrics.classification_report(df_eval.InputMethod.values, df_eval.InputMethodPred.values, target_names=target_names))" ] }, { "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 }