knuckletouch/python/Step_34_CNN-Report.ipynb

274 lines
13 KiB
Plaintext

{
"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": [
"<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": 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
}