knuckletouch/python/Step_39_CNN-Ensemble-Report...

397 lines
16 KiB
Plaintext
Raw Permalink Normal View History

2019-08-07 23:57:12 +02:00
{
"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",
"%matplotlib inline\n",
"import pandas as pd\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",
"from collections import Counter\n",
"\n",
"target_names = [\"Knuckle\", \"Finger\"]\n",
"\n",
"tf.__version__"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_pickle(\"DataStudyEvaluation/df_statistics.pkl\")\n",
"\n",
"lst = df.userID.unique()\n",
"df[\"GestureId\"] = df.TaskID % 17\n",
"\n",
"#df_train = dfAll[dfAll.userID.isin(train_ids)]\n",
"#df_test = dfAll[dfAll.userID.isin(test_ids)]\n",
"\n",
"x = np.concatenate(df.Blobs.values).reshape(-1,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": [
"x = np.stack(df.Blobs)\n",
"x = x.reshape(-1, 27, 15, 1)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# convert class vectors to binary class matrices (one-hot notation)\n",
"num_classes = 2\n",
"y = tf.keras.utils.to_categorical(df.InputMethod, num_classes)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Label for image 1 is: [1. 0.]')"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"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": 6,
"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": 7,
"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": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 16 s, sys: 1.39 s, total: 17.4 s\n",
"Wall time: 12.5 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": 9,
"metadata": {},
"outputs": [],
"source": [
"df[\"InputMethodPred\"] = lst\n",
"df.InputMethodPred = df.InputMethodPred.apply(lambda x: np.argmax(x))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"df = df.groupby([\"userID\", \"TaskID\", \"VersionID\"])[[\"InputMethodPred\", \"InputMethod\"]].agg(lambda x: x.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"df.InputMethod = df.InputMethod.apply(lambda x: Counter(x).most_common()[0][0])\n",
"df.InputMethodPred = df.InputMethodPred.apply(lambda x: Counter(x).most_common()[0][0])"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>userID</th>\n",
" <th>TaskID</th>\n",
" <th>VersionID</th>\n",
" </tr>\n",
" <tr>\n",
" <th>InputMethod</th>\n",
" <th>InputMethodPred</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">0</th>\n",
" <th>0</th>\n",
" <td>1882</td>\n",
" <td>1882</td>\n",
" <td>1882</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>102</td>\n",
" <td>102</td>\n",
" <td>102</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1</th>\n",
" <th>0</th>\n",
" <td>28</td>\n",
" <td>28</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2499</td>\n",
" <td>2499</td>\n",
" <td>2499</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userID TaskID VersionID\n",
"InputMethod InputMethodPred \n",
"0 0 1882 1882 1882\n",
" 1 102 102 102\n",
"1 0 28 28 28\n",
" 1 2499 2499 2499"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby([\"InputMethod\", \"InputMethodPred\"]).count()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1882 102]\n",
" [ 28 2499]]\n",
"[[0.94858871 0.05141129]\n",
" [0.01108033 0.98891967]]\n",
"Accuray: 0.971\n",
"Recall: 0.969\n",
"Precision: 0.956\n",
"F1-Score: 0.971\n",
" precision recall f1-score support\n",
"\n",
" Knuckle 0.99 0.95 0.97 1984\n",
" Finger 0.96 0.99 0.97 2527\n",
"\n",
" accuracy 0.97 4511\n",
" macro avg 0.97 0.97 0.97 4511\n",
"weighted avg 0.97 0.97 0.97 4511\n",
"\n"
]
}
],
"source": [
"print(sklearn.metrics.confusion_matrix(df.InputMethod.values, df.InputMethodPred.values, labels=[0, 1]))\n",
"cm = sklearn.metrics.confusion_matrix(df.InputMethod.values, df.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.InputMethod.values, df.InputMethodPred.values))\n",
"print(\"Recall: %.3f\" % metrics.recall_score(df.InputMethod.values, df.InputMethodPred.values, average=\"macro\"))\n",
"print(\"Precision: %.3f\" % metrics.average_precision_score(df.InputMethod.values, df.InputMethodPred.values, average=\"macro\"))\n",
"print(\"F1-Score: %.3f\" % metrics.f1_score(df.InputMethod.values, df.InputMethodPred.values, average=\"macro\"))\n",
"print(sklearn.metrics.classification_report(df.InputMethod.values, df.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
}