{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MNIST-Neural Network-Two Hidden Layers with Backward Propagation" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/Users/yhhan/git/aiclass/0.Professor/3.VanillaNN/MNIST_data/train-images-idx3-ubyte.gz\n", "/Users/yhhan/git/aiclass/0.Professor/3.VanillaNN/MNIST_data/train-labels-idx1-ubyte.gz\n", "/Users/yhhan/git/aiclass/0.Professor/3.VanillaNN/MNIST_data/t10k-images-idx3-ubyte.gz\n", "/Users/yhhan/git/aiclass/0.Professor/3.VanillaNN/MNIST_data/t10k-labels-idx1-ubyte.gz\n", "Converting train-images-idx3-ubyte.gz to NumPy Array ...\n", "Done\n", "Converting train-labels-idx1-ubyte.gz to NumPy Array ...\n", "Done\n", "Converting t10k-images-idx3-ubyte.gz to NumPy Array ...\n", "Done\n", "Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...\n", "Done\n", "Creating pickle file ...\n", "Done!\n" ] } ], "source": [ "# coding: utf-8\n", "import urllib.request\n", "import os.path\n", "import gzip\n", "import pickle\n", "import os\n", "import numpy as np\n", "\n", "url_base = 'http://yann.lecun.com/exdb/mnist/'\n", "key_file = {\n", " 'train_img':'train-images-idx3-ubyte.gz',\n", " 'train_label':'train-labels-idx1-ubyte.gz',\n", " 'test_img':'t10k-images-idx3-ubyte.gz',\n", " 'test_label':'t10k-labels-idx1-ubyte.gz'\n", "}\n", "\n", "dataset_dir = os.path.dirname(\"/Users/yhhan/git/aiclass/0.Professor/3.VanillaNN/MNIST_data/.\")\n", "save_file = dataset_dir + \"/mnist.pkl\"\n", "\n", "train_num = 60000\n", "test_num = 10000\n", "img_dim = (1, 28, 28)\n", "img_size = 784\n", "\n", "def _download(file_name):\n", " file_path = dataset_dir + \"/\" + file_name\n", " print(file_path)\n", " if os.path.exists(file_path):\n", " return\n", "\n", " print(\"Downloading \" + file_name + \" ... \")\n", " urllib.request.urlretrieve(url_base + file_name, file_path)\n", " print(\"Done\")\n", " \n", "def download_mnist():\n", " for v in key_file.values():\n", " _download(v)\n", " \n", "def _load_label(file_name):\n", " file_path = dataset_dir + \"/\" + file_name\n", " \n", " print(\"Converting \" + file_name + \" to NumPy Array ...\")\n", " with gzip.open(file_path, 'rb') as f:\n", " labels = np.frombuffer(f.read(), np.uint8, offset=8)\n", " print(\"Done\")\n", " \n", " return labels\n", "\n", "def _load_img(file_name):\n", " file_path = dataset_dir + \"/\" + file_name\n", " \n", " print(\"Converting \" + file_name + \" to NumPy Array ...\") \n", " with gzip.open(file_path, 'rb') as f:\n", " data = np.frombuffer(f.read(), np.uint8, offset=16)\n", " data = data.reshape(-1, img_size)\n", " print(\"Done\")\n", " \n", " return data\n", " \n", "def _convert_numpy():\n", " dataset = {}\n", " dataset['train_img'] = _load_img(key_file['train_img'])\n", " dataset['train_label'] = _load_label(key_file['train_label'])\n", " dataset['test_img'] = _load_img(key_file['test_img'])\n", " dataset['test_label'] = _load_label(key_file['test_label'])\n", "\n", " dataset['validation_img'] = dataset['train_img'][55000:]\n", " dataset['validation_label'] = dataset['train_label'][55000:]\n", " dataset['train_img'] = dataset['train_img'][:55000]\n", " dataset['train_label'] = dataset['train_label'][:55000]\n", " return dataset\n", "\n", "def init_mnist():\n", " download_mnist()\n", " dataset = _convert_numpy()\n", " print(\"Creating pickle file ...\")\n", " with open(save_file, 'wb') as f:\n", " pickle.dump(dataset, f, -1)\n", " print(\"Done!\")\n", "\n", "def _change_one_hot_label(X):\n", " T = np.zeros((X.size, 10))\n", " for idx, row in enumerate(T):\n", " row[X[idx]] = 1\n", " \n", " return T\n", "\n", "def load_mnist(normalize=True, flatten=True, one_hot_label=False):\n", " if not os.path.exists(save_file):\n", " init_mnist()\n", " \n", " with open(save_file, 'rb') as f:\n", " dataset = pickle.load(f)\n", " \n", " if normalize:\n", " for key in ('train_img', 'validation_img', 'test_img'):\n", " dataset[key] = dataset[key].astype(np.float32)\n", " dataset[key] /= 255.0\n", " \n", " if one_hot_label:\n", " dataset['train_label'] = _change_one_hot_label(dataset['train_label'])\n", " dataset['validation_label'] = _change_one_hot_label(dataset['validation_label'])\n", " dataset['test_label'] = _change_one_hot_label(dataset['test_label'])\n", " \n", " if not flatten:\n", " for key in ('train_img', 'validation_img', 'test_img'):\n", " dataset[key] = dataset[key].reshape(-1, 1, 28, 28)\n", "\n", " return (dataset['train_img'], dataset['train_label']), (dataset['validation_img'], dataset['validation_label']), (dataset['test_img'], dataset['test_label']) \n", "\n", "\n", "if __name__ == '__main__':\n", " init_mnist()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Each Layer Definition with Forward and Backward Functions" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "\n", "def softmax(x):\n", " if x.ndim == 2:\n", " x = x.T\n", " x = x - np.max(x, axis=0)\n", " y = np.exp(x) / np.sum(np.exp(x), axis=0)\n", " return y.T \n", "\n", " x = x - np.max(x)\n", " return np.exp(x) / np.sum(np.exp(x))\n", "\n", "def cross_entropy_error(y, t):\n", " #print(y.shape, t.shape)\n", " if y.ndim == 1:\n", " y = y.reshape(1, y.size)\n", " t = t.reshape(1, t.size)\n", "\n", " if t.size == y.size:\n", " t = t.argmax(axis=1)\n", "\n", " batch_size = y.shape[0]\n", " return -np.sum(np.log(y[np.arange(batch_size), t])) / batch_size\n", "\n", "class Relu:\n", " def __init__(self):\n", " self.mask = None\n", "\n", " def forward(self, x):\n", " self.mask = (x <= 0)\n", " out = x.copy()\n", " out[self.mask] = 0\n", " return out\n", "\n", " def backward(self, din):\n", " din[self.mask] = 0\n", " dx = din\n", " return dx\n", "\n", "class Sigmoid:\n", " def __init__(self):\n", " self.out = None\n", "\n", " def forward(self, x):\n", " out = sigmoid(x)\n", " self.out = out\n", " return out\n", "\n", " def backward(self, din):\n", " dx = din * self.out * (1.0 - self.out)\n", " return dx\n", "\n", "class Affine:\n", " def __init__(self, W, b):\n", " self.W = W\n", " self.b = b \n", " self.x = None\n", " self.dW = None\n", " self.db = None\n", "\n", " def forward(self, x):\n", " self.x = x\n", " out = np.dot(self.x, self.W) + self.b\n", " return out\n", "\n", " def backward(self, din):\n", " dx = np.dot(din, self.W.T)\n", " self.dW = np.dot(self.x.T, din)\n", " self.db = np.sum(din, axis=0)\n", " return dx\n", "\n", "class SoftmaxWithCrossEntropyLoss:\n", " def __init__(self):\n", " self.loss = None\n", " self.y = None\n", " self.t = None\n", " \n", " def forward(self, x, t):\n", " self.t = t\n", " self.y = softmax(x)\n", " self.loss = cross_entropy_error(self.y, self.t)\n", " return self.loss\n", "\n", " def backward(self, din=1):\n", " batch_size = self.t.shape[0]\n", " dx = (self.y - self.t) / float(batch_size) \n", " return dx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multilayer Neural Network Model" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sys, os\n", "from collections import OrderedDict\n", "from scipy import stats\n", "from pandas import DataFrame\n", "\n", "class TwoLayerNet2:\n", " def __init__(self, input_size, hidden_layer1_size, hidden_layer2_size, output_size, weight_init_std = 0.01):\n", " self.params = {}\n", " self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_layer1_size)\n", " self.params['b1'] = np.zeros(hidden_layer1_size)\n", " self.params['W2'] = weight_init_std * np.random.randn(hidden_layer1_size, hidden_layer2_size)\n", " self.params['b2'] = np.zeros(hidden_layer2_size)\n", " self.params['W3'] = weight_init_std * np.random.randn(hidden_layer2_size, output_size)\n", " self.params['b3'] = np.zeros(output_size)\n", "\n", " self.layers = OrderedDict()\n", " self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])\n", " self.layers['Relu1'] = Relu()\n", " self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])\n", " self.layers['Relu2'] = Relu()\n", " self.layers['Affine3'] = Affine(self.params['W3'], self.params['b3'])\n", "\n", " self.lastLayer = SoftmaxWithCrossEntropyLoss()\n", " \n", " def predict(self, x):\n", " for layer in self.layers.values():\n", " x = layer.forward(x)\n", " \n", " return x\n", " \n", " def loss(self, x, t):\n", " y = self.predict(x)\n", " return self.lastLayer.forward(y, t)\n", " \n", " def accuracy(self, x, t):\n", " y = self.predict(x)\n", " y = np.argmax(y, axis=1)\n", " if t.ndim != 1 : t = np.argmax(t, axis=1)\n", " \n", " accuracy = np.sum(y == t) / float(x.shape[0])\n", " return accuracy\n", " \n", " def backpropagation_gradient(self, x, t):\n", " # forward\n", " self.loss(x, t)\n", "\n", " # backward\n", " din = 1\n", " din = self.lastLayer.backward(din)\n", " \n", " layers = list(self.layers.values())\n", " layers.reverse()\n", " for layer in layers:\n", " din = layer.backward(din)\n", "\n", " grads = {}\n", " grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db\n", " grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db\n", " grads['W3'], grads['b3'] = self.layers['Affine3'].dW, self.layers['Affine3'].db\n", "\n", " return grads\n", " \n", " def learning(self, learning_rate, x_batch, t_batch):\n", " grads = self.backpropagation_gradient(x_batch, t_batch)\n", " for key in ('W1', 'b1', 'W2', 'b2', 'W3', 'b3'):\n", " self.params[key] -= learning_rate * grads[key]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Learning and Validation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0, Train Error: 2.30146, Validation Error: 2.30121 - Test Accuracy: 0.11350\n", "Epoch: 1, Train Error: 2.30005, Validation Error: 2.29964 - Test Accuracy: 0.11350\n", "Epoch: 2, Train Error: 2.29561, Validation Error: 2.29504 - Test Accuracy: 0.11350\n", "Epoch: 3, Train Error: 2.26272, Validation Error: 2.26201 - Test Accuracy: 0.21120\n", "Epoch: 4, Train Error: 1.97740, Validation Error: 1.97533 - Test Accuracy: 0.31750\n", "Epoch: 5, Train Error: 1.31977, Validation Error: 1.29441 - Test Accuracy: 0.57490\n", "Epoch: 6, Train Error: 0.82184, Validation Error: 0.77294 - Test Accuracy: 0.73140\n", "Epoch: 7, Train Error: 0.66929, Validation Error: 0.60766 - Test Accuracy: 0.78420\n", "Epoch: 8, Train Error: 0.60268, Validation Error: 0.53676 - Test Accuracy: 0.81470\n", "Epoch: 9, Train Error: 0.55257, Validation Error: 0.48464 - Test Accuracy: 0.83680\n", "Epoch: 10, Train Error: 0.50546, Validation Error: 0.43600 - Test Accuracy: 0.84990\n", "Epoch: 11, Train Error: 0.46836, Validation Error: 0.39603 - Test Accuracy: 0.86340\n", "Epoch: 12, Train Error: 0.44337, Validation Error: 0.36955 - Test Accuracy: 0.87040\n", "Epoch: 13, Train Error: 0.42318, Validation Error: 0.34989 - Test Accuracy: 0.87490\n", "Epoch: 14, Train Error: 0.40508, Validation Error: 0.33356 - Test Accuracy: 0.88100\n", "Epoch: 15, Train Error: 0.38784, Validation Error: 0.31895 - Test Accuracy: 0.88550\n", "Epoch: 16, Train Error: 0.37120, Validation Error: 0.30469 - Test Accuracy: 0.89110\n", "Epoch: 17, Train Error: 0.35518, Validation Error: 0.29114 - Test Accuracy: 0.89530\n", "Epoch: 18, Train Error: 0.33928, Validation Error: 0.27833 - Test Accuracy: 0.90160\n", "Epoch: 19, Train Error: 0.32360, Validation Error: 0.26630 - Test Accuracy: 0.90650\n", "Epoch: 20, Train Error: 0.30836, Validation Error: 0.25512 - Test Accuracy: 0.90960\n", "Epoch: 21, Train Error: 0.29371, Validation Error: 0.24458 - Test Accuracy: 0.91310\n", "Epoch: 22, Train Error: 0.27967, Validation Error: 0.23461 - Test Accuracy: 0.91770\n", "Epoch: 23, Train Error: 0.26670, Validation Error: 0.22520 - Test Accuracy: 0.92140\n", "Epoch: 24, Train Error: 0.25436, Validation Error: 0.21634 - Test Accuracy: 0.92370\n", "Epoch: 25, Train Error: 0.24250, Validation Error: 0.20792 - Test Accuracy: 0.92680\n", "Epoch: 26, Train Error: 0.23119, Validation Error: 0.20012 - Test Accuracy: 0.93110\n", "Epoch: 27, Train Error: 0.22083, Validation Error: 0.19293 - Test Accuracy: 0.93380\n", "Epoch: 28, Train Error: 0.21109, Validation Error: 0.18617 - Test Accuracy: 0.93580\n", "Epoch: 29, Train Error: 0.20227, Validation Error: 0.17990 - Test Accuracy: 0.93840\n", "Epoch: 30, Train Error: 0.19390, Validation Error: 0.17408 - Test Accuracy: 0.94140\n", "Epoch: 31, Train Error: 0.18592, Validation Error: 0.16860 - Test Accuracy: 0.94270\n", "Epoch: 32, Train Error: 0.17881, Validation Error: 0.16353 - Test Accuracy: 0.94420\n", "Epoch: 33, Train Error: 0.17206, Validation Error: 0.15881 - Test Accuracy: 0.94600\n", "Epoch: 34, Train Error: 0.16575, Validation Error: 0.15443 - Test Accuracy: 0.94840\n", "Epoch: 35, Train Error: 0.15973, Validation Error: 0.15041 - Test Accuracy: 0.95050\n", "Epoch: 36, Train Error: 0.15412, Validation Error: 0.14671 - Test Accuracy: 0.95200\n", "Epoch: 37, Train Error: 0.14879, Validation Error: 0.14324 - Test Accuracy: 0.95320\n", "Epoch: 38, Train Error: 0.14387, Validation Error: 0.14004 - Test Accuracy: 0.95420\n", "Epoch: 39, Train Error: 0.13927, Validation Error: 0.13700 - Test Accuracy: 0.95480\n", "Epoch: 40, Train Error: 0.13487, Validation Error: 0.13422 - Test Accuracy: 0.95530\n", "Epoch: 41, Train Error: 0.13099, Validation Error: 0.13162 - Test Accuracy: 0.95640\n", "Epoch: 42, Train Error: 0.12716, Validation Error: 0.12914 - Test Accuracy: 0.95750\n", "Epoch: 43, Train Error: 0.12347, Validation Error: 0.12678 - Test Accuracy: 0.95840\n", "Epoch: 44, Train Error: 0.12001, Validation Error: 0.12454 - Test Accuracy: 0.95940\n", "Epoch: 45, Train Error: 0.11670, Validation Error: 0.12243 - Test Accuracy: 0.95970\n", "Epoch: 46, Train Error: 0.11352, Validation Error: 0.12049 - Test Accuracy: 0.96030\n", "Epoch: 47, Train Error: 0.11044, Validation Error: 0.11867 - Test Accuracy: 0.96100\n", "Epoch: 48, Train Error: 0.10737, Validation Error: 0.11694 - Test Accuracy: 0.96130\n", "Epoch: 49, Train Error: 0.10462, Validation Error: 0.11525 - Test Accuracy: 0.96190\n" ] } ], "source": [ "import math\n", "\n", "(img_train, label_train), (img_validation, label_validation), (img_test, label_test) = load_mnist(flatten=True, normalize=True, one_hot_label=True)\n", "\n", "network = TwoLayerNet2(input_size=784, hidden_layer1_size=128, hidden_layer2_size=128, output_size=10)\n", "\n", "num_epochs = 50\n", "train_size = img_train.shape[0]\n", "batch_size = 1000\n", "learning_rate = 0.1\n", "\n", "train_error_list = []\n", "validation_error_list = []\n", "\n", "test_accuracy_list = []\n", "epoch_list = []\n", "\n", "num_batch = math.ceil(train_size / batch_size)\n", "\n", "for i in range(num_epochs):\n", "# batch_mask = np.random.choice(train_size, batch_size)\n", "# x_batch = img_train[batch_mask]\n", "# t_batch = label_train[batch_mask]\n", "# network.learning(learning_rate, x_batch, t_batch)\n", " for j in range(num_batch):\n", " x_batch = img_train[j * batch_size : j * batch_size + batch_size]\n", " t_batch = label_train[j * batch_size : j * batch_size + batch_size]\n", " network.learning(learning_rate, x_batch, t_batch)\n", "\n", " epoch_list.append(i)\n", " \n", " train_loss = network.loss(x_batch, t_batch)\n", " train_error_list.append(train_loss)\n", " \n", " validation_loss = network.loss(img_validation, label_validation)\n", " validation_error_list.append(validation_loss) \n", " \n", " test_accuracy = network.accuracy(img_test, label_test)\n", " test_accuracy_list.append(test_accuracy) \n", " \n", " print(\"Epoch: {0:5d}, Train Error: {1:7.5f}, Validation Error: {2:7.5f} - Test Accuracy: {3:7.5f}\".format(\n", " i,\n", " train_loss,\n", " validation_loss,\n", " test_accuracy\n", " ))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis with Graph" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJIAAAFACAYAAADnI1acAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8lOWd///XJ+EUwplAEIIMCgKpgkgEW2kNtSpalGrt\nFlvbLx4eLG1tt2v9rrQ/t7+63d2v23b9aVdbyreiPaxl21oquijFrlMPVMEDIic1gYDhIOdDOCbh\n8/vjnsAQkzCBTK6Z5P18PO7Hfbxm3nNNaaef3Nd1m7sjIiIiIiIiIiJyKjmhA4iIiIiIiIiISHZQ\nIUlERERERERERFKiQpKIiIiIiIiIiKREhSQREREREREREUmJCkkiIiIiIiIiIpISFZJERERERERE\nRCQlKiSJiIiIiIiIiEhKVEgSEREREREREZGUqJAkIiIiIiIiIiIp6RA6QHMVFBR4LBZrdrsDBw6Q\nn5/f8oEkJer/sNT/Yan/w1L/h3U6/f/666/vcPd+aYokp+l0foPp319Y6v/w9B2Epf4PS/0fVjp/\ng2VdISkWi/Haa681u108Hqe0tLTlA0lK1P9hqf/DUv+Hpf4P63T638w2pCeNnInT+Q2mf39hqf/D\n03cQlvo/LPV/WOn8DaahbSIiIiIiIiIikhIVkkREREREREREJCUqJImIiIiIiIiISEqybo4kERGR\nEKqrq6msrOTw4cOho2SVnj17smbNmgbPdenShaKiIjp27NjKqURERETkdKmQJCIikoLKykq6d+9O\nLBbDzELHyRr79++ne/fuHzru7uzcuZPKykqGDh0aIJmIiIiInA4NbRMREUnB4cOH6du3r4pILcTM\n6Nu3r+7wEhEREckyKiSJiIikSEWklqX+FBEREck+KiSJiIiIiIiIiEhKNEeSiIhIFti5cyeXX345\nAFu3biU3N5d+/foBsHTpUjp16nTK17jllluYNWsWI0aMSGtWEREREQF3qK6G2lo4dqzppbYWamqi\npbq68e0OHeCyy8J+LhWSEt5+/r9YvfJ/6JHfhx7dC+jRox/de/SjR5+z6N57AB179YEUfqSLiIik\nQ9++fVm+fDkA3/ve9+jWrRt33XXXSde4O+5OTk7DNxw/+uijac8prcfMJgMPArnAz939vnrnewNz\ngXOBw8Ct7r4yca4C2A/UAjXuXtKK0UVERE7p2DE4fDhajhyBo0ejdfJ2/XXdUtem/nL4cFSQaaiw\n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\njEpMozt1AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "[7 2 1 ..., 4 5 6]\n", "[7 2 1 ..., 4 5 6]\n", "Total Test Image: 10000, Number of False Prediction: 381\n", "Test Accuracy: 0.9619\n", "False Prediction Index: 8, Prediction: 6, Ground Truth: 5\n", "False Prediction Index: 124, Prediction: 4, Ground Truth: 7\n", "False Prediction Index: 149, Prediction: 9, Ground Truth: 2\n", "False Prediction Index: 151, Prediction: 8, Ground Truth: 9\n", "False Prediction Index: 233, Prediction: 7, Ground Truth: 8\n" ] }, { "data": { "image/png": "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\nvPLKK8Vs5513LmZ33nlnV9djfGv6nnn/+99fzJq2iD/33HOLWdOW2KusskoxK23jPHPmzOI5kydP\nLmaLFi0qZhtttFExe+yxx4oZjNRXv/rVYnb66acXsw984APF7Otf//qoZhq0//7v/y5mL730UjFr\n2iJ+woTyP6easqa/b6GTM844o5jdc889xeyKK64oZtOmTStmf/d3f1fMDjrooI7Hr7nmmuI5Ta6+\n+upitsMOO3R1mz/5yU+K2QknnNDVbY4XngkEAAAA0AIWgQAAAABawCIQAAAAQAtYBAIAAABoAYtA\nAAAAAC2Qcs79u1hK/btYg4ULFxazSZMmFbOmnYSadmC47rrritm9995bzBh/cs5p0DN0Uks3a9K0\ni+CUKVOK2e9+97sRX+vWW28tZp/+9KeL2de+9rURX2t5Pve5zxWzpp9zKzrd7N52221XzL73ve8V\nswMOOKCYNe0GOBamT5/e8fill15aPOfRRx8tZhtssEExe/bZZ4vZnnvuWczuuuuuYjae6Wb3tt56\n62J2yy23FLOnn366mJ188snFrGnnvn7aaaeditlnP/vZYrbLLrv0fJam2/z+97/f8+v1k26uONZb\nb71i1rQr11ZbbVXMSmsI55xzTvGcpp87l19+eTGbOHFiMWvaZa/psXzTbmoruuF00zOBAAAAAFrA\nIhAAAABAC1gEAgAAAGgBi0AAAAAALWARCAAAAKAFLAIBAAAAtMByt4hPKZ0XEdMiYmHO+Z1Dx46L\niI9HxG+GPu1zOefyPrB/uq0qtuxr+pqXLFnS8+s13eZ//ud/FrOf/vSnxaxpi+o5c+Z0PD579uzi\nOU0233zzYvaTn/ykmM2bN6+r641nvdxOczx2s61SKn9b3H777cVs++237+p6v/3tb4vZpptuWswW\nLVrU1fVWBLrZvaa/q1ZZZZVituOOOxaz5557blQzdbL77rsXs9KWtgsWLOjq9rbddttidtpppxWz\nyZMnF7Mtt9yymD344IPFbEWnm2Pj4osvLmYHHHBAV7fZ9Liv6fFur51wwgnFrOkx+UUXXVTMDj74\n4GL293//98XspptuKmZ77713Mbv22muLWS10c/ybPn16MWv6GVLS9Hi36d/nTdu5n3jiicXsmmuu\nGd5g40yvtoi/ICLe3+H4qTnnLYZ+LbeQQM9dELoJNbogdBNqdEHoJtTogtBN6JvlLgLlnH8YEb/r\nwyzACOgm1Ek3oU66CXXSTeiv0bwn0BEppftSSuellNbq2UTAaOkm1Ek3oU66CXXSTRgD3S4CnRkR\nb4mILSJifkScXPrElNKhKaW7U0p3d3ktYPh0E+qkm1An3YQ66SaMka4WgXLOC3LOr+acl0TE2RGx\nTcPnnpVznppzntrtkMDw6CbUSTehTroJddJNGDtdLQKllJbdvmKviJjVm3GA0dBNqJNuQp10E+qk\nmzB2hrNF/LcjYqeIWCciFkTEsUO/3yIickTMjYjDcs7zl3uxSrbs+/rXv17M/uVf/qWPk6z4fvOb\n3xSzpq2t999//zGYpn493k5z3HWzrTbbbLNidv/993d1m7///e+L2Z577lnMfvzjH3d1vRWdbnbv\nyiuvLGZNfw984xvf6PksU6ZMKWZ33HFHMVu8eHHH49ttt13xnKeffnr4gy1j0003LWY333xzMSvN\nGBGx6667FrPHH398eINVSjfHxsSJE4vZVlttVcyatlx+4xvfOKqZeqVpO+lTTz21mDV9bX/4wx+K\n2YQJE4rZF7/4xWK20krl/xd/9NFHF7Na6Ob4t+aaaxazW2+9tePxpp8fTd/zS5YsKWYbbrhhMXvq\nqaeKWVsNp5vln1p/upHpHQ6f29VEQM/oJtRJN6FOugl10k3or9HsDgYAAADACsIiEAAAAEALWAQC\nAAAAaAGLQAAAAAAtYBEIAAAAoAWWu0V8Ty9WyZZ9K6+8cjHbcssti9mll15azJq2h2za1q5pq7wV\nXdP31nHHHVfMvvSlL43BNHXo5XaavVRLN9vqkksuKWb7779/MXv++eeL2ec///liNhZbc6/odLN7\nU6dOLWZN28cfccQRxez6668vZnvssUcxO/nkk4tZU19KPZszZ07xnLEwFtvHb7311sXshRdeGN5g\nA6SbdVl33XWL2Sc+8Yli9uY3v7mr67388ssdjx9//PHFc5q6vmjRoq7m6NYqq6xSzK644opidt99\n9xWzY445ZlQz9YputtsZZ5zR8fgnP/nJ4jkplb9lmv7dOGXKlGJmi/jXG043x+8KBAAAAAD/xyIQ\nAAAAQAtYBAIAAABoAYtAAAAAAC1gEQgAAACgBSwCAQAAALRAK7eI77f3ve99xWzixInFrGkb9b/5\nm78ZzUgDN3PmzGK211579XGS/rKdZruttdZaHY8vWLCgeM7KK69czL7whS8UsxNPPHH4g6GbY+Tf\n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\nKZAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "# Draw Graph about Error Values & Accuracy Values\n", "def draw_error_values_and_accuracy(epoch_list, train_error_list, validation_error_list, test_accuracy_list):\n", " # Draw Error Values and Accuracy\n", " fig = plt.figure(figsize=(20, 5))\n", " plt.subplot(121)\n", " plt.plot(epoch_list[1:], train_error_list[1:], 'r', label='Train')\n", " plt.plot(epoch_list[1:], validation_error_list[1:], 'g', label='Validation')\n", " plt.ylabel('Total Error')\n", " plt.xlabel('Epochs')\n", " plt.grid(True)\n", " plt.legend(loc='upper right')\n", "\n", " plt.subplot(122)\n", " plt.plot(epoch_list[1:], test_accuracy_list[1:], 'b', label='Test')\n", " plt.ylabel('Accuracy')\n", " plt.xlabel('Epochs')\n", " plt.yticks(np.arange(0.0, 1.0, 0.05))\n", " plt.grid(True)\n", " plt.legend(loc='lower right')\n", " plt.show()\n", "\n", "draw_error_values_and_accuracy(epoch_list, train_error_list, validation_error_list, test_accuracy_list)\n", " \n", "def draw_false_prediction(diff_index_list):\n", " fig = plt.figure(figsize=(20, 5))\n", " for i in range(5):\n", " j = diff_index_list[i]\n", " print(\"False Prediction Index: %s, Prediction: %s, Ground Truth: %s\" % (j, prediction[j], ground_truth[j]))\n", " img = np.array(img_test[j])\n", " img.shape = (28, 28)\n", " plt.subplot(150 + (i+1))\n", " plt.imshow(img, cmap='gray')\n", " \n", "prediction = np.argmax(network.predict(img_test), axis=1)\n", "ground_truth = np.argmax(label_test, axis=1)\n", " \n", "print(prediction)\n", "print(ground_truth)\n", "\n", "diff_index_list = []\n", "for i in range(len(img_test)):\n", " if (prediction[i] != ground_truth[i]):\n", " diff_index_list.append(i)\n", "\n", "print(\"Total Test Image: {0}, Number of False Prediction: {1}\".format(len(img_test), len(diff_index_list)))\n", "print(\"Test Accuracy:\", float(len(img_test) - len(diff_index_list)) / float(len(img_test)))\n", "draw_false_prediction(diff_index_list)" ] } ], "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.0" } }, "nbformat": 4, "nbformat_minor": 0 }