{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.simplefilter(action='ignore')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. 数据预处理" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "x_train_flatten = x_train.reshape(x_train.shape[0], 784).astype('float32')\n", "x_test_flatten = x_test.reshape(x_test.shape[0], 784).astype('float32')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "x_train_normalize = x_train_flatten / 255.0\n", "x_test_normalize = x_test_flatten / 255.0" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "y_train_one_hot = tf.keras.utils.to_categorical(y_train)\n", "y_test_one_hot = tf.keras.utils.to_categorical(y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. 建立模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1 建立 Sequential 模型" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Dense(units=1000, input_dim=784, kernel_initializer='normal', activation='relu'), # 输入层-隐藏层(这里隐藏层为1000个神经元)\n", " tf.keras.layers.Dropout(0.5), # 添加 Dropout 层\n", " tf.keras.layers.Dense(units=10, kernel_initializer='normal', activation='softmax') # 输出层\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2 查看模型的摘要" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense (Dense) (None, 1000) 785000 \n", "_________________________________________________________________\n", "dropout (Dropout) (None, 1000) 0 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 10) 10010 \n", "=================================================================\n", "Total params: 795,010\n", "Trainable params: 795,010\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "None\n" ] } ], "source": [ "print(model.summary())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. 训练模型" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 48000 samples, validate on 12000 samples\n", "Epoch 1/10\n", " - 6s - loss: 12.5889 - acc: 0.2132 - val_loss: 8.5766 - val_acc: 0.4606\n", "Epoch 2/10\n", " - 6s - loss: 8.9286 - acc: 0.4399 - val_loss: 6.4463 - val_acc: 0.5967\n", "Epoch 3/10\n", " - 6s - loss: 7.3299 - acc: 0.5411 - val_loss: 5.2655 - val_acc: 0.6690\n", "Epoch 4/10\n", " - 6s - loss: 6.1830 - acc: 0.6118 - val_loss: 4.8476 - val_acc: 0.6966\n", "Epoch 5/10\n", " - 6s - loss: 5.5846 - acc: 0.6496 - val_loss: 4.5499 - val_acc: 0.7151\n", "Epoch 6/10\n", " - 7s - loss: 5.2927 - acc: 0.6680 - val_loss: 4.4172 - val_acc: 0.7237\n", "Epoch 7/10\n", " - 6s - loss: 4.6555 - acc: 0.7070 - val_loss: 3.3079 - val_acc: 0.7922\n", "Epoch 8/10\n", " - 6s - loss: 4.2692 - acc: 0.7315 - val_loss: 3.1796 - val_acc: 0.7995\n", "Epoch 9/10\n", " - 6s - loss: 4.0309 - acc: 0.7461 - val_loss: 3.1166 - val_acc: 0.8041\n", "Epoch 10/10\n", " - 6s - loss: 3.7557 - acc: 0.7634 - val_loss: 2.8592 - val_acc: 0.8195\n" ] } ], "source": [ "train_history = model.fit(x=x_train_normalize, y=y_train_one_hot, validation_split=0.2,\n", " epochs=10, batch_size=200, verbose=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. 以图形显示训练过程" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def show_train_history(train_history, train, validation):\n", " plt.plot(train_history.history[train])\n", " plt.plot(train_history.history[validation])\n", " plt.title('Train History')\n", " plt.xlabel('Epoch')\n", " plt.ylabel(train)\n", " plt.legend(['train', 'validation'], loc='upper left')\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_train_history(train_history, 'acc', 'val_acc')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_train_history(train_history, 'loss', 'val_loss')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. 评估模型的准确率" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000/10000 [==============================] - 1s 91us/step\n", "\n", "accuracy: 0.8217\n" ] } ], "source": [ "scores = model.evaluate(x_test_normalize, y_test_one_hot)\n", "print()\n", "print('accuracy:', scores[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. 进行预测" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.1 执行预测" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "predictions = model.predict_classes(x_test_normalize)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.2 预测结果" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([9, 2, 1, ..., 4, 5, 6])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.3 定义函数以显示10项预测结果" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def plot_images_labels_prediction(images, labels, predictions, idx, num=10):\n", " \"\"\"\n", " images: 数字图像数组\n", " labels: 真实值数组\n", " predictions: 预测结果数据\n", " idx: 开始显示的数据index\n", " num: 要显示的数据项数, 默认为10, 不超过25\n", " \"\"\"\n", " fig = plt.gcf()\n", " fig.set_size_inches(12, 14)\n", " if num > 25:\n", " num = 25\n", " for i in range(0, num):\n", " ax = plt.subplot(5, 5, i+1)\n", " ax.imshow(images[idx], cmap='binary')\n", " title = 'lable=' + str(labels[idx])\n", " if len(predictions) > 0:\n", " title += ',predict=' + str(predictions[idx])\n", " ax.set_title(title, fontsize=10)\n", " ax.set_xticks([])\n", " ax.set_yticks([])\n", " idx += 1\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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Xu7fv7+X//a3v3l52rRpXl62bJmXJ0yYkHaMYcOGFVwXKs+rr77q5WbN0u8zbL/99g1VDkrkvffe8/Jdd93l5ebNm3t53rx5Xp4+fbqXzz333CJWh4byyiuvpD03cOBALy9fvryBqvnan/70Jy93797dy9/85jcbspyCcGcWAAAA0aIzCwAAgGjRmQUAAEC0GDOLihCOLZsyZUrW9Xv27Jn2XDjmtaqqystt27b18hdffOHlPffc08sLFizw8urVq7PWhKZr/vz5Xg7bmpQ+pg6N38qVK7186qmnlqkSNCaPP/542nPr1q0rQyW+8Gfg3Xff7eUHHnigIcspCHdmAQAAEC06swAAAIgWnVkAAABEq9GNmZ08ebKXw3n4tttuOy+3atXKy4MHD07b5zbbbOPlLl261KdENEL//Oc/veyc83I4RjbTmKVtt922oGOOGjXKy6+//nrW9Y844oiC9o/KtWjRIi/feuutXj7llFMashwUwS233JL23NSpU7380ksv1esYs2fP9nJ4nZOkXr16eblfv371Oibqb/369V5+9NFHy1RJdn369PHy6NGjvfzpp596uU2bNiWvKV/cmQUAAEC06MwCAAAgWnRmAQAAEK1GN2b20ksv9XKhn088duzYtOe22GILL/fo0aPguoot/IzjoUOHejkcu4LsfvjDH3p52bJlXt5888293L59+3ofc9KkSV4O550FavPGG294ORyLNmjQoIYsB0Vw4YUXpj3XvHnzoh7j4YcfzpolqVOnTl7+wx/+4OXdd9+9qDUht6efftrLc+bMSVvnsssua6hyavXRRx95ecmSJV7+z3/+42XGzAIAAABFQGcWAAAA0aIzCwAAgGg1ujGz48eP93L4+fbheNfXXnvNy6+++mraPmfNmuXl559/3svhGKN33nknr1o3atmyZdpzVVVVXg7nQQ1rCMfQMma2fjp37lz0fd50001efvPNN7Ouv+eee2bNaLpuvPFGL1dXV3uZ//+N3+GHH+7lTHO+btiwoV7HCH+OhGMUV6xYkbbN22+/7eU99tjDy1999VW9akJu4TzSJ5xwgpczzXU/bNiwktaUj2nTppW7hDrjziwAAACiRWcWAAAA0aIzCwAAgGg1ujGzBx10UNYc6t+/f859rlmzxsvhuNpwfFqhn5+96aabpj3XtWtXL3fr1s3L4XxuO+64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MbPh5yLPmzcv6/qjR4/28o477lj0mlBc4VzAU6dObfAaws/nrotwbtpmzbL//nnkkUd6uU+fPjmPsc8++xReWBM3ZcoUL4dzUYfzSO63334lrwnFNXDgQC/feOONXl61alVDliNJqqqq8nL37t3T1rnrrru8nGmsPipfOCdxMeYobsy4MwsAAIBo0ZkFAABAtOjMAgAAIFpNYszsihUrvHzooYdmXX/UqFFe5nPV4/Pwww97ORzv9sUXXxS8z9dee83Lhc4Je/rpp6c917lz56zbHHPMMV7ONEYOpfWf//wn7bmZM2dm3ea4447zcl3mB0V5hf83J02a5OVwHP7NN99c8pr+93//18vnnntuyY+JOH3++ec512ndunUDVNIwuDMLAACAaNGZBQAAQLTozAIAACBaTWLM7J133unlcAxtKJwTstLnZ2sKcn2uel1MnDix6PtE4xPO9StJW265pZePOuooL19wwQUlrQkNr1+/fllzpvdijBs3zsvTp0/38g9/+EMvn3nmmV52znm5R48e+RWLJu+ee+7xcnjNkqQRI0Y0VDklx51ZAAAARIvOLAAAAKJFZxYAAADRqrgxs7Nnz0577rbbbitDJQAqQaYxs3Pnzi1DJWjM+vfvn9dzQEPYY489vHzRRRelrXPggQc2VDklx51ZAAAARIvOLAAAAKJFZxYAAADRojMLAACAaFXcG8CeffbZtOf+/e9/Z92mS5cuXm7btm1RawIAAGgo4Qd0VDruzAIAACBadGYBAAAQLTqzAAAAiFbFjZnNR+/evb385JNPerl9+/YNWQ4AAADqiDuzAAAAiBadWQAAAESLziwAAACiVXFjZn/5y1/m9RwAAADix51ZAAAARIvOLAAAAKJFZxYAAADRMudc/iubrZS0onTloAF1ds51KMWOaScVh7aCfNBOkC/aCvKRdzspqDMLAAAANCYMMwAAAEC06MwCAAAgWnRmAQAAEC06swAAAIgWnVkAAABEi84sAAAAokVnFgAAANGiMwsAAIBo0ZkFAABAtOjMAgAAIFp0ZgEAABAtOrMAAACIFp1ZAAAARIvOLAAAAKJFZxYAAADRojMLAACAaNGZBQAAQLTozAIAACBadGYBAAAQLTqzAAAAiBadWQAAAESLziwAAACiRWcWAAAA0aIzCwAAgGjRmQUAAEC06MwCAAAgWnRmAQAA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27zcvn37QkpEGYTf83C86z777JO2Tf/+/b28ySabeLldu3Zebtu2rZfXrl3r5R/84AdezjTedc899/Tyrrvu6uVwjvM2bdqk7QMNb9GiRV4O5yB++OGHvbxy5cp6H/P555/3cjj/ddeuXb0ctvHf/OY3Xg7bd0PiziwAAACiRWcWAAAA0aIzCwAAgGgxZjaDhQsXejkcjxlq0SL9y3jYYYcVtSb4PvzwQy8/9NBDWde/++67vdyhQ4ei11QX4RjZQw45JOv6AwcO9PLmm29e9JqaunCccjhHcV088MADXp45c6aXw3lrwzG2UnnHozVFn376qZfD/5sLFizw8tSpU3Pus2/fvl5+9dVXvVxdXe3lcP7iHXbYwcuZ5g5F4xP2KcLxsJI0adIkL3/88cdZ9xm2hX333dfLYVu66aab0vax++67e/mFF17wcnjte/TRR73cq1cvL4fz1jYk/icAAAAgWnRmAQAAEC06swAAAIgWY2YzCOdzyyXXOEcU389//nMvT5gwwcu77babl4877riS11QXzz77rJfff/99L5922mle/vGPf1zympqaFStWePmee+7JuU04Vqxjx45e/vOf/5x1+3A8XDhOd/DgwWnbbLPNNjnrQt198cUXXj7ppJO8HI6RHTZsmJcPPvjggo8ZjmsMderUqeB9ovzOPPNML0+ZMsXL+cwRG7an7373u16+/vrrvdyqVaus+5s7d27ac3fccYeXw5838+fP93J4DTr77LO9fMwxx3i5Id+bwp1ZAAAARIvOLAAAAKJFZxYAAADRojMLAACAaPEGsAyeeeaZrK+Hk5eHA7FRemaWNW+//fZeLseE85999pmXM7WTcPLs8DzCD3tA8YVvcvjkk0+83K9fv7RtwmvE559/7uWJEyd6+Ve/+pWXly1b5uXwjX9HHXVU2jHDD1po37592jrI39q1a70c/v+cPn26l8M3s1x66aVe3myzzYpYHRqz8P/7jTfe6OW77rrLy845L3/jG99I2+eQIUO8HLavNm3aFFxnTZk+/GX9+vVevuqqq7z8gx/8wMvLly+vVw2lxJ1ZAAAARIvOLAAAAKJFZxYAAADRYsyspDlz5ng50+TCNYVjo3r37l30mlA/M2bM8PKhhx7q5S233DJtm3DMUqFmzZqVNT///PM599FYP9yhkq1bt87L4bjliy66KOc+wgnLf/rTn3p58uTJXn7rrbe8HI6pyzT+shzjvivZ1KlTvTxy5Egvd+7c2cuzZ8/2crt27UpTGBq98Np+0003eTn8/xy+hyPTBzN973vfq1dNGzZs8PLf//53L59yyilp2wwYMMDLa9asKeiYJ598spcz/VxtKNyZBQAAQLTozAIAACBadGYBAAAQLcbMSnrppZcKWr++YytRfxdccIGXn3rqKS+/9957Xg7nBQ3HNEnSI488Uq+awn2GYy8z2XHHHb3MnMUN7/e//33W1//4xz+mPXf00UcXdIx58+YVtP73v//9tOfatm1b0D6QXfheidCuu+7q5R122KGU5SAi4fyszZs3z7p+y5YtvfzCCy+krROOq1+6dGnWfbZu3drLr7/+etZcVVWVto9wfutcOnbs6OXhw4d7OTzPhsSdWQAAAESLziwAAACiRWcWAAAA0WLMrHKPmQ3nTjv77LNLWQ7ysPvuu3t50aJFXp4/f76XH3vsMS+Hn6UtpX9e9qmnnlpQTeGce7vsskvObfbaay8vh2NoUXonnniil8Ox05muD+F4trD9TZkyxcvh/I3hNSV8fdy4cWnHDNtXjx490tZB/sIxiqGZM2d6Ofzc+iOPPNLL4RhbVK6DDjrIywcccICX//znP3t5xYoVXj7//PMLPmaLFn53LRy3m0s+42ObNfPvbw4cONDLt9xyi5e33XbbgmooJe7MAgAAIFp0ZgEAABAtOrMAAACIVpMcM/vss896eeLEiVnXDz+Dm/kGG5+tttrKy+EYpjDfcMMNRa/hb3/7m5fDeWd79+6dts2oUaOKXgcKc/DBB3s5/P++cOHCtG26d+/u5VxzCh9yyCFevv322718xBFHePnNN99M20c4Xm3s2LFZj4nsVq5c6eXwe7hu3Tovh2Nmr732Wi+fddZZacfYc889vfz3v//dy126dPHyd77znSwVS0uWLPFy375909bh51PphXO8hmPk//Wvf3l55MiRXn7uuefS9rn11lt7uVOnTl4O2+OCBQu8nGnu2kKdeeaZXg7nPQ/H+jcm3JkFAABAtOjMAgAAIFp0ZgEAABCtJjlmdvXq1V4OxzaGwvFuQCZXX321l8MxeJnmtu3QoUNJa0Ju7du39/KDDz7o5WOPPTZtm48//tjL4TUknEcyHKPdqlUrL4fzOf7qV79KO+bjjz/u5bfeesvLzFFcmEsuucTLv/71rwvafsOGDV4Ox0HX9lwxhXNjS9L+++/v5QceeKCkNSBdOLY0HDNbDKeccoqXc42Z3WKLLdKeGz16tJd/8pOfeLl58+Z1K64MuDMLAACAaNGZBQAAQLTozAIAACBaTXLMbDgmLhSOd/nZz35WynIQqbAd3XfffV4OxyiF8wiicQrnnZ08eXLaOuHc1OE1Ixw/HY6RDV1++eVefv3119PWeeSRR7IeI2x/yC4cx3j88cd7efDgwV7+8ssvvfzuu+96ORxD2xA+/PDDtOfC61LPnj29PHz48JLWhNII33NR6FjoO+64I+25k046qV41NSbcmQUAAEC06MwCAAAgWnRmAQAAEC06swAAAIhWk3gDWDhQP3zzRmiHHXbw8h577FH0mhC/mTNnZn19wIABXt5tt91KWQ5KJHxDWG3P1Ufr1q29PGjQoLR1wjeAPf30017+6KOPvBx+GAR84YTw4XX+zTffzLr9k08+6eXwDWKSdOWVV3r5xRdfLKDCugk/wOPll18u+TFRfOPHj/fytdde6+VM7a2m8I1/xxxzTHEKa6S4MwsAAIBo0ZkFAABAtOjMAgAAIFpNYszsnDlzvByOKQodddRRpSwHFSIcM9umTRsvX3LJJQ1ZDipIOIG/JE2bNs3L4aTpt912m5dHjBhR/MLwXwcddFDOdebPn+/lcMxsy5YtvXzaaad5+YwzzvDymDFjvJzr/R+IR9g2fv7zn3v53//+d9btN998cy+HH5Kw6aab1qO6xo87swAAAIgWnVkAAABEi84sAAAAotUkxsyuXr066+tVVVVevvDCC0tZDiI1duxYL7///vte7tixo5eZVxZ11axZ+n2GoUOHennq1KleDuc0PeGEE7y88847F6c45O3QQw/18rBhw7wczhU6btw4L//1r3/18qxZswquYfvtty94GzS86dOne/mTTz7Jun74Ho1wTP0+++xTnMIiwZ1ZAAAARIvOLAAAAKJFZxYAAADRahJjZh9//PGsr3/zm9/0crt27UpZDiIVjpk1My8ffvjhWbfPNE/gmjVrvNypU6c6VodK17t3by9fc801Xg7nNf7lL3/p5QkTJni5devWRawOmXTv3t3LgwYN8vKkSZOybv/0009nfb1Fi/Qf4QMGDPDyDTfckHUfaHiZfhbceOONBe3jxz/+sZf333//+pQUPe7MAgAAIFp0ZgEAABAtOrMAAACIVsWNmQ3n7ZOkZcuWZd2mVatWXg4/LxvIRzh+LRyjGH6uuiT17NnTy/fdd1/xC0NFOuWUU7x85513evnhhx/2cjhn6S677FKawvBf4bjkm2++2cvh2MmXX37Zyx988IGXq6urvRy2ASl9vmGU39q1a70cjqWWpC+++CLrPnr16uXlsC01ddyZBQAAQLTozAIAACBadGYBAAAQrYobM5vpM8332GMPLy9ZssTLO+20U0lrQtNw1113eXn8+PFe/p//+Z+0bS6//PKS1oTK1aFDBy8/8cQTXu7cubOXR44c6eWJEyeWpjDUqmPHjl6eMWOGl3/3u995ee7cuV4Ox8N+4xvfKF5xKJmnnnrKy//4xz8K3sfo0aO9HL7Xp6njziwAAACiRWcWAAAA0aIzCwAAgGhV3JjZ5s2bpz133XXXednMvLzbbruVtCZUhltvvdXLV1xxhZf79evn5SFDhnh5q622StvnJptsUqTq0NR16tTJy4cccoiXp02b5uXXXnvNyz169ChNYcjbySefnDUjTnV5b8TQoUO9fOCBBxarnIrEnVkAAABEi84sAAAAokVnFgAAANGiMwsAAIBoVdwbwDLZbrvtvHz33XeXqRLEbN999/VyOBE20JhMnjzZy7169fLysmXLvMwbwIDS+Oijj3KuE34AxoUXXliqcioSd2YBAAAQLTqzAAAAiBadWQAAAESrSYyZBYCmZosttvDy22+/XaZKgKbt4osvzpql9A9W2HbbbUtaU6XhziwAAACiRWcWAAAA0aIzCwAAgGgxZhYAAKBELrrooqwZ9cedWQAAAESLziwAAACiRWcWAAAA0TLnXP4rm62UtKJ05aABdXbOdSjFjmknFYe2gnzQTpAv2grykXc7KagzCwAAADQmDDMAAABAtOjMAgAAIFp0ZgEAABAtOrMAAACIFp1ZAAAARIvOLAAAAKJFZxYAAADRojMLAACAaNGZBQAAQLT+P7vBlmrkZfIJAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_images_labels_prediction(x_test, y_test, predictions, idx=0, num=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7. 显示混淆矩阵" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.1 建立混淆矩阵" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "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", "
predict0123456789
label
09560110214051
101103141126071
219390818923033010
35318895151601417
410439110251532
51047278798240104
613321817914000
73129573643267913732
819142742194531475320
9199611438337900
\n", "
" ], "text/plain": [ "predict 0 1 2 3 4 5 6 7 8 9\n", "label \n", "0 956 0 1 1 0 2 14 0 5 1\n", "1 0 1103 14 1 1 2 6 0 7 1\n", "2 19 3 908 18 9 2 30 3 30 10\n", "3 5 3 18 895 1 51 6 0 14 17\n", "4 1 0 4 3 911 0 25 1 5 32\n", "5 10 4 7 27 8 798 24 0 10 4\n", "6 13 3 2 1 8 17 914 0 0 0\n", "7 31 29 57 36 43 2 6 79 13 732\n", "8 19 14 27 42 19 45 31 4 753 20\n", "9 19 9 6 11 43 8 3 3 7 900" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.crosstab(y_test, predictions, rownames=['label'], colnames=['predict'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2 建立真实值与预测 DataFrame" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "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", "
labelpredict
079
122
\n", "
" ], "text/plain": [ " label predict\n", "0 7 9\n", "1 2 2" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'label': y_test, 'predict': predictions})\n", "df[:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.3 查询真实值是 \"5\" 但预测值是 \"2\" 的数据" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "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", "
labelpredict
103252
632452
638552
639252
670652
754252
779752
\n", "
" ], "text/plain": [ " label predict\n", "1032 5 2\n", "6324 5 2\n", "6385 5 2\n", "6392 5 2\n", "6706 5 2\n", "7542 5 2\n", "7797 5 2" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[(df.label==5)&(df.predict==2)]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIgAAACTCAYAAABVq1EKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAB+RJREFUeJzt3VtoFFcYB/D/pylUjXmoG4xW6yIihYq3LqVe0KQPpdZLlPah1RcRRJBipBf0QfRNFGmjqQTF2L6o9CaK1RZsLdGCKRhqEjVaWySJKGpTQU1tscrpQ44652TzzU72ktX9/yBkvt25nJn9c+ZkdzMjxhgQ9WZAfzeA8hsDQioGhFQMCKkYEFIxIKTKakBEpCvk+biInO3luXoRSaS5/XIRuSUiTfZnfTrri7DdNhGJ2emTIfMuFZGREdZdKSItdn8aRWRmuu3VFGVz5XniZ2PMvHRXIiJFxpj7UZczxkwPmWUpgLMArqa4ymMADhljjIhMBPAVgBejtitVOTnFiEixiBwTkV9F5IyIVAaeLhKRvSJyXkS+EZHBSZZ/XUQa7PJfi0hxhtvXJSLVInLOtrPUPl4vIltFpBFAlYiUish+ETllf2bY+YaJyFG7fB0ACa47ML3G7n+ziGwSkbcBJADstT3CoLC2GmO6zON3N4cAyO47ncaYrP0A6LK/iwCU2OkYgD/QfRDjdgdn2Oc+A/Chna5H98GLATgBYIh9fA2A9Xa6GkBTkp+19vlyAH8BaAbwPYCXemmnAbDETq8HsD3QhtrAfPsAzLTTLwA4b6drAm2aa9cX847BHAAnAQy29XPB/QxsQ90nO88iABcA3AQwLauvYY4C8gyA7QBa7M7+A6DMBqQjMP9rAA56AZkHoDNwoFoB7E5x+yUAiu30mwB+72W+BwCK7PRYAE2BNswOzHfDe9GuACi202MD891MEpCPASxPsm0nIBGP7ywAP2bzNczVGGQJgFIALxtj/hORNgDP2uf8LtKvBcAPxph3/ZWKSDWAiiTb+8IYs8kYc/vRSo35TkRqRSRmjOkMaW+wDX8HpgcAeNUY86/XjpDVpS5sn5xGGnNCRMamuE99k6MepArAp3a6At0vQByPTzHT7HN1AD7wepBSAB0AxtnHhwAYn+L2ywCInX7FrudhfQzA83baAHjHTq8LtLUebve/D8BHgXqy/V0DYJ2dnoPkp5g3kPwU8y2AigjHdFxgH6aiuxeTrL2GOQpIDEADgDMAPgdwPhCQCwD22Mf2Bw7goxcH3aeeU+g+RbUAWJDi9t8DcA7dY5BfAEy3jw8A0A5g0MN2AvgE3X9N/ASgtJeAxAB8advQCmCHfXwYgKN2W7vsup2A2Om1drkmABvtY28B+M0+NiiFfVpjt9Nkj+nMbL6GD5NYUERkAoBlxpj3bd1ljMnoX0ZPi4IMiI8B6R0DQip+FkMqBoRUDAipIr1RFovFTDwez1JTKJfa2trQ2dkZ+g5fpIDE43E0Njb2vVWUNxKJ1L5JwVMMqRgQUjEgpGJASMWAkIoBIRUDQioGhFQMCKkK4f9i0nbx4kWnXrFihVMvXry4xzLLly/PaptyhT0IqRgQUjEgpGJASMVBahL+oHTu3LlOfenSJadua2vrsQ4OUqkgMCCkYkBIxTEIgG3btjn11q1bnbqjo0NdfsyYMRlvU75gD0IqBoRUDAipCnIMcv++ey261tZWp25vb3dq/wIx48ePd+o9e/ZksHX5hT0IqRgQUjEgpCrIMciOHTucuq6uLtLysVjMqUeNGpV2m/IVexBSMSCkYkBIVRBjkKtX3evk796926n967SFXbdty5YtmWnYE4A9CKkYEFIxIKQqiDGI/9lKS0uLU4ddjH/BggVOPXXq1Mw07AnAHoRUDAipGBBSFcQYZOjQoU7tf5bS2anfi6ehocGp/f+bmTBhQhqty2/sQUjFgJCKASEVA0Kqghik+oPIhQsXOnXYF4b8QWxtba1aP03Yg5CKASEVA0KqSDc1TCQS5mm4X8zly5ed2r9Jkn9M/A/zRo4c6dSHDx/usY1Jkyal0cLsSyQSaGxsDL2hEHsQUjEgpGJASFUQ74P4Ro8e7dRVVVVOXV1drS5/5coVp/a/UAT0/JLSk4o9CKkYEFIxIKQqyDGIb8OGDU7t31PWv7vD3bt3nfratWs91rlq1SqnXrZsmVNPnjw5cjv7A3sQUjEgpGJASFWQn8VEtWjRIqeur6936tu3b4euY/jw4U7d3Nzs1KWlpX1rXB/xsxjKCAaEVAwIqfg+SAoOHDjg1Dt37nTqlStXhq7Df6/k3r176TcsB9iDkIoBIRUDQiqOQfpg4sSJ/d2EnGEPQioGhFQMCKkYEFI9cYPU48ePq8/Pnj0749vctWuXU2/cuNGpU/nAM8qHovmEPQipGBBSMSCkyvsxiH+nhsrKSqeeNWuWU9+4cSPyNg4dOuTU/jjn+vXrTu3fNTPZlZr9LyX72ygrK4vczv7AHoRUDAipGBBS5f0Y5MGDB059584dp/Yv3nLkyJG0txl2AZmSkhKn3rx5c491zJ8/36lHjBiRdrv6A3sQUjEgpGJASJX3Y5CBAwc6tX/+v3XrVsa36V9gZsqUKU7tX3CmoqIi423IF+xBSMWAkIoBIVXej0H8i9YePHjQqU+fPh26jpqaGqcuLy93av9LyKtXr47QwqcbexBSMSCkYkBIxQvIFCheQIYyggEhFQNCKgaEVAwIqRgQUjEgpGJASMWAkIoBIRUDQioGhFQMCKkYEFIxIKRiQEjFgJCKASEVA0IqBoRUkb60LCJ/AmjPXnMoh8YYY0JvtRkpIFR4eIohFQNCKgaEVAwIqRgQUjEgpGJASMWAkIoBIdX/rgW0dHsYsrgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_images_labels_prediction(x_test, y_test, predictions, idx=340, num=1)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_images_labels_prediction(x_test, y_test, predictions, idx=1289, num=1)" ] } ], "metadata": { "kernelspec": { "display_name": "tensorflow-keras-practice", "language": "python", "name": "tensorflow-keras-practice" }, "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.5" } }, "nbformat": 4, "nbformat_minor": 2 }