├── test_images ├── labels.csv~ ├── 1.jpeg ├── 2.jpeg ├── 3.jpeg ├── 4.jpeg ├── 5.jpeg ├── 6.jpeg ├── 7.jpeg ├── 8.jpeg ├── 9.jpeg └── 10.jpeg ├── result_images ├── lenet.png ├── alexnet.png ├── testset.jpg ├── trainset.jpg ├── validset.jpg ├── GoogLeNet.png ├── inception.jpg ├── distribution.jpg ├── exploratory.jpg └── online image.jpg ├── signnames.csv ├── README.md ├── LeNet.ipynb └── GoogLeNet.ipynb /test_images/labels.csv~: -------------------------------------------------------------------------------- 1 | 00001_00005.ppm,32,32,6,6,27,27,0 2 | -------------------------------------------------------------------------------- /test_images/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/1.jpeg -------------------------------------------------------------------------------- /test_images/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/2.jpeg -------------------------------------------------------------------------------- /test_images/3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/3.jpeg -------------------------------------------------------------------------------- /test_images/4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/4.jpeg -------------------------------------------------------------------------------- /test_images/5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/5.jpeg -------------------------------------------------------------------------------- /test_images/6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/6.jpeg -------------------------------------------------------------------------------- /test_images/7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/7.jpeg -------------------------------------------------------------------------------- /test_images/8.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/8.jpeg -------------------------------------------------------------------------------- /test_images/9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/9.jpeg -------------------------------------------------------------------------------- /test_images/10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/test_images/10.jpeg -------------------------------------------------------------------------------- /result_images/lenet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/lenet.png -------------------------------------------------------------------------------- /result_images/alexnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/alexnet.png -------------------------------------------------------------------------------- /result_images/testset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/testset.jpg -------------------------------------------------------------------------------- /result_images/trainset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/trainset.jpg -------------------------------------------------------------------------------- /result_images/validset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/validset.jpg -------------------------------------------------------------------------------- /result_images/GoogLeNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/GoogLeNet.png -------------------------------------------------------------------------------- /result_images/inception.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/inception.jpg -------------------------------------------------------------------------------- /result_images/distribution.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/distribution.jpg -------------------------------------------------------------------------------- /result_images/exploratory.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/exploratory.jpg -------------------------------------------------------------------------------- /result_images/online image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liferlisiqi/Traffic-Sign-Classifier/HEAD/result_images/online image.jpg -------------------------------------------------------------------------------- /signnames.csv: -------------------------------------------------------------------------------- 1 | ClassId,SignName 2 | 0,Speed limit (20km/h) 3 | 1,Speed limit (30km/h) 4 | 2,Speed limit (50km/h) 5 | 3,Speed limit (60km/h) 6 | 4,Speed limit (70km/h) 7 | 5,Speed limit (80km/h) 8 | 6,End of speed limit (80km/h) 9 | 7,Speed limit (100km/h) 10 | 8,Speed limit (120km/h) 11 | 9,No passing 12 | 10,No passing for vehicles over 3.5 metric tons 13 | 11,Right-of-way at the next intersection 14 | 12,Priority road 15 | 13,Yield 16 | 14,Stop 17 | 15,No vehicles 18 | 16,Vehicles over 3.5 metric tons prohibited 19 | 17,No entry 20 | 18,General caution 21 | 19,Dangerous curve to the left 22 | 20,Dangerous curve to the right 23 | 21,Double curve 24 | 22,Bumpy road 25 | 23,Slippery road 26 | 24,Road narrows on the right 27 | 25,Road work 28 | 26,Traffic signals 29 | 27,Pedestrians 30 | 28,Children crossing 31 | 29,Bicycles crossing 32 | 30,Beware of ice/snow 33 | 31,Wild animals crossing 34 | 32,End of all speed and passing limits 35 | 33,Turn right ahead 36 | 34,Turn left ahead 37 | 35,Ahead only 38 | 36,Go straight or right 39 | 37,Go straight or left 40 | 38,Keep right 41 | 39,Keep left 42 | 40,Roundabout mandatory 43 | 41,End of no passing 44 | 42,End of no passing by vehicles over 3.5 metric tons 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Traffic Sign Classification 2 | 3 | ### Overview 4 | In this project, I used deep neural networks and three classic convolutional neural network architectures(LeNet, AlexNet and GoogLeNet) to classify traffic signs. I will train and validate a model so it can classify traffic sign images using the [German Traffic Sign Dataset](http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset). After the model is trained, I will then try out my model on images of German traffic signs that I find on the web. 5 | 6 | ### The goals / steps of this project are the following: 7 | * Load and explore the data set. 8 | * Realize LeNet architecture and use `ReLu`, `mini-batch gradient descent` and `dropout`. 9 | * Realize AlexNet and make some modifications, use `learning rate decay`, `Adam optimization` and `L2 regulization`. 10 | * Use GoogLeNet to classify traffic signs and make some modifications, use `inception` and `overlapping pooling` and `average pooling`. 11 | * Analyze the softmax probabilities of the new images 12 | * Summarize the results 13 | 14 | ### Dependencies 15 | python3.5 16 | matplotlib (2.1.1) 17 | opencv-python (3.3.1.11) 18 | numpy (1.13.3) 19 | tensorflow-gpu (1.4.1) 20 | sklearn (0.19.1) 21 | 22 | ### Dataset 23 | Download the [data set](https://d17h27t6h515a5.cloudfront.net/topher/2017/February/5898cd6f_traffic-signs-data/traffic-signs-data.zip). This is a pickled dataset in which the images are already resized to 32x32. It contains a training, validation and test set. 24 | 25 | 26 | [//]: # (Image References) 27 | [exploratory]: ./result_images/exploratory.jpg "exploratory" 28 | [distribution]: ./result_images/distribution.jpg "distribution" 29 | [lenet]: ./result_images/lenet.png "lenet" 30 | [alexnet]: ./result_images/alexnet.png "alexnet" 31 | [inception]: ./result_images/inception.jpg "inception" 32 | [googlenet]: ./result_images/GoogLeNet.png "googlenet" 33 | [image2]: ./test_images/1.jpg "Traffic Sign 1" 34 | [image3]: ./test_images/2.jpg "Traffic Sign 2" 35 | [image4]: ./test_images/3.jpg "Traffic Sign 3" 36 | [image5]: ./test_images/4.jpg "Traffic Sign 4" 37 | [image6]: ./test_images/5.jpg "Traffic Sign 5" 38 | [image7]: ./test_images/6.jpg "Traffic Sign 6" 39 | [image8]: ./test_images/7.jpg "Traffic Sign 7" 40 | [image9]: ./test_images/8.jpg "Traffic Sign 8" 41 | [image10]: ./test_images/9.jpg "Traffic Sign 9" 42 | [image11]: ./test_images/10.jpg "Traffic Sign 10" 43 | 44 | [Data pre-process.ipynb](https://github.com/liferlisiqi/Traffic-Sign-Classifier/blob/master/Data%20pre-process.ipynb) 45 | --- 46 | 47 | I used the numpy library to calculate summary statistics of the traffic signs data set: 48 | * The size of training set is: 34799 49 | * The size of the validation set is: 4410 50 | * The size of test set is: 12630 51 | * The shape of a traffic sign image is: (32, 32 ,3) 52 | * The number of unique classes/labels in the data set is: 43 53 | 54 | Here is an exploratory visualization of the training data set. 55 | ![alt text][exploratory] 56 | 57 | The distribution of training, validation and testing set is showing in the following bar charts. 58 | ![alt text][distribution] 59 | 60 | [LeNet.ipynb](https://github.com/liferlisiqi/Traffic-Sign-Classifier/blob/master/LeNet.ipynb) 61 | --- 62 | The [LeNet](http://219.216.82.193/cache/10/03/yann.lecun.com/b1a1c4acb57f1b447bfe36e103910875/lecun-01a.pdf) model is proposed by Yann LeCun in 1998, it is the most classific cnn model for image recognition, its architecture is as following: 63 | 64 | ![alt text][lenet] 65 | 66 | In the LeNet architecture I realized for traffic signs recognition, three tricks as used as follows: 67 | 68 | - 1 ReLu 69 | ReLu nonlinear function is used as the activation function after the convolutional layer. More information about ReLu and other activation functions can be find at [Lecture 6 | Training Neural Networks I](https://www.youtube.com/watch?v=wEoyxE0GP2M&index=6&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&t=0s). 70 | - 2 Mini-batch gradient descent 71 | Mini-batch gradient descent is the combine of batch gradient descent and stochastic gradient descent, it is based on the statistics to estimate the average of gradient of all the training data by a batch of selected samples. 72 | - 3 Dropout 73 | Dropout is a regularization technique for reducing overfitting in neural networks by preventing complex co-adaptations on training data. It is proposed in the paper [Dropout: A Simple Way to Prevent Neural Networks from Overfitting](http://219.216.82.193/cache/2/03/jmlr.org/9b2dcdb089f9b8f19cea175c9d6b5150/srivastava14a.pdf). It is usually after fully connected layers. Awkwardly, there is a very small problem that LeNet will not overfitting to trainging set sometimes. Thus the dropout will not play a big role or even make the model worse for simple like LeNet. And the training set error maybe be higher than validation set error while training. 74 | 75 | My LeNet consists of the following layers: 76 | 77 | | Layer | Description | Input | Output | 78 | |:---------------------:|:---------------------------------------------:|:---------:|:-----------:| 79 | | Convolution | kernel: 5x5; stride:1x1; padding: valid | 32x32x3 | 28x28x6 | 80 | | Max pooling | kernel: 2x2; stride:2x2; | 28x28x6 | 14x14x6 | 81 | | Convolution | kernel: 5x5; stride:1x1; padding: valid | 14x14x6 | 10x10x16 | 82 | | Max pooling | kernel: 2x2; stride:2x2; | 10x10x16 | 5x5x16 | 83 | | Flatten | Input 5x5x16 -> Output 400 | 5x5x16 | 400 | 84 | | Fully connected | connect every neurel with next layer | 400 | 120 | 85 | | Fully connected | connect every neurel with next layer | 120 | 80 | 86 | | Fully connected | output 43 probabilities for each lablel | 80 | 43 | 87 | 88 | 89 | ### Training 90 | I have turned the following three hyperparameters to train my model. 91 | LEARNING_RATE = 1e-2 92 | EPOCHS = 50 93 | BATCH_SIZE = 128 94 | It takes about 2 minutes to train the model on GetForce 750 ti. 95 | 96 | The results are: 97 | * accuracy of training set: 96.6% 98 | * accuracy of validation set: 92.0% 99 | * accuracy of test set: 89.7% 100 | 101 | We can see that the model is overfitting to the training data and the accuracy on validation set is a little lower than on training set. The LeNet model is efficient and simple, many cnn architectures are inspired by it, like AlexNet. 102 | 103 | [AlexNet.ipynb](https://github.com/liferlisiqi/Traffic-Sign-Classifier/blob/master/AlexNet.ipynb) 104 | --- 105 | 106 | [AlexNet](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf) is the first popularized CNN architecture in computer vision developed by Alex Krizhevsky, Geoffrey Hinton, and Ilya Sutskever. It is the champion of ImageNet ILSVRC challenge in 2012 and significantly outperformed the second runner-up. The AlexNet has a similar architecture with LeNet, but it is deeper and bigger. 107 | 108 | ![alt text][alexnet] 109 | 110 | Cause the input dimension and output dimension of traffic signs recognition on GTRSB is 32x32x3 and 43, which is different from the original dimension of AlexNet, so I made some change to fit the requirement. And the architecture I realized for recognizing traffic signs as the following table: 111 | 112 | | Layer | Description | Input | Output | 113 | |:---------------------:|:---------------------------------------------:|:---------:|:-----------:| 114 | | Convolution | kernel: 5x5; stride:1x1; padding: valid | 32x32x3 | 28x28x9 | 115 | | Max pooling | kernel: 2x2; stride:2x2; | 28x28x9 | 14x14x9 | 116 | | Convolution | kernel: 3x3; stride:1x1; padding: valid | 14x14x9 | 12x12x32 | 117 | | Max pooling | kernel: 2x2; stride:2x2; | 12x12x32 | 6x6x32 | 118 | | Convolution | kernel: 3x3; stride:1x1; padding: same | 6x6x32 | 6x6x48 | 119 | | Convolution | kernel: 3x3; stride:1x1; padding: same | 6x6x48 | 6x6x64 | 120 | | Convolution | kernel: 3x3; stride:1x1; padding: same | 6x6x64 | 6x6x96 | 121 | | Max pooling | kernel: 2x2; stride:2x2; | 6x6x96 | 3x3x96 | 122 | | Flatten | Input 3x3x96 -> Output 864 | 3x3x96 | 864 | 123 | | Fully connected | connect every neurel with next layer | 864 | 400 | 124 | | Fully connected | connect every neurel with next layer | 400 | 160 | 125 | | Fully connected | output 43 probabilities for each lablel | 160 | 43 | 126 | 127 | 128 | Apart from this, I have used following methods to make the model work better: 129 | 130 | - Learning rate decay 131 | In training deep networks, when the learning rate is large, the system contains too much kinetic energy and the parameter vector bounces around chaotically, ubable to settle down into deeper; when the learning rate is small, you will be wasting computation bouncing around chaotically with little improvement for a long time. If the learning rate can decay from large to small while training, the network will move fast at the begining and improve little by little in the end. There are three commonly used types of method: step dacay, exponential decay and 1/t decay, more information can be found [here](http://cs231n.github.io/neural-networks-3/#anneal) and [here](https://zhuanlan.zhihu.com/p/32923584). Cause I use tensorflow to realize AlexNet and exponential dacay are used for learning decay, so I choose it as my method, its usage can be find [here](https://www.tensorflow.org/api_docs/python/tf/train/exponential_decay) is used to decay learning rate. Maybe it is not a good method, since there is tow more hyper parameters (decay_step and decay_rate) to tune. 132 | - Adam optimization 133 | [Adam](https://arxiv.org/abs/1412.6980) is a popular optimization recently proposed by Diederik P. Kingma and Jimmy Ba, like previous proposed Adagrad and RMSprop, it is a kind of adaptive learning rate method. With Adam, we don't have to use learning rate decay and tune three parameters for perfect learning rate. It is fabilous, so I will use it in most of times. After adapting Adam, the accuracy for training set, validation set and testing set are 99.9%, 96.9% and 94.2% respectively. The model is a little overfitting to training set, so some regularization methods are used to reduce it. 134 | - L2 regulization 135 | L2 regulization is used to reduce overfitting by adding regulization loss to loss function, it is based on the assume that the bigger regulization loss is the more complex the model is. It is well known that complex model is more easily overfit to training set, thus, through reducing regulization loss to make the model simpler. 136 | The regulization loss is the sum of L2 norm of weights for each layer multiple regulization parameter `lambda` in most cases, `lambda` is a small positive number that controls the regulization degree. Tensorflow documetn for how to use l2 regulization can be find [here](https://www.tensorflow.org/api_docs/python/tf/nn/l2_loss). 137 | 138 | ### Training 139 | I have turned the following three hyperparameters to train my model. 140 | * LEARNING_RATE = 5e-4 141 | * EPOCHS = 30 142 | * BATCH_SIZE = 128 143 | * keep_prop = 0.5 144 | * LAMBDA = 1e-5 145 | 146 | The results are: 147 | * accuracy of training set: 100.0% 148 | * accuracy of validation set: 96.0% 149 | * accuracy of test set: 94.6% 150 | 151 | [GoogLeNet.ipynb](https://github.com/liferlisiqi/Traffic-Sign-Classifier/blob/master/GoogLeNet.ipynb) 152 | --- 153 | [GoogLeNet](https://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf) was the winner of the ILSVRC 2014, it main contribution was the development of `Inception Module` that dramatically reduced the number of parameters in the network. 154 | ![alt text][inception] 155 | Additionally, this paper uses `Average Pooling` instead of `Fully connected layer` at the top of the ConvNet, eliminating a large amount of parameters that do not seem to matter much. The overall architecture of GoogLeNet is as the following table. 156 | 157 | ![alt text][googlenet] 158 | 159 | The original architecture of GoogLeNet is a little hard to train by my GPU, so I choose to reduce the number of layers from 22 to 14, the details of network is showing in the following table. 160 | 161 | | Type | Kernel/Stride | Output | Parameters | 162 | |:-------------:|:-------------:|:---------:|:-----------:| 163 | | conv | 3x3/2x2 | 16x16x64 | 1,792 | 164 | | inception(2a) | | 16x16x256 | 137,072 | 165 | | inception(2b) | | 16x16x480 | 388,736 | 166 | | max pool | 3x3/2x2 | 7x7x480 | | 167 | | inception(3a) | | 7x7x512 | 433,792 | 168 | | inception(3a) | | 7x7x512 | 449,160 | 169 | | max pool | 3x3/2x2 | 3x3x512 | | 170 | | inception(4a) | | 3x3x832 | 859,136 | 171 | | inception(4a) | | 3x3x1024 | 1,444,080 | 172 | | avg pool | 3x3/1x1 | 1x1x1024 | | 173 | | flatten | 864 | 1024 | | 174 | | full | 43 | 43 | 44,032 | 175 | 176 | Some details for this architecture is as following: 177 | - Inception Module 178 | The inception module is the core of this architecture, it is driven by two disadvantage of previous architecture: a large amount of parameters which lead to overfitting and dramatically use of computational resources. It's navie implement doesn't have 1x1 conv before/after 3x3 conv, 5x5 conv and max pooling layer. The reason why adding 1x1 convolutional layer is that it can reduce the depth of the output from previous layer, therefore, the amount of operations can be significantly reduced. More details can be found in [Going deeper with convolutions](https://arxiv.org/pdf/1409.4842.pdf). Since max pooling will reduce the shape of input feature map, so I realize it by padding with zeros and another implement can look [here](https://hacktilldawn.com/2016/09/25/inception-modules-explained-and-implemented/). 179 | - Overlapping pooling 180 | The normal pooling operation is with kernel size = 2 and stride = 2, and the overlapping pooling means kernel size > stride, like kernel size = 3 and stride = 2, thus there will be overlapping fields. According to [Traffic Sign Recognition with Multi-Scale Convolutional Networks](http://219.216.82.193/cache/13/03/yann.lecun.com/a46bf8e4b17c2a9e46a2a899a68a0a0d/sermanet-ijcnn-11.pdf), overlapping pooling can slightly reduce the error rates compared to non-overlapping and make the model more difficult to overfit. 181 | 182 | ### Training 183 | I have turned the following three hyperparameters to train my model. 184 | * LEARNING_RATE = 5e-4 185 | * EPOCHS = 35 186 | * BATCH_SIZE = 128 187 | * keep_prop = 0.5 188 | 189 | The results are: 190 | * accuracy of training set: 100.0% 191 | * accuracy of validation set: 98.5% 192 | * accuracy of test set: 98.1% 193 | 194 | Summary 195 | --- 196 | In this project, I use three classific CNN architecture to recognize traffic signs from GTSRB, they are LeNet, AlexNet and GoogLeNet. Since the original architecture may no be suit for images from GRSRB, so I made some changes to them. In addition, I use some methods and tricks to train the model, like mini-batch gradient descent, Adam optimization, L2 regularization, learning rate decay and so on. Finally, ten online traffic images are used to test my model, result shows that it work very well, all the ten signs are perfected recognized. 197 | 198 | References 199 | --- 200 | [The German Traffic Sign Recognition Benchmark](http://benchmark.ini.rub.de/?section=gtsrb&subsection=news) 201 | [Man vs. computer: Benchmarking machine learning algorithms for traffic sign recognition](https://www.sciencedirect.com/science/article/pii/S0893608012000457?via%3Dihub) 202 | [Traffic Sign Recognition with Multi-Scale Convolutional Networks](http://219.216.82.193/cache/13/03/yann.lecun.com/a46bf8e4b17c2a9e46a2a899a68a0a0d/sermanet-ijcnn-11.pdf) 203 | [The German Traffic Sign Recognition Benchmark: A multi-class classification competition](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6033395) 204 | [Gradient-Based Learning Applied to Document Recognition](http://219.216.82.193/cache/10/03/yann.lecun.com/b1a1c4acb57f1b447bfe36e103910875/lecun-01a.pdf) 205 | [ImageNet Classification with Deep Convolutional Neural Networks](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf) 206 | [Going deeper with convolutions](https://arxiv.org/pdf/1409.4842.pdf) 207 | -------------------------------------------------------------------------------- /LeNet.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "All modules imported.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "import os\n", 18 | "import pickle\n", 19 | "import math\n", 20 | "import random\n", 21 | "import csv\n", 22 | "from PIL import Image\n", 23 | "\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "import cv2\n", 26 | "import numpy as np\n", 27 | "import tensorflow as tf\n", 28 | "from sklearn.utils import shuffle\n", 29 | "from tensorflow.contrib.layers import flatten\n", 30 | "\n", 31 | "print('All modules imported.')" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "# 1 Reload the preprocessed data" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stdout", 48 | "output_type": "stream", 49 | "text": [ 50 | "(34799, 32, 32, 3) (34799,)\n", 51 | "(4410, 32, 32, 3) (4410,)\n", 52 | "(12630, 32, 32, 3) (12630,)\n", 53 | "43\n", 54 | "Data loaded.\n" 55 | ] 56 | } 57 | ], 58 | "source": [ 59 | "# 1 Reload the preprocessed data\n", 60 | "\n", 61 | "pickle_file = './pre-traffic-signs-data/pre-data.pickle'\n", 62 | "with open(pickle_file, 'rb') as f:\n", 63 | " pickle_data = pickle.load(f)\n", 64 | " X_train = pickle_data['train_features']\n", 65 | " y_train = pickle_data['train_labels']\n", 66 | " X_valid = pickle_data['valid_features']\n", 67 | " y_valid = pickle_data['valid_labels']\n", 68 | " X_test = pickle_data['test_features']\n", 69 | " y_test = pickle_data['test_labels']\n", 70 | " signnames = pickle_data['signnames']\n", 71 | " del pickle_data # Free up memory\n", 72 | " \n", 73 | "# Shuffle the data set\n", 74 | "X_train, y_train = shuffle(X_train, y_train)\n", 75 | "X_valid, y_valid = shuffle(X_valid, y_valid)\n", 76 | "X_test, y_test = shuffle(X_test, y_test)\n", 77 | "\n", 78 | "print(X_train.shape, y_train.shape)\n", 79 | "print(X_valid.shape, y_valid.shape)\n", 80 | "print(X_test.shape, y_test.shape)\n", 81 | "print(len(signnames))\n", 82 | "print('Data loaded.')" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "# 2 LeNet Architecture" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 3, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "def LeNet(x, KEEP_PROB):\n", 99 | " # Arguments used for tf.truncated_normal, randomly defines variables for the weights and biases for each layer\n", 100 | " mu = 0\n", 101 | " sigma = 0.1\n", 102 | " \n", 103 | " # Layer 1: Input = 32x32x3. Output = 28x28x6.\n", 104 | " # Convolutional. \n", 105 | " conv1_w = tf.Variable(tf.truncated_normal((5, 5, 3, 6), mu, sigma))\n", 106 | " conv1_b = tf.Variable(tf.zeros(6))\n", 107 | " conv1 = tf.nn.conv2d(x, conv1_w, [1, 1, 1, 1], 'VALID') + conv1_b\n", 108 | " # Activation.\n", 109 | " conv1 = tf.nn.relu(conv1)\n", 110 | " # Pooling. Input = 28x28x6. Output = 14x14x6.\n", 111 | " pool1 = tf.nn.max_pool(conv1, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')\n", 112 | " \n", 113 | " # Layer 2: Input = 14x14x6. Output = 10x10x16.\n", 114 | " # Convolutional. \n", 115 | " conv2_w = tf.Variable(tf.truncated_normal((5, 5, 6, 16), mu, sigma))\n", 116 | " conv2_b = tf.Variable(tf.zeros(16))\n", 117 | " conv2 = tf.nn.conv2d(pool1, conv2_w, [1, 1, 1, 1], 'VALID') + conv2_b\n", 118 | " # Activation.\n", 119 | " conv2 = tf.nn.relu(conv2)\n", 120 | " # Pooling. Input = 10x10x16. Output = 5x5x16.\n", 121 | " pool2 = tf.nn.max_pool(conv2, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')\n", 122 | " \n", 123 | " # Flatten. Input = 5x5x16. Output = 400.\n", 124 | " flat = flatten(pool2) \n", 125 | " \n", 126 | " # Layer 3: Input = 400. Output = 120.\n", 127 | " # Fully Connected. \n", 128 | " full1_w = tf.Variable(tf.truncated_normal((400, 120), mu, sigma))\n", 129 | " full1_b = tf.Variable(tf.zeros(120))\n", 130 | " full1 = tf.matmul(flat, full1_w) + full1_b\n", 131 | " # Activation.\n", 132 | " full1 = tf.nn.relu(full1) \n", 133 | " # Dropout\n", 134 | " full1 = tf.nn.dropout(full1, KEEP_PROB)\n", 135 | " \n", 136 | " # Layer 4: Input = 120. Output = 84.\n", 137 | " # Fully Connected. \n", 138 | " full2_w = tf.Variable(tf.truncated_normal((120, 84), mu, sigma))\n", 139 | " full2_b = tf.Variable(tf.zeros(84))\n", 140 | " full2 = tf.matmul(full1, full2_w) + full2_b\n", 141 | " # Activation.\n", 142 | " full2 = tf.nn.relu(full2)\n", 143 | " # Dropout\n", 144 | " full2 = tf.nn.dropout(full2, KEEP_PROB)\n", 145 | " \n", 146 | " # Layer 5: Fully Connected. Input = 84. Output = 43.\n", 147 | " full3_w = tf.Variable(tf.truncated_normal((84, 43), mu, sigma))\n", 148 | " full3_b = tf.Variable(tf.zeros(43))\n", 149 | " logits = tf.matmul(full2, full3_w) + full3_b\n", 150 | " \n", 151 | " return logits" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "# 3 Training" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "## 3.1 Strategy" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 7, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "# Placeholder\n", 175 | "x = tf.placeholder(tf.float32, (None, 32, 32, 3))\n", 176 | "y = tf.placeholder(tf.int32, (None))\n", 177 | "one_hot_y = tf.one_hot(y, 43)\n", 178 | "keep_prob = tf.placeholder_with_default(1.0, shape=())\n", 179 | "\n", 180 | "# Hyperparameters\n", 181 | "LEARNING_RATE = 1e-2\n", 182 | "EPOCHS = 50\n", 183 | "BATCH_SIZE = 128\n", 184 | "\n", 185 | "# Train method\n", 186 | "logits = LeNet(x, keep_prob)\n", 187 | "cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=one_hot_y, logits=logits)\n", 188 | "loss_operation = tf.reduce_mean(cross_entropy)\n", 189 | "optimizer = tf.train.GradientDescentOptimizer(learning_rate = LEARNING_RATE)\n", 190 | "training_operation = optimizer.minimize(loss_operation)" 191 | ] 192 | }, 193 | { 194 | "cell_type": "markdown", 195 | "metadata": {}, 196 | "source": [ 197 | "## 3.2 Evaluation" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": 8, 203 | "metadata": {}, 204 | "outputs": [], 205 | "source": [ 206 | "correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(one_hot_y, 1))\n", 207 | "accuracy_operation = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", 208 | "\n", 209 | "def evaluate(X_data, y_data):\n", 210 | " num_examples = len(X_data)\n", 211 | " total_accuracy = 0\n", 212 | " sess = tf.get_default_session()\n", 213 | " for offset in range(0, num_examples, BATCH_SIZE):\n", 214 | " batch_x, batch_y = X_data[offset:offset + BATCH_SIZE], y_data[offset:offset + BATCH_SIZE]\n", 215 | " accuracy, loss = sess.run([accuracy_operation, loss_operation], feed_dict={x: batch_x, y: batch_y})\n", 216 | " total_accuracy += (accuracy * len(batch_x))\n", 217 | " return total_accuracy / num_examples, loss" 218 | ] 219 | }, 220 | { 221 | "cell_type": "markdown", 222 | "metadata": {}, 223 | "source": [ 224 | "## 3.3 Train the Model\n", 225 | "A validation set can be used to assess how well the model is performing. A low accuracy on the training and validation sets imply underfitting. A high accuracy on the training set but low accuracy on the validation set implies overfitting. The optimizer used is mini-batch gradient descent, each select a sub batch of all the training data." 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 9, 231 | "metadata": { 232 | "scrolled": false 233 | }, 234 | "outputs": [ 235 | { 236 | "name": "stdout", 237 | "output_type": "stream", 238 | "text": [ 239 | "Training...\n", 240 | "EPOCH 1 : Validation Accuracy = 0.084\n", 241 | "EPOCH 2 : Validation Accuracy = 0.172\n", 242 | "EPOCH 3 : Validation Accuracy = 0.255\n", 243 | "EPOCH 4 : Validation Accuracy = 0.315\n", 244 | "EPOCH 5 : Validation Accuracy = 0.357\n", 245 | "EPOCH 6 : Validation Accuracy = 0.392\n", 246 | "EPOCH 7 : Validation Accuracy = 0.426\n", 247 | "EPOCH 8 : Validation Accuracy = 0.452\n", 248 | "EPOCH 9 : Validation Accuracy = 0.463\n", 249 | "EPOCH 10 : Validation Accuracy = 0.487\n", 250 | "EPOCH 11 : Validation Accuracy = 0.515\n", 251 | "EPOCH 12 : Validation Accuracy = 0.542\n", 252 | "EPOCH 13 : Validation Accuracy = 0.564\n", 253 | "EPOCH 14 : Validation Accuracy = 0.590\n", 254 | "EPOCH 15 : Validation Accuracy = 0.602\n", 255 | "EPOCH 16 : Validation Accuracy = 0.644\n", 256 | "EPOCH 17 : Validation Accuracy = 0.658\n", 257 | "EPOCH 18 : Validation Accuracy = 0.675\n", 258 | "EPOCH 19 : Validation Accuracy = 0.713\n", 259 | "EPOCH 20 : Validation Accuracy = 0.720\n", 260 | "EPOCH 21 : Validation Accuracy = 0.746\n", 261 | "EPOCH 22 : Validation Accuracy = 0.740\n", 262 | "EPOCH 23 : Validation Accuracy = 0.767\n", 263 | "EPOCH 24 : Validation Accuracy = 0.771\n", 264 | "EPOCH 25 : Validation Accuracy = 0.793\n", 265 | "EPOCH 26 : Validation Accuracy = 0.798\n", 266 | "EPOCH 27 : Validation Accuracy = 0.809\n", 267 | "EPOCH 28 : Validation Accuracy = 0.822\n", 268 | "EPOCH 29 : Validation Accuracy = 0.829\n", 269 | "EPOCH 30 : Validation Accuracy = 0.836\n", 270 | "EPOCH 31 : Validation Accuracy = 0.841\n", 271 | "EPOCH 32 : Validation Accuracy = 0.848\n", 272 | "EPOCH 33 : Validation Accuracy = 0.840\n", 273 | "EPOCH 34 : Validation Accuracy = 0.854\n", 274 | "EPOCH 35 : Validation Accuracy = 0.865\n", 275 | "EPOCH 36 : Validation Accuracy = 0.873\n", 276 | "EPOCH 37 : Validation Accuracy = 0.874\n", 277 | "EPOCH 38 : Validation Accuracy = 0.871\n", 278 | "EPOCH 39 : Validation Accuracy = 0.877\n", 279 | "EPOCH 40 : Validation Accuracy = 0.877\n", 280 | "EPOCH 41 : Validation Accuracy = 0.881\n", 281 | "EPOCH 42 : Validation Accuracy = 0.887\n", 282 | "EPOCH 43 : Validation Accuracy = 0.889\n", 283 | "EPOCH 44 : Validation Accuracy = 0.894\n", 284 | "EPOCH 45 : Validation Accuracy = 0.894\n", 285 | "EPOCH 46 : Validation Accuracy = 0.898\n", 286 | "EPOCH 47 : Validation Accuracy = 0.900\n", 287 | "EPOCH 48 : Validation Accuracy = 0.905\n", 288 | "EPOCH 49 : Validation Accuracy = 0.896\n", 289 | "EPOCH 50 : Validation Accuracy = 0.901\n", 290 | "Model saved\n" 291 | ] 292 | }, 293 | { 294 | "data": { 295 | "image/png": "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bBV+zp6ZPWRmPaO3bwBNzGwBkQ1c+lV0PCIiIiIiIqVRVLIXDAaLbTdq1CgaNmyYqLAKqYijF3DOjQPGRa//m688Czi/ImIQEREREREpD/369WPhwoV06tQJv99PSkoKjRo1Yu7cucybN4+zzjqLpUuXkpWVxS233MI111wDQGpqKmlpaWRmZnLqqady9NFH8/PPP9OyZUuGDx9OrVq1yjXOCkn2arrvZq3iuven8fuAf1E/pWxnYIiIiIiISOk9OHI2f67YVK59HtSiPg+c2a7I54MGDWLWrFnMmDGDcePGcfrppzNr1qy8IxLefPNNGjduzLZt2zjssMM499xzadKk4KED8+fP56OPPuK1117jggsu4PPPP6dPnx1Xve2cCp/GWRMNHbsAgPS1Wyo5EhERERERqWiHH354gbPwhgwZQseOHenatStLly5l/vz5hdq0adOGTp06AXDooYeSnp5e7nFpZK8cOCJ7yhg1f/tXEREREZGqpLgRuIpSp06dvOtx48YxevRoJk+eTO3atenevXvMs/KSk5Pzrr1eL9u2bSv3uDSyVw60f6iIiIiIyK6jXr16bN68OeazjRs30qhRI2rXrs3cuXOZMmVKBUe3nUb2ykFushdS1iciIiIiUuM1adKEo446ivbt21OrVi123333vGennHIKL7/8MgceeCAHHHAAXbt2rbQ4rboda9elSxeXlpZW2WEUkNrvGwBObLsbb1x+WCVHIyIiIiJSs82ZM4cDDzywssOoELE+q5lNc851KamtpnGWox/nrqnsEERERERERAAle+WiTpK3skMQEREREREpQMleOTi8TeO863+/+UslRiIiIiIiIhKhZK8cjP0rI+96wryMYmqKiIiIiIhUDCV75WDwBR0L3Odu2CIiIiIiIlJZlOyVg3MOaVWo7Ivpy/jolyX8vXZLJUQkIiIiIiK7Op2zlyC3fzoz7zp90OmVGImIiIiIiFSmunXrkpmZWeHv1cheBbj8rV/4LG0pqf2+YcGazZUdjoiIiIiI7AKU7FWAcX9lcNew3wE4afAEXh6/kHDYMXLmCsLh6nWovYiIiIjIrq5fv34MHTo0737AgAE88sgjnHjiiRxyyCEcfPDBDB8+vBIjjNA0zkrw2oRFNKzlp98Xf/DP1hz+3S21skMSEREREamevu0Hq/4o3z73OBhOHVTk4969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7xuufrdmHUgvIiIiIiKxKdmrIg5u1QCPxwqVN6qTFHcf74d68EbwVP7j+44Gf7zFhq05rNkcmdb58viFAPzw52oWrMksrhsREREREakBlOxVI3s2rs2lXfdiyEVFj/YNDF7CD6FDuXbrq9z2yBNMX7IBgNWbsvLqvP3z3wmPVUREREREKpeSvWqkcZ0kHj6rPT07tiiyThgPfQM38qfbi+fzHcnwz9ZAXp3x8zL4Z0tOosMVEREREZFKpGSvGqmX4tt+newrst42Uoo8kgFg6fptXPTaFACyAiEeHTWHzGydwyciIiIiUpMo2asGjtynCfvvXpdnenfKKwuUcLRCUUcy5Jq7ajMAL4xZwKsTFtH+ge9Zm5ld/sGLiIiIiEilULJXDXx4dVf+d9txNK2bnFfWqlHtEttFjmS4ucCRDLmi57cXGNHr8shoQjqyQURERESkRlCyV021alQrrnrjwp0LHskQ5Rw8NmpOofq5B7yLiIiIiEj1VvTCL6kx3g/1oI2t4krft6S73Xk3dDIAr0xYVKiucj0RERERkZpBI3vVVOET+YqXeyTDA753Od7zW5H10tLXF/lMRERERESqDyV71VRq0zoF7i86fM9i64fxcEuMIxl2dPHrU8srRBERERERqURK9qqpfqe25a0rDmPy/53AgoGncsDudUtss7WEIxlERERERKTmULJXTSX7vBx/wG40b1ALn9fDYW0ax9VuDY24MueuIo9kEBERERGRmkHJXg3RrkWDuOvOcXvlHcnwsP+tQs/DOn5BRERERKTaU7K3ixoX7szQUC/O9f5ED09agWchbckpIiIiIlLtKdnbhT0fPIc/w3vxqP91GrEprzzsHKGw48VxCwocui4iIiIiItWHkr0a5LPrupWqfgAftweupwFbeMT/JhAZ0ftr1WZe+2kRT3z3V8yD10VEREREpOpTsleD1PJ7Adi9fnLcbea6PXk2eB6ne3/hTM9kAHq+MIlB384FYItG9kREREREqiUlezVQkzrxJ3sAr4TO4Lfwvjzsf4tm/FNkvZ/mZzB54TpS+33DyJkrdjZMERERERFJICV7NchBzetzade9GHrJIaVqF8LLHYHrSCGHx/yvkzudM7/1W3K49I1fuOi1KQA89+P88ghZREREREQSRMleDeLxGA+f1Z42TeuUuu0i14Inghdykvc3zveOzyv/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\n", 296 | "text/plain": [ 297 | "" 298 | ] 299 | }, 300 | "metadata": {}, 301 | "output_type": "display_data" 302 | }, 303 | { 304 | "name": "stdout", 305 | "output_type": "stream", 306 | "text": [ 307 | "CPU times: user 2min 40s, sys: 21 s, total: 3min 1s\n", 308 | "Wall time: 3min 21s\n" 309 | ] 310 | } 311 | ], 312 | "source": [ 313 | "%%time\n", 314 | "# 2min 7s\n", 315 | "train_losses = []\n", 316 | "valid_losses = []\n", 317 | "saver = tf.train.Saver()\n", 318 | "with tf.Session() as sess:\n", 319 | " sess.run(tf.global_variables_initializer())\n", 320 | " num_examples = len(X_train)\n", 321 | "\n", 322 | " print(\"Training...\")\n", 323 | " for i in range(EPOCHS):\n", 324 | " X_train, y_train = shuffle(X_train, y_train)\n", 325 | " print(\"EPOCH {} :\".format(i+1), end=' ')\n", 326 | " for offset in range(0, num_examples, BATCH_SIZE):\n", 327 | " end = offset + BATCH_SIZE\n", 328 | " batch_x, batch_y = X_train[offset:end], y_train[offset:end]\n", 329 | " _, train_loss = sess.run([training_operation, loss_operation], feed_dict={x: batch_x, y: batch_y, keep_prob: 0.5})\n", 330 | " train_losses.append(train_loss)\n", 331 | " validation_accuracy, valid_loss = evaluate(X_valid, y_valid)\n", 332 | " print(\"Validation Accuracy = {:.3f}\".format(validation_accuracy))\n", 333 | " valid_losses.append(valid_loss)\n", 334 | " \n", 335 | " saver.save(sess, './model/lenet.ckpt')\n", 336 | " print(\"Model saved\")\n", 337 | " \n", 338 | "plt.subplot(2, 1, 2)\n", 339 | "plt.plot(train_losses, label='train')\n", 340 | "plt.plot([(i+1) * int(num_examples / BATCH_SIZE) for i in range(EPOCHS)], valid_losses, label='val')\n", 341 | "plt.title('training and validation loss history')\n", 342 | "plt.xlabel('Epoch')\n", 343 | "plt.ylabel('Loss')\n", 344 | "plt.gcf().set_size_inches(15, 12)\n", 345 | "plt.legend()\n", 346 | "plt.show()" 347 | ] 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "metadata": {}, 352 | "source": [ 353 | "# 4 Testing" 354 | ] 355 | }, 356 | { 357 | "cell_type": "markdown", 358 | "metadata": {}, 359 | "source": [ 360 | "## 4.1 Test the model on testing dataset" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": 12, 366 | "metadata": {}, 367 | "outputs": [ 368 | { 369 | "name": "stdout", 370 | "output_type": "stream", 371 | "text": [ 372 | "INFO:tensorflow:Restoring parameters from ./model/lenet.ckpt\n" 373 | ] 374 | }, 375 | { 376 | "data": { 377 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAHAxJREFUeJzt3XmYVPWd7/H3J3SIC8R2BJLYgMgqqCjSuEUjxEg0zog4RiUR14G4ZCEuE3j0MsarVxO9yTNJHCeuaGYGMG7pUcQQFDReF5qACxgVQaWJUWREESOdhu/945w+qW56KZbTRTef1/PU03VO/c6p76lT1Z86268UEZiZmQF8qtQFmJnZjsOhYGZmGYeCmZllHApmZpZxKJiZWcahYGZmGYeCmZllHApmZpZxKJiZWaYsrxlLugP4e+DdiDigiccF/CvwNeBj4JyI+ENr8+3WrVv06dNnO1drZtaxLVy48L2I6N5au9xCAZgG/AK4u5nHTwAGpLfDgJvTvy3q06cP1dXV26lEM7Odg6Q3i2mX2+6jiHgC+J8WmowB7o7EM0C5pC/kVY+ZmbWulMcUKoCVBcM16bjNSJooqVpS9erVq9ukuLzNnj2bQYMG0b9/f66//vrNHn/zzTc59thjGTp0KCNHjqSmpiZ77K233mL06NEMHjyYIUOG8MYbbwAQEVxxxRUMHDiQwYMH87Of/aytFsfMOoqIyO0G9AFeauaxh4CjCobnApWtzXP48OHR3tXV1UXfvn3j9ddfjw0bNsTQoUNjyZIlDdqceuqpMW3atIiImDt3bpx55pnZY8ccc0z89re/jYiIdevWxfr16yMi4o477ojx48fHxo0bIyLinXfeaYvFMbN2AKiOIv5vl3JLYRXQq2C4Zzquw3vuuefo378/ffv2pXPnzpxxxhn85je/adBm6dKlfPnLXwZg1KhR2eNLly6lrq6O4447DoAuXbqw2267AXDzzTczdepUPvWpZLX26NGjrRbJzDqIUoZCFXCWEocDH0TE2yWsp82sWrWKXr3+loc9e/Zk1aqGeXjQQQdx//33A/DAAw+wbt061qxZw6uvvkp5eTmnnHIKw4YN4/LLL2fjxo0AvP7668ycOZPKykpOOOEEXnvttbZbKDPrEHILBUnTgaeBQZJqJJ0v6QJJF6RNZgHLgWXArcBFedXSHt14443Mnz+fYcOGMX/+fCoqKujUqRN1dXU8+eST3HjjjSxYsIDly5czbdo0ADZs2MAuu+xCdXU1EyZM4LzzzivtQphZu5PbKakRMa6VxwO4OK/n35FVVFSwcuXfjrHX1NRQUdHwGPvee++dbSl89NFH3HfffZSXl9OzZ08OPvhg+vbtC8DJJ5/MM888w/nnn0/Pnj055ZRTABg7diznnntuGy2RmXUUvqK5BEaMGMFrr73GihUrqK2tZcaMGZx00kkN2rz33nts2rQJgOuuuy771j9ixAjWrl1L/VlYjz32GEOGDAGSgHj88ccBmD9/PgMHDmyrRTKzDsKhUAJlZWX84he/4Ktf/SqDBw/mtNNOY//992fq1KlUVVUBMG/ePAYNGsTAgQN55513uOKKKwDo1KkTN954I8ceeywHHnggEcGECRMAmDx5Mvfddx8HHnggU6ZM4bbbbivZMppZ+6RkL077UVlZGVt7RXOfyQ9v52qs3hvXn1jqEsysBZIWRkRla+28pWBmZhmHglkRtvYK9MWLF3PEEUew//77M3ToUGbOnJlNs2LFCg477DD69+/P6aefTm1tbZstj1lzHApmrdi4cSMXX3wxjzzyCEuXLmX69OksXbq0QZvLLruMs846ixdeeIGpU6cyZcoUAHbbbTfuvvtulixZwuzZs5k0aRJr164F4Ac/+AHf//73WbZsGXvuuSe33357my+bWWMOBbNWbMsV6AMHDmTAgAFAcppxjx49WL16NRHBY489xqmnngrA2WefzYMPPtiGS2XWNIeCWSu25Qr0Qs899xy1tbX069ePNWvWUF5eTllZWbPzNCsFh4LZdtDcFej13n77bcaPH8+dd96Z9U1ltiPyu9OsFVtyBfqiRYu49tprASgvLwfgww8/5MQTT+Taa6/l8MMPB2CvvfZi7dq11NXVNTtP2zatnRzw1ltvMWrUKIYNG8bQoUOZNWsWALW1tZx77rkceOCBHHTQQcybNw+AdevWcfDBB2e3bt26MWnSpLZcpDbhUDBrxbZcgV5bW8vYsWM566yzsuMHAJIYNWoU9957LwB33XUXY8aMaaMl6viKOTngmmuu4bTTTmPRokXMmDGDiy5Kul+79dZbAXjxxReZM2cOl156KZs2baJr164sXrw4u+2zzz5ZtzIdSZ4/x2m2zXaUCw7/MvwsBg4/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\n", 378 | "text/plain": [ 379 | "" 380 | ] 381 | }, 382 | "metadata": {}, 383 | "output_type": "display_data" 384 | } 385 | ], 386 | "source": [ 387 | "with tf.Session() as sess:\n", 388 | " saver.restore(sess, './model/lenet.ckpt')\n", 389 | " train_accuracy,_ = evaluate(X_train, y_train)\n", 390 | " valid_accuracy,_ = evaluate(X_valid, y_valid)\n", 391 | " test_accuracy,_ = evaluate(X_test, y_test)\n", 392 | " \n", 393 | "accuracys = [train_accuracy, valid_accuracy, test_accuracy]\n", 394 | "tick_labels = [\"training set\", \"validation set\", \"testing set\"]\n", 395 | "plt.bar(range(3), accuracys)\n", 396 | "plt.xlabel('data set')\n", 397 | "plt.ylabel('accuracy')\n", 398 | "plt.xticks(range(3), tick_labels)\n", 399 | "for x_,y_ in zip(range(3), accuracys):\n", 400 | " plt.text(x_ - 0.1, y_, '%.3f'%y_)\n", 401 | "plt.show()" 402 | ] 403 | } 404 | ], 405 | "metadata": { 406 | "kernelspec": { 407 | "display_name": "Python 3", 408 | "language": "python", 409 | "name": "python3" 410 | }, 411 | "language_info": { 412 | "codemirror_mode": { 413 | "name": "ipython", 414 | "version": 3 415 | }, 416 | "file_extension": ".py", 417 | "mimetype": "text/x-python", 418 | "name": "python", 419 | "nbconvert_exporter": "python", 420 | "pygments_lexer": "ipython3", 421 | "version": "3.5.2" 422 | } 423 | }, 424 | "nbformat": 4, 425 | "nbformat_minor": 2 426 | } 427 | -------------------------------------------------------------------------------- /GoogLeNet.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "All modules imported.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "import os\n", 18 | "import pickle\n", 19 | "import math\n", 20 | "import random\n", 21 | "import csv\n", 22 | "from PIL import Image\n", 23 | "\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "import cv2\n", 26 | "import numpy as np\n", 27 | "import tensorflow as tf\n", 28 | "import tensorflow.contrib.layers as layers\n", 29 | "from sklearn.utils import shuffle\n", 30 | "\n", 31 | "print('All modules imported.')" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "# 1 Reload the preprocessed data" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stdout", 48 | "output_type": "stream", 49 | "text": [ 50 | "(34799, 32, 32, 3) (34799,)\n", 51 | "(4410, 32, 32, 3) (4410,)\n", 52 | "(12630, 32, 32, 3) (12630,)\n", 53 | "43\n", 54 | "Data loaded.\n" 55 | ] 56 | } 57 | ], 58 | "source": [ 59 | "# 1 Reload the preprocessed data\n", 60 | "\n", 61 | "pickle_file = './pre-traffic-signs-data/pre-data.pickle'\n", 62 | "with open(pickle_file, 'rb') as f:\n", 63 | " pickle_data = pickle.load(f)\n", 64 | " X_train = pickle_data['train_features']\n", 65 | " y_train = pickle_data['train_labels']\n", 66 | " X_valid = pickle_data['valid_features']\n", 67 | " y_valid = pickle_data['valid_labels']\n", 68 | " X_test = pickle_data['test_features']\n", 69 | " y_test = pickle_data['test_labels']\n", 70 | " signnames = pickle_data['signnames']\n", 71 | " del pickle_data # Free up memory\n", 72 | " \n", 73 | "# Shuffle the data set\n", 74 | "X_train, y_train = shuffle(X_train, y_train)\n", 75 | "X_valid, y_valid = shuffle(X_valid, y_valid)\n", 76 | "X_test, y_test = shuffle(X_test, y_test)\n", 77 | "\n", 78 | "print(X_train.shape, y_train.shape)\n", 79 | "print(X_valid.shape, y_valid.shape)\n", 80 | "print(X_test.shape, y_test.shape)\n", 81 | "print(len(signnames))\n", 82 | "print('Data loaded.')" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "# 2 Model Architecture" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "## 2.1 Inception model and GoogLeNet" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 3, 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "def Inception(inputs, conv11_size, conv33_11_size, conv33_size,conv55_11_size, conv55_size, pool11_size):\n", 106 | " conv11 = layers.conv2d(inputs, conv11_size, [1, 1])\n", 107 | " conv33_reduce = layers.conv2d(inputs, conv33_11_size, [1, 1])\n", 108 | " conv33 = layers.conv2d(conv33_reduce, conv33_size, [3, 3])\n", 109 | " conv55_reduce = layers.conv2d(inputs, conv55_11_size, [1, 1])\n", 110 | " conv55 = layers.conv2d(conv55_reduce, conv55_size, [5, 5])\n", 111 | " pool_proj = layers.max_pool2d(inputs, [3, 3], stride = 1, padding='SAME')\n", 112 | " pool11 = layers.conv2d(pool_proj, pool11_size, [1, 1])\n", 113 | " return tf.concat([conv11, conv33, conv55, pool11], 3)\n", 114 | "\n", 115 | "def GoogLeNet(inputs, dropout_keep_prob): # inputs size:32x32x3\n", 116 | " conv1 = layers.conv2d(inputs, 64, [3, 3], stride = 2) # 16x16x64\n", 117 | " \n", 118 | " inception_2a = Inception(conv1, 64, 96, 128, 16, 32, 32) # 16x16x256\n", 119 | " inception_2b = Inception(inception_2a, 128, 128, 192, 32, 96, 64) # 16x16x480\n", 120 | " pool2 = layers.max_pool2d(inception_2b, [3, 3]) # 7x7x480 ? why\n", 121 | " \n", 122 | " inception_3a = Inception(pool2, 192, 96, 208, 16, 48, 64) # 7x7x512\n", 123 | " inception_3b = Inception(inception_3a, 160, 112, 224, 24, 64, 64) # 7x7x512\n", 124 | " pool3 = layers.max_pool2d(inception_3b, [3, 3]) # 3x3x512\n", 125 | " \n", 126 | " inception_4a = Inception(pool3, 256, 160, 320, 32, 128, 128) # 3x3x832\n", 127 | " inception_4b = Inception(inception_4a, 384, 192, 384, 48, 128, 128) # 3x3x1024\n", 128 | " pool4 = layers.avg_pool2d(inception_4b, [3, 3], stride = 1) \n", 129 | "\n", 130 | " reshape = tf.reshape(pool4, [-1, 1024])\n", 131 | " dropout = layers.dropout(reshape, dropout_keep_prob)\n", 132 | " logits = layers.fully_connected(dropout, 43, activation_fn=None)\n", 133 | " \n", 134 | " return logits" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": {}, 140 | "source": [ 141 | "# 3 Training" 142 | ] 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "metadata": {}, 147 | "source": [ 148 | "## 3.1 Strategy" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 4, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "# Placeholder\n", 158 | "x = tf.placeholder(tf.float32, (None, 32, 32, 3))\n", 159 | "y = tf.placeholder(tf.int32, (None))\n", 160 | "one_hot_y = tf.one_hot(y, 43)\n", 161 | "keep_prob = tf.placeholder_with_default(1.0, shape=())\n", 162 | "\n", 163 | "# Hyperparameters\n", 164 | "LEARNING_RATE = 4e-4\n", 165 | "EPOCHS = 35\n", 166 | "BATCH_SIZE = 128\n", 167 | "\n", 168 | "# Train method\n", 169 | "logits = GoogLeNet(x, keep_prob)\n", 170 | "cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=one_hot_y, logits=logits)\n", 171 | "loss_op = tf.reduce_mean(cross_entropy)\n", 172 | "optimizer = tf.train.AdamOptimizer(learning_rate = LEARNING_RATE)\n", 173 | "train_op = optimizer.minimize(loss_op)" 174 | ] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "## 3.2 Evaluation" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 5, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(one_hot_y, 1))\n", 190 | "accuracy_op = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", 191 | "\n", 192 | "def evaluate(X_data, y_data):\n", 193 | " num_examples = len(X_data)\n", 194 | " total_accuracy = 0\n", 195 | " sess = tf.get_default_session()\n", 196 | "# with tf.Session() as sess:\n", 197 | "# sess.run(tf.global_variables_initializer())\n", 198 | " for offset in range(0, num_examples, BATCH_SIZE):\n", 199 | " batch_x, batch_y = X_data[offset:offset + BATCH_SIZE], y_data[offset:offset + BATCH_SIZE]\n", 200 | " accuracy = sess.run(accuracy_op, feed_dict={x: batch_x, y: batch_y})\n", 201 | " total_accuracy += (accuracy * len(batch_x))\n", 202 | " return total_accuracy / num_examples" 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": {}, 208 | "source": [ 209 | "## 3.3 Train the Model\n", 210 | "A validation set can be used to assess how well the model is performing. A low accuracy on the training and validation sets imply underfitting. A high accuracy on the training set but low accuracy on the validation set implies overfitting." 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 6, 216 | "metadata": { 217 | "scrolled": false 218 | }, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "Training...\n", 225 | "EPOCH 1 : Validation Accuracy = 0.460\n", 226 | "EPOCH 2 : Validation Accuracy = 0.878\n", 227 | "EPOCH 3 : Validation Accuracy = 0.903\n", 228 | "EPOCH 4 : Validation Accuracy = 0.948\n", 229 | "EPOCH 5 : Validation Accuracy = 0.952\n", 230 | "EPOCH 6 : Validation Accuracy = 0.951\n", 231 | "EPOCH 7 : Validation Accuracy = 0.951\n", 232 | "EPOCH 8 : Validation Accuracy = 0.948\n", 233 | "EPOCH 9 : Validation Accuracy = 0.950\n", 234 | "EPOCH 10 : Validation Accuracy = 0.968\n", 235 | "EPOCH 11 : Validation Accuracy = 0.959\n", 236 | "EPOCH 12 : Validation Accuracy = 0.956\n", 237 | "EPOCH 13 : Validation Accuracy = 0.965\n", 238 | "EPOCH 14 : Validation Accuracy = 0.972\n", 239 | "EPOCH 15 : Validation Accuracy = 0.968\n", 240 | "EPOCH 16 : Validation Accuracy = 0.952\n", 241 | "EPOCH 17 : Validation Accuracy = 0.973\n", 242 | "EPOCH 18 : Validation Accuracy = 0.975\n", 243 | "EPOCH 19 : Validation Accuracy = 0.959\n", 244 | "EPOCH 20 : Validation Accuracy = 0.977\n", 245 | "EPOCH 21 : Validation Accuracy = 0.978\n", 246 | "EPOCH 22 : Validation Accuracy = 0.973\n", 247 | "EPOCH 23 : Validation Accuracy = 0.983\n", 248 | "EPOCH 24 : Validation Accuracy = 0.977\n", 249 | "EPOCH 25 : Validation Accuracy = 0.979\n", 250 | "EPOCH 26 : Validation Accuracy = 0.981\n", 251 | "EPOCH 27 : Validation Accuracy = 0.977\n", 252 | "EPOCH 28 : Validation Accuracy = 0.984\n", 253 | "EPOCH 29 : Validation Accuracy = 0.985\n", 254 | "EPOCH 30 : Validation Accuracy = 0.987\n", 255 | "EPOCH 31 : Validation Accuracy = 0.987\n", 256 | "EPOCH 32 : Validation Accuracy = 0.973\n", 257 | "EPOCH 33 : Validation Accuracy = 0.963\n", 258 | "EPOCH 34 : Validation Accuracy = 0.968\n", 259 | "EPOCH 35 : Validation Accuracy = 0.979\n", 260 | "Model saved\n", 261 | "CPU times: user 28min 52s, sys: 4min 17s, total: 33min 10s\n", 262 | "Wall time: 44min 41s\n" 263 | ] 264 | } 265 | ], 266 | "source": [ 267 | "%%time\n", 268 | "saver = tf.train.Saver()\n", 269 | "train_accuracy = []\n", 270 | "valid_accuracy = []\n", 271 | "with tf.Session() as sess:\n", 272 | " sess.run(tf.global_variables_initializer())\n", 273 | " num_examples = len(X_train)\n", 274 | " print(\"Training...\")\n", 275 | " for i in range(EPOCHS):\n", 276 | " X_train, y_train = shuffle(X_train, y_train)\n", 277 | " total_train_acc = 0\n", 278 | " print(\"EPOCH {} :\".format(i+1), end=' ')\n", 279 | " for offset in range(0, num_examples, BATCH_SIZE):\n", 280 | " end = offset + BATCH_SIZE\n", 281 | " batch_x, batch_y = X_train[offset:end], y_train[offset:end]\n", 282 | " _, train_acc = sess.run([train_op, accuracy_op], feed_dict={x: batch_x, y: batch_y, keep_prob: 0.5})\n", 283 | " total_train_acc += (train_acc * len(batch_x))\n", 284 | " train_accuracy.append(total_train_acc / num_examples)\n", 285 | " valid_acc = evaluate(X_valid, y_valid)\n", 286 | " valid_accuracy.append(valid_acc)\n", 287 | " print(\"Validation Accuracy = {:.3f}\".format(valid_acc))\n", 288 | " \n", 289 | " saver.save(sess, './model/googlenet.ckpt')\n", 290 | " print(\"Model saved\")" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "#### Plot the accuracy of training and validation operation" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 7, 303 | "metadata": {}, 304 | "outputs": [ 305 | { 306 | "data": { 307 | "image/png": "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\n", 308 | "text/plain": [ 309 | "" 310 | ] 311 | }, 312 | "metadata": {}, 313 | "output_type": "display_data" 314 | } 315 | ], 316 | "source": [ 317 | "plt.subplot(2, 1, 2)\n", 318 | "plt.plot(train_accuracy, label='train')\n", 319 | "plt.plot(valid_accuracy, label='valid')\n", 320 | "plt.title('Accuracy history')\n", 321 | "plt.xlabel('Epoch')\n", 322 | "plt.ylabel('Loss')\n", 323 | "plt.gcf().set_size_inches(15, 15)\n", 324 | "plt.legend()\n", 325 | "plt.show()" 326 | ] 327 | }, 328 | { 329 | "cell_type": "markdown", 330 | "metadata": {}, 331 | "source": [ 332 | "# 4 Testing" 333 | ] 334 | }, 335 | { 336 | "cell_type": "markdown", 337 | "metadata": {}, 338 | "source": [ 339 | "## 4.1 Test the model on testing dataset" 340 | ] 341 | }, 342 | { 343 | "cell_type": "code", 344 | "execution_count": 6, 345 | "metadata": {}, 346 | "outputs": [ 347 | { 348 | "name": "stdout", 349 | "output_type": "stream", 350 | "text": [ 351 | "INFO:tensorflow:Restoring parameters from ./model/googlenet.ckpt\n" 352 | ] 353 | } 354 | ], 355 | "source": [ 356 | "saver = tf.train.import_meta_graph('./model/googlenet.ckpt.meta')\n", 357 | "with tf.Session() as sess:\n", 358 | " saver.restore(sess, './model/googlenet.ckpt')" 359 | ] 360 | }, 361 | { 362 | "cell_type": "code", 363 | "execution_count": 10, 364 | "metadata": {}, 365 | "outputs": [ 366 | { 367 | "name": "stdout", 368 | "output_type": "stream", 369 | "text": [ 370 | "INFO:tensorflow:Restoring parameters from ./model/googlenet.ckpt\n" 371 | ] 372 | }, 373 | { 374 | "data": { 375 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAGvBJREFUeJzt3XuYHHWd7/H318SIXJagCXs0A4S7xBgIBBSRACKRy5GLi0iUAx4uERXFCwg8aFY5K8LCcT0srEfgaFzZJWC4mIWQCBguIgKBhBjCguESkoAyZEER1oQk3/NH1dR2JjOZJpNKZ5L363n6ma7qX1V/q6tnPl316/pNZCaSJAG8pdUFSJLWH4aCJKliKEiSKoaCJKliKEiSKoaCJKliKEiSKoaCJKliKEiSKv1bXcCbNWjQoBw6dGiry5CkPuXhhx9+KTMH99Suz4XC0KFDmTFjRqvLkKQ+JSLmN9PO00eSpIqh0CJTp05l1113ZaedduKiiy5a5fH58+dz8MEHM2LECA488EAWLlxYPXbOOecwfPhwhg8fznXXXVfN/+Uvf8mee+7J8OHDOemkk1i2bNk62RZJGw5DoQWWL1/OF77wBW677Tbmzp3Ltddey9y5c1dqc9ZZZ3HiiScye/Zsxo8fz3nnnQfArbfeyiOPPMKsWbN44IEHuPTSS/nTn/7EihUrOOmkk5g4cSJz5sxhu+224yc/+UkrNk9SH2YotMCDDz7ITjvtxA477MCAAQM4/vjj+fnPf75Sm7lz5/LhD38YgIMOOqh6fO7cuYwePZr+/fuz2WabMWLECKZOncrixYsZMGAAu+yyCwCHHHIIN9xww7rdMEl9nqHQAosWLWKbbbapptva2li0aNFKbXbffXduvPFGAG666SZeffVVFi9ezO67787UqVN5/fXXeemll5g+fToLFixg0KBBLFu2rOqEnzRpEgsWLFh3GyVpg1BbKETEjyLixYiY083jERGXRcS8iJgdEXvWVUtfdOmll3L33XczcuRI7r77boYMGUK/fv0YM2YMhx9+OB/84AcZO3Ys++67L/369SMimDhxIl/5ylfYZ5992GKLLejXr1+rN2ODsaZ9QNOnT2ePPfaobptssgk333wzYB+Q1lOZWcsNGA3sCczp5vHDgduAAD4APNDMevfaa6/s637961/nmDFjqukLL7wwL7zwwm7bv/rqqzlkyJAuHxs7dmzeeuutq8yfNm1afuITn+h9scply5blDjvskE899VQuWbIkR4wYkY899thKbY499ticMGFCZmbeeeedecIJJ6yynsWLF+dWW22Vr732Wi5fvjzb2tryiSeeyMzMb37zm3n11VfXvzHaaAEzsom/sbUdKWTmPcB/rKbJUcA/l/X+BhgYEe+qq571yd57783vfvc7nnnmGZYuXcrEiRM58sgjV2rz0ksvsWLFCgC++93vcvLJJwNFJ/XixYsBmD17NrNnz2bMmDEAvPjiiwAsWbKEiy++mNNPP31dbdIGrTd9QI0mTZrEYYcdxqabbmofkNZbrexTGAI0nvReWM7b4PXv35/LL7+cj370o+y2224cd9xxvPe972X8+PFMnjwZgLvuuotdd92VXXbZhT/84Q+cf/75ALzxxhvsv//+DBs2jHHjxnHNNdfQv39xDeIll1zCbrvtxogRI/jYxz5W/ZFS7/SmD6jRxIkTGTt2LIB9QFpvRXFUUdPKI4YCt2Tm8C4euwW4KDN/VU7fCZyTmatcrhwR44BxANtuu+1e8+c3dWHeKoaee+saLaeePXvREa0uoTaTJk1i6tSpXH311QD89Kc/5YEHHuDyyy+v2jz//POcccYZPPPMM4wePZobbriBOXPmMHDgQABeeOEFRowYwfPPP89b3/pWAO6//36+/vWvs2TJEsaMGcMtt9zCrFmz1v0GbqCmTp3KmWeeyfLlyzn11FM599xzV3p8/vz5nHzyybS3t/OOd7yDa665hra2NgCee+45Tj31VBYsWEBEMGXKFIYOHcrll1/O97//fZ566ina29sZNGhQKzZtjUTEw5k5qqd2rTxSWARs0zDdVs5bRWZemZmjMnPU4ME9Dt0hrVVDhgxZ6VP8woULGTJk5YPad7/73dx4443MnDmT73znOwBVIABcf/31HHPMMVUgAOy7777ce++9PPjgg4wePbo6laTe6821QAAnnngiZ599No8//jgPPvggW2+9NQD77bcfd9xxB9ttt9063Z51qZWhMBk4sfwW0geAP2bmCy2sR+pSb/qAOlx77bXVqaMO9gHVp7fXAi1btoxDDjkEgM0335xNN90UgJEjR7KhD8hZ51dSrwXuB3aNiIURcUpEnB4RHe/8KcDTwDzgKuDzddUi9UZv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\n", 376 | "text/plain": [ 377 | "" 378 | ] 379 | }, 380 | "metadata": {}, 381 | "output_type": "display_data" 382 | } 383 | ], 384 | "source": [ 385 | "with tf.Session() as sess:\n", 386 | " saver.restore(sess, './model/googlenet.ckpt')\n", 387 | "# sess.run(tf.global_variables_initializer())\n", 388 | " train_accuracy = evaluate(X_train, y_train)\n", 389 | " valid_accuracy = evaluate(X_valid, y_valid)\n", 390 | " test_accuracy = evaluate(X_test, y_test)\n", 391 | " \n", 392 | "accuracys = [train_accuracy, valid_accuracy, test_accuracy]\n", 393 | "tick_labels = [\"training set\", \"validation set\", \"testing set\"]\n", 394 | "plt.bar(range(3), accuracys)\n", 395 | "plt.xlabel('data set')\n", 396 | "plt.ylabel('accuracy')\n", 397 | "plt.xticks(range(3), tick_labels)\n", 398 | "for x_,y_ in zip(range(3), accuracys):\n", 399 | " plt.text(x_ - 0.1, y_, '%.3f'%y_)\n", 400 | "plt.show()" 401 | ] 402 | }, 403 | { 404 | "cell_type": "markdown", 405 | "metadata": {}, 406 | "source": [ 407 | "## 4.2 Test the Model on New Images" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 15, 413 | "metadata": {}, 414 | "outputs": [ 415 | { 416 | "data": { 417 | "image/png": "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\n", 418 | "text/plain": [ 419 | "" 420 | ] 421 | }, 422 | "metadata": {}, 423 | "output_type": "display_data" 424 | } 425 | ], 426 | "source": [ 427 | "online_images = []\n", 428 | "online_labels = [0, 9, 12, 14, 17, 22, 25, 26, 31, 35]\n", 429 | "\n", 430 | "for i in range(1, 11):\n", 431 | " image = plt.imread('./test_images/' + str(i) +'.jpeg')\n", 432 | " image_reshape = cv2.resize(image,(32, 32), interpolation = cv2.INTER_CUBIC)\n", 433 | " online_images.append(image_reshape)\n", 434 | "\n", 435 | "plt.figure(figsize=(25, 10))\n", 436 | "plt.subplots_adjust(hspace = .1, wspace=.1)\n", 437 | "for i in range(len(online_images)):\n", 438 | " plt.subplot(1, 10, i + 1)\n", 439 | " plt.imshow(online_images[i])\n", 440 | " plt.title(signnames[int(online_labels[i])])\n", 441 | " plt.xticks([]), plt.yticks([])\n", 442 | "plt.savefig('./result_images/online image.jpg')\n", 443 | "\n", 444 | "online_images = np.array(online_images)\n", 445 | "online_images = online_images.astype(np.float32) / 128. - 1.\n", 446 | "online_labels = np.array(online_labels)" 447 | ] 448 | }, 449 | { 450 | "cell_type": "markdown", 451 | "metadata": {}, 452 | "source": [ 453 | "### Predict the Sign Type for Each Image" 454 | ] 455 | }, 456 | { 457 | "cell_type": "code", 458 | "execution_count": 16, 459 | "metadata": {}, 460 | "outputs": [ 461 | { 462 | "name": "stdout", 463 | "output_type": "stream", 464 | "text": [ 465 | "INFO:tensorflow:Restoring parameters from ./model/googlenet.ckpt\n", 466 | "Test Accuracy = 1.000\n", 467 | "Predict the Sign Type for Each Image\n", 468 | "[ 0 9 12 14 17 22 25 26 31 35]\n" 469 | ] 470 | } 471 | ], 472 | "source": [ 473 | "with tf.Session() as sess:\n", 474 | " saver.restore(sess, './model/googlenet.ckpt')\n", 475 | " test_accuracy = evaluate(online_images, online_labels)\n", 476 | " print(\"Test Accuracy = {:.3f}\".format(test_accuracy)) \n", 477 | " logits_value = sess.run(logits, feed_dict={x: online_images})\n", 478 | " probabilities = sess.run(tf.nn.softmax(logits_value))\n", 479 | " \n", 480 | "predict = probabilities.argmax(axis=1)\n", 481 | "print(\"Predict the Sign Type for Each Image\")\n", 482 | "print(predict)" 483 | ] 484 | }, 485 | { 486 | "cell_type": "markdown", 487 | "metadata": {}, 488 | "source": [ 489 | "### Output Top 5 Softmax Probabilities For Each Image Found on the Web" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 52, 495 | "metadata": {}, 496 | "outputs": [ 497 | { 498 | "data": { 499 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABZsAAAHiCAYAAACObBJzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzs3Xu4JHV9J/73RyZ4QUGRMYszgwMZwgqICgOS+JMQFRkwO5NsXIXVEAMJjxsRk7iuZpOwmqyrcbO3rLiGrAmQZBnRVWF1BFyjqFmIgCKBwcsoIDOiIhfFoCDw/f3RDR4PZ2aa031OnTrn9Xqeeui6nKpPNdXv6fp0dXW11gIAAAAAAON4VNcFAAAAAADQf5rNAAAAAACMTbMZAAAAAICxaTYDAAAAADA2zWYAAAAAAMam2QwAAAAAwNg0mwEAAAAAGJtmM71UVS+oqi9U1d1V9fGqelrXNQFLQ1X9elVtqarvVdVFVfXUrmsCFqeq2rWq3ldVN1ZVq6qjp81/fVVdW1V3VdUNVfX6jkoFFqGdZdC05a6vqq3zXCKwSI3wHugjw/OxB4d7q+ofOiqXaTSbWVCqatkIy+yV5P1J/iDJnkmuTPKeOS4NWORGzJ+jk/yHJBsyyJ8bkpw3t5UBi9EomTP06SSvSPKNmVaT5KQkT0qyLslpVXXCZCoEFrMJZdCDXp/k1rGLApaESeRPa+241trjHxyS/L8k751gmYxBs3mJqKo3VtVXhle+bK6qX5oy75VV9emq+pOqumN4Zcxx0+Z/dcpVMy8fTr+pqg4bPn758NOmg4bjp1TVB4ePHzVl+7dV1flVtedw3urh351SVV9L8rcj7M4/T3Jda+29rbUfJHlTkmdW1T+dzLMFTNIiy59fSPLe1tp1rbV7k/xRkqOq6qcm9HQBY1pMmdNau7e19l9ba59Ocv8M89/eWvtsa+2+1toXk1yQ5LnjPH/AeJZSBg3Xu28GzaC3zvY5AyZjqeXPlNpXJ3leknMf2TPGXNFsXjq+ksGLb48kb07y11W195T5z0nyxSR7JXl7knfXwG5J/jTJca21JyT52SRXD//m0iRHDx//XJKvJjlqyvilw8evSfKLw2lPTXJHkjOn1fdzSZ6e5NgkqaprqupfbmdfDkry+QdHWmv/ONy/g3b2JACdWEz5kwyuJJz++OAdLA/Mr8WWOSOpqspgv68bd13AWJZaBv33JP82yffHWAcwGUstfx50UpJPtdZunMC6mITWmmEJDhkEx4bh41cm2TJl3uOStCT/JMluSe5M8stJHjttHackuXD4+Pokv55k43D8piSHTpn3gil/t3eSHyZZlmT1cFv7PYLa353kbdOm/V2SV3b9vBoMhp0PPc+fFyb5dpJDkjw2yZ8leSDJiV0/rwaDYeahz5kzrYatSY7ewfw3Z/Bh/KO7fs4NBsOPhsWcQUl+KclHho+PTrK16+fbYDD8aFjM+TNt/pboBy2owZXNS0RVnVRVV1fVnVV1ZwZX4e01ZZGH7oHTWrt7+PDxbXDV8MuSvCrJLVX14frR7SouTfK84SdluyQ5P8lzh19h2CM/+iTsaUk+MGXb12fwNYifnLL9mx/B7nwvye7Tpu2e5K5HsA5gniym/Gmt/d8k/y7J/05y43C4K4M3QMACsJgyZ1RVdVoGV/W8uLV2z6TXD4xuqWTQ8ErItyc5fRLrA8a3VPJnqqr6/zJomL9v0utm9jSbl4CqelqSP09yWpInt9aemOTa/PhXwbertXZxa+2YDD6Z+sJwXWmtbUlydwZfl/hka+27GYTXqUk+3Vp7YLiKmzP4OsYTpwyPaa1tm7qZR7BL1yV55pT92y3JT8XXRmHBWYT5k9bama21/VtrP5lB03nZcJ+Aji3GzNmZqjo5yRszuJrIB1/QoSWWQftncLXip6rqGxn8gPveVfWNYRMKmEdLLH+m+tUk72+tfW8O1s0saTYvDbtl8KK+NUmq6tcy4v1Fq+onq2rDsKF7TwZXFT8wZZFLMwizB+/T84lp40nyriRvGYZfqmp5VW2Y9d4kH0hycFX9clU9JskZSa5prX1hjHUCc2NR5U9VPaaqDh7e22yfJGcl+W+ttTtmu05gohZV5gzX8ejh+50k2XWYQzWc9/Ik/yHJMa21r46zHWAillIGXZtkVZJnDYdfT/LN4eOJX70I7NRSyp8H5z82yUuTnD3Odpg8zeYloLW2Ocl/SnJZBm8AnpHBPY5H8agkv5Pk60luz+CG7v9qyvxLkzwhySe3M54k/y3JhUkuqaq7klyewY3pt6uqrhueQM20P7dmcC+ht2Rw0/nnJDlhxP0B5tFiy58kj0nyvzJ4A/aZ4X79wYj7A8yxRZg5yeCHfL6fZEWSi4ePnzac9++TPDnJFVX1veHwrp3sJzBHllIGtdbua61948FhWPMDw/H7R9lhYHKWUv5Mmf+LGdxr+uM72g7zr1qbi6vYAQAAAABYSlzZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxtWVcb3muvvdrq1au72jwwpquuuurbrbXlXdcxWzII+kv+AF2SQUBX+p4/iQyCPhs1gzprNq9evTpXXnllV5sHxlRVN3VdwzhkEPSX/AG6JIOArvQ9fxIZBH02agYtittonHzyyXnKU56Sgw8+eMb5rbWcfvrpWbNmTQ455JB89rOffWjeOeeck/333z/7779/zjnnnIemX3XVVXnGM56RNWvW5PTTT09rbc73A+gnGQR0Rf4AXZJBQFfkDyxgrbVOhsMOO6xNyqWXXtquuuqqdtBBB804/8Mf/nBbt25de+CBB9pll13WjjjiiNZaa7fddlvbd99922233dZuv/32tu+++7bbb7+9tdba4Ycf3i677LL2wAMPtHXr1rVNmzZNrF5YDJJc2TrKj0kMMgj6S/78iPyB+SeDfkQGwfzqe/60CWaQ/IH5N2oGLYorm4866qjsueee251/wQUX5KSTTkpV5cgjj8ydd96ZW265JRdffHGOOeaY7LnnnnnSk56UY445JhdddFFuueWWfPe7382RRx6ZqspJJ52UD37wg/O4R0CfyCCgK/IH6JIMAroif2DhWhTN5p3Ztm1bVq1a9dD4ypUrs23bth1OX7ly5cOmA8yGDAK6In+ALskgoCvyB7qz02ZzVf1FVX2rqq7dzvyqqj+tqi1VdU1VHTr5MoGlSgYBXZJBQFfkD9AlGQTM1ihXNp+dZN0O5h+XZP/hcGqS/zF+WZO1YsWK3HzzzQ+Nb926NStWrNjh9K1btz5sOtCJsyODZBB05+z0OIPkD/Ta2elx/iQyCHru7PQ4g+QPdGenzebW2ieT3L6DRTYkOXd4r+jLkzyxqvaeVIGTsH79+px77rlpreXyyy/PHnvskb333jvHHntsLrnkktxxxx254447cskll+TYY4/N3nvvnd133z2XX355Wms599xzs2HDhq53A5YkGSSDoEt9zyD5A/3V9/xJZBD0Wd8zSP5Ad5ZNYB0rktw8ZXzrcNot0xesqlMz+MQr++yzz8gbWP3GD+9w/q0Xvj33fO0fcv/3v5tlT9gre/x/L08euC9J8oRnH5/WWm7/5i7Zdc+nppY9Ok8+/rceWuf3nr4+T9nvoCTJHj/z0hz69suSJPc8/V/mqH/2srT77s1j9zssmy99IPXJwd/c+LYXj1w7MOdkENClkTJoseRPIoNgAfEeCOjSnGbQQsufRAbBqCbRbB5Za+2sJGclydq1a9uk1rt8/b/Z4fyqypNf9K9mnPf4Q16Uxx/yoodNf/Te++epp7xzIvUBC4MMAroif4AuySCgS3ORQfIHFq5R7tm8M9uSrJoyvnI4DWA+yCCgSzII6Ir8Abokg4AZTaLZfGGSk4a/RHpkku+01h72tQmAOSKDgC7JIKAr8gfokgwCZrTT22hU1XlJjk6yV1VtTfLvkvxEkrTW3pVkU5Ljk2xJcneSX5urYoGlRwYBXZJBQFfkD9AlGQTM1k6bza21E3cyvyV59cQqAphCBgFdkkFAV+QP0CUZBMzWJG6jAQAAAADAEqfZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLFpNgMAAAAAMDbNZgAAAAAAxqbZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLFpNgMAAAAAMDbNZgAAAAAAxqbZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLFpNgMAAAAAMDbNZgAAAAAAxqbZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABjG6nZXFXrquqLVbWlqt44w/x9qurjVfW5qrqmqo6ffKnAUiWDgK7IH6BLMgjoivwBZmunzeaq2iXJmUmOS3JgkhOr6sBpi/1+kvNba89OckKSd066UGBpkkFAV+QP0CUZBHRF/gDjGOXK5iOSbGmtfbW1dm+SjUk2TFumJdl9+HiPJF+fXInAEieDgK7IH6BLMgjoivwBZm3ZCMusSHLzlPGtSZ4zbZk3Jbmkql6TZLckL5xIdQAyCOiO/AG6JIOArsgfYNYm9QOBJyY5u7W2MsnxSf6qqh627qo6taqurKorb7311gltGkAGAZ2RP0CXZBDQlZHyJ5FBsNSM0mzelmTVlPGVw2lTnZLk/CRprV2W5DFJ9pq+otbaWa21ta21tcuXL59dxcBSI4OArsgfoEsyCOjKxPJnOF8GwRIySrP5iiT7V9W+VbVrBjd+v3DaMl9L8oIkqaqnZxAyPq4CJkEGAV2RP0CXZBDQFfkDzNpOm82ttfuSnJbk4iTXZ/Bro9dV1R9W1frhYq9L8htV9fkk5yV5ZWutzVXRwNIhg4CuyB+gSzII6Ir8AcYxyg8EprW2KcmmadPOmPJ4c5LnTrY0gAEZBHRF/gBdkkFAV+QPMFuT+oFAAAAAAACWMM1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGyazQAAAAAAjE2zGQAAAACAsWk2AwAAAAAwNs1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGyazQAAAAAAjE2zGQAAAACAsWk2AwAAAAAwNs1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGyazQAAAAAAjE2zGQAAAACAsWk2AwAAAAAwNs1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGMbqdlcVeuq6otVtaWq3ridZV5aVZur6rqq+l+TLRNYquQP0CUZBHRJBgFdkT/AbC3b2QJVtUuSM5Mck2Rrkiuq6sLW2uYpy+yf5HeTPLe1dkdVPWWuCgaWDvkDdEkGAV2SQUBX5A8wjlGubD4iyZbW2ldba/cm2Zhkw7RlfiPJma21O5KktfatyZYJLFHyB+iSDAK6JIOArsgfYNZGaTavSHLzlPGtw2lT/XSSn66qv6uqy6tq3aQKBJY0+QN0SQYBXZJBQFfkDzBrO72NxiNYz/5Jjk6yMsknq+oZrbU7py5UVacmOTVJ9tlnnwltGljiRsqfRAYBc8J7IKBLMgjoivMwYEajXNm8LcmqKeMrh9Om2prkwtbaD1trNyT5Ugah82Naa2e11ta21tYuX758tjUDS8fE8ieRQcAj5j0Q0CUZBHTFeRgwa6M0m69Isn9V7VtVuyY5IcmF05b5YAafZqWq9srg6xRfnWCdwNIkf4AuySCgSzII6Ir8AWZtp83m1tp9SU5LcnGS65Oc31q7rqr+sKrWDxe7OMltVbU5yceTvL61dttcFQ0sDfIH6JIMArokg4CuyB9gHCPds7m1tinJpmnTzpjyuCX5neEAMDHyB+iSDAK6JIOArsgfYLZGuY0GAAAAAADskGYzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLFpNgMAAAAAMDbNZgAAAAAAxqbZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLFpNgMAAAAAMDbNZgAAAAAAxqbZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLFpNgMAAAAAMDbNZgAAAAAAxqbZDAAAAADA2DSbAQAAAAAYm2YzAAAAAABj02wGAAAAAGBsms0AAAAAAIxNsxkAAAAAgLGN1GyuqnVV9cWq2lJVb9zBcr9cVa2q1k6uRGCpk0FAV+QP0CUZBHRF/gCztdNmc1XtkuTMJMclOTDJiVV14AzLPSHJa5P8/aSLBJYuGQR0Rf4AXZJBQFfkDzCOUa5sPiLJltbaV1tr9ybZmGTDDMv9UZI/TvKDCdYHIIOArsgfoEsyCOiK/AFmbZRm84okN08Z3zqc9pCqOjTJqtbah3e0oqo6taqurKorb7311kdcLLAkySCgK/IH6JIMAroysfwZLiuDYAkZ+wcCq+pRSf5zktftbNnW2lmttbWttbXLly8fd9MAMgjojPwBuiSDgK48kvxJZBAsNaM0m7clWTVlfOVw2oOekOTgJJ+oqhuTHJnkQjeHByZEBgFdkT9Al2QQ0BX5A8zaKM3mK5LsX1X7VtWuSU5IcuGDM1tr32mt7dVaW91aW53k8iTrW2tXzknFwFIjg4CuyB+gSzII6Ir8AWZtp83m1tp9SU5LcnGS65Oc31q7rqr+sKrWz3WBwNImg4CuyB+gSzII6Ir8AcaxbJSFWmubkmyaNu2M7Sx79PhlAfyIDAK6In+ALskgoCvyB5itsX8gEAAAAAAANJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGyazQAAAAAAjE2zGQAAAACAsWk2AwAAAAAwNs1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGyazQAAAAAAjE2zGQAAAACAsWk2AwAAAAAwNs1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGyazQAAAAAAjE2zGQAAAACAsWk2AwAAAAAwNs1mAAAAAADGptkMAAAAAMDYNJsBAAAAABibZjMAAAAAAGPTbAYAAAAAYGwjNZural1VfbGqtlTVG2eY/ztVtbmqrqmqj1XV0yZfKrAUyR+gSzII6JIMAroif4DZ2mmzuap2SXJmkuOSHJjkxKo6cNpin0uytrV2SJL3JXn7pAsFlh75A3RJBgFdkkFAV+QPMI5Rrmw+IsmW1tpXW2v3JtmYZMPUBVprH2+t3T0cvTzJysmWCSxR8gfokgwCuiSDgK7IH2DWRmk2r0hy85TxrcNp23NKko+MUxTAkPwBuiSDgC7JIKAr8geYtWWTXFlVvSLJ2iQ/t535pyY5NUn22WefSW4aWOJ2lj/DZWQQMCe8BwK6JIOArjgPA6Yb5crmbUlWTRlfOZz2Y6rqhUl+L8n61to9M62otXZWa21ta23t8uXLZ1MvsLRMLH8SGQQ8Yt4DAV2SQUBXnIcBszZKs/mKJPtX1b5VtWuSE5JcOHWBqnp2kj/LIGC+NfkygSVK/gBdkkFAl2QQ0BX5A8zaTpvNrbX7kpyW5OIk1yc5v7V2XVX9YVWtHy72H5M8Psl7q+rqqrpwO6sDGJn8Abokg4AuySCgK/IHGMdI92xurW1KsmnatDOmPH7hhOsCSCJ/gG7JIKBLMgjoivwBZmuU22gAAAAAAMAOaTYDAAAAADA2zWYAAAAAAMam2QwAAAAAwNg0mwEAAAAAGJtmMwAAAAAAY9NsBgAAAABgbJrNAAAAAACMTbMZAAAAAICxaTYDAAAAADA2zWYAAAAAAMam2QwAAAAAwNg0mwEAAAAAGJtmMwAAAAAAY9NsBgAAAABgbJrNAAAAAACMTbMZAAAAAICxaTYDAAAAADA2zWYAAAAAAMam2QwAAAAAwNg0mwEAAAAAGJtmMwAAAAAAY9NsBgAAAABgbJrNAAAAAACMTbMZAAAAAICxaTZ36KKLLsoBBxyQNWvW5G1ve9vD5t9zzz152cteljVr1uQ5z3lObrzxxofmvfWtb82aNWtywAEH5OKLLx55nUu17j7W3Oe66Yc+Hl99rLmvdfexZvqjr8dXH+vuY819rpt+6OPx1cea1S2DmFkfj68+1tzXuvtY83SazR25//778+pXvzof+chHsnnz5px33nnZvHnzjy3z7ne/O0960pOyZcuW/PZv/3be8IY3JEk2b96cjRs35rrrrstFF12U3/zN38z9998/0jqXYt19rLnPddMPfTy++lhzX+vuY830R1+Prz7W3cea+1w3/dDH46uPNatbBjGzPh5ffay5r3X3seaZaDZ35DOf+UzWrFmT/fbbL7vuumtOOOGEXHDBBT+2zAUXXJBf/dVfTZK85CUvycc+9rG01nLBBRfkhBNOyKMf/ejsu+++WbNmTT7zmc+MtM6lWHcfa+5z3fRDH4+vPtbc17r7WDP90dfjq49197HmPtdNP/Tx+OpjzeqWQcysj8dXH2vua919rHkmms0d2bZtW1atWvXQ+MqVK7Nt27btLrNs2bLsscceue2227b7t6OscynW3cea+1w3/dDH46uPNfe17j7WTH/09fjqY919rLnPddMPfTy++lizuue/bvqhj8dXH2vua919rHkmIzWbq2pdVX2xqrZU1RtnmP/oqnrPcP7fV9XqSRcKLF0yCOiK/AG6JIOArsgfYLZ22myuql2SnJnkuCQHJjmxqg6cttgpSe5ora1J8l+S/PGkC11sVqxYkZtvvvmh8a1bt2bFihXbXea+++7Ld77znTz5yU/e7t+Oss6lWHcfa+5z3ZMmg+ZGH4+vPtbc17r7WPNckD9zo6/HVx/r7mPNfa570mTQ3Ojj8dXHmtU9/3VPkvyZO308vvpYc1/r7mPNMxnlyuYjkmxprX21tXZvko1JNkxbZkOSc4aP35fkBVVVkytz8Tn88MPz5S9/OTfccEPuvffebNy4MevXr/+xZdavX59zzhk8re973/vy/Oc/P1WV9evXZ+PGjbnnnntyww035Mtf/nKOOOKIkda5FOvuY819rnsOyKA50Mfjq48197XuPtY8R+TPHOjr8dXHuvtYc5/rngMyaA708fjqY83q7n0GyZ850sfjq48197XuPtY8k2UjLLMiyc1Txrcmec72lmmt3VdV30ny5CTfnkSRi9GyZcvyjne8I8cee2zuv//+nHzyyTnooINyxhlnZO3atVm/fn1OOeWU/Mqv/ErWrFmTPffcMxs3bkySHHTQQXnpS1+aAw88MMuWLcuZZ56ZXXbZJUlmXOdSr7uPNfe57jkgg+ZAH4+vPtbc17r7WPMckT9zoK/HVx/r7mPNfa57DsigOdDH46uPNau79xkkf+ZIH4+vPtbc17r7WPNMqrW24wWqXpJkXWvt14fjv5LkOa2106Ysc+1wma3D8a8Ml/n2tHWdmuTU4egBSb44qR0Z0V7pZ/D1se4+1pz0s+6uan5aa235XG9EBnWujzUn6p5PXdQsfx65Ph5bibrnUx9rTmSQDJpbfay7jzUn/axb/oyQP8N5MuiR62PNST/r7mPNyQLOoFGubN6WZNWU8ZXDaTMts7WqliXZI8lt01fUWjsryVkjbHNOVNWVrbW1XW1/tvpYdx9rTvpZdx9rfoRkUIf6WHOi7vnUx5ofAfnTMXXPnz7WnPS37hHJoI71se4+1pz0s+4+1vwITCx/Ehk0G32sOeln3X2sOVnYdY9yz+YrkuxfVftW1a5JTkhy4bRlLkzyq8PHL0nyt21nl0wDjEYGAV2RP0CXZBDQFfkDzNpOr2we3nvntCQXJ9klyV+01q6rqj9McmVr7cIk707yV1W1JcntGQQRwNhkENAV+QN0SQYBXZE/wDhGuY1GWmubkmyaNu2MKY9/kORfTLa0OdHZ1zbG1Me6+1hz0s+6+1jzIyKDOtXHmhN1z6c+1jwy+dM5dc+fPtac9LfukcigzvWx7j7WnPSz7j7WPLJFlD9JP/9f9bHmpJ9197HmZAHXvdMfCAQAAAAAgJ0Z5Z7NAAAAAACwQ0ui2VxVf1FV36qqa7uu5ZGoqtdW1bVVdV1V/VbX9Yyqqn57WPO1VXVeVT2m65p2pKpWVdXHq2rzsO7Xdl0Ti0NV7VJVn6uqDw3HT6uqLVXVqmqvruubbqasrKo/qqprqurqqrqkqp7aZY0z2U7db6qqbcO6r66q47uscbod/btUVa9bqMcI/bCd18S/GP4b90BVLchfrd5O3e+Z8jq+saqu7rLG6bZT8zOr6rKq+oeq+j9VtXuXNc6kr3lPPyyi1/KCfi+RbLfu/1hVXxi+nj9QVU/sssbptnfu1YfsZOHbwfG1oP+N6+lr+TFV9Zmq+vzwuX7zcPqnpuTm16vqg13XOpXzsPmxJJrNSc5Osq7rIh6Jqjo4yW8kOSLJM5P8QlWt6baqnauqFUlOT7K2tXZwBj8msNB/KOC+JK9rrR2Y5Mgkr66qAzuuicXhtUmunzL+d0lemOSmbsrZqbPz8Kz8j621Q1prz0ryoSRnPOyvund2Zs74/9Jae9Zw2DTD/C6dnRlqrqpVSV6U5GvzXRCLytl5+PF1bZJ/nuST817N6M7OtLpbay978HWc5H8neX8Xhe3A2Xn4c/0/k7yxtfaMJB9I8vr5LmoEZ6efeU8/nJ3F8VpOFvZ7iWTmuj+a5ODW2iFJvpTkd+e7qJ3Y3rlXH7KThW97x9dC/zfu7PTvtXxPkue31p6Z5FlJ1lXVka21503J+8vSk7x3HjZZS6LZ3Fr7ZAa/jtonT0/y9621u1tr9yW5NIOTxD5YluSxVbUsyeOSfL3jenaotXZLa+2zw8d3ZdAcXNFtVfRdVa1M8uIM3jgnSVprn2ut3dhZUTsxU1a21r47ZXS3JAvuRv99zPgd1PxfkvybLMDnmf7Yzmv5+tbaFzsqaSQ7ei1XVSV5aZLz5rWondhOzT+dHzX1P5oWlRAdAAAgAElEQVTkl+e1qBH0Ne/ph0X0Wl7wtvNavmR4/pgklydZOe+F7cAOzr0WfHay8G3v+Fro/8b19LXcWmvfG47+xHB46Hkdfjvh+UkW1JXNzsPmx5JoNvfUtUmeV1VPrqrHJTk+yaqOa9qp1tq2JH+SwadBtyT5Tmvtkm6rGl1VrU7y7CR/320lLAL/NYN/rB7oupBxVdVbqurmJC/PwrsKYEdOG37t7C+q6kldF7MzVbUhybbW2ue7rgUWoOcl+WZr7ctdFzKC65JsGD7+F+nB+7cH9Tjv6Y8+vZaTnr2XmMHJST7SdRHbM+3cq7fZycI0/dy+5//GLcjXcg1uG3l1km8l+WhrbWof5ReTfGxao39Bch42eZrNC1Rr7fokf5zkkiQXJbk6yf2dFjWC4ZuwDUn2TfLUJLtV1Su6rWo0VfX4DL7W91t9CEQWrqr6hSTfaq1d1XUtk9Ba+73W2qokf5PktK7rGdH/SPJTGXyl65Yk/6nbcnZs+KHiv03/3vjCfDkxC+xKyB04OclvVtVVSZ6Q5N6O6xlZT/OefunTa7lX7yWmq6rfy+CWAn/TdS0zmeHcq7fZycIz07l9X/+NW8iv5dba/cPbZaxMcsTwdrAP6kXeOw+bG5rNC1hr7d2ttcNaa0cluSOD+/QsdC9MckNr7dbW2g8zuD/Pz3Zc005V1U9k8I/R37TWFto9heif5yZZX1U3JtmY5PlV9dfdljQRf5OefKWxtfbN4ZufB5L8eQb3v1/IfiqDD+k+PzxuVib5bFX9k06rggVgeFuuf57kPV3XMorW2hdaay9qrR2WwUnWV7quaRZ6k/f0Rw9fy317L/GQqnplkl9I8vLW2oL7SvhM516LJDtZAEY4t+/Nv3EL/bX8oNbanUk+nuG9kIc/sHdEkg93WdeInIfNAc3mBayqnjL87z4ZvDH7X91WNJKvJTmyqh43vCfbC/LjP5C24AzrfHeS61tr/7nreui/1trvttZWttZWZ/ADmX/bWuvFFf7TVdX+U0Y3JPlCV7U8ElW195TRX8rg1kQLVmvtH1prT2mtrR4eN1uTHNpa+0bHpcFC8MIkX2itbe26kFFMef/2qCS/n+Rd3VY0mr7mPb3St9dyr95LPKiq1mVwK7f1rbW7u65nuu2de/U1O1lYdnB89e7fuB68lpdX1ROHjx+b5Jj86Hl9SZIPtdZ+0FV9o3IeNjeWRLO5qs7L4FcwD6iqrVV1Stc1jeh/V9XmJP8nyauHnxYtaMN79LwvyWeT/EMGx9hZnRa1c89N8isZXH169XA4vuuiWHyq6vSq2prBp6XXVNX/3NnfzKftZOXbquraqromg1/nfW2nRc5gO3W/var+YVj3zyf57U6LnKbH/y7RAzMdX1X1S8P8+ZkkH66qi7ut8uF28Lo4IQv0a5jbqfnEqvpSBidcX0/yl13WOJO+5j39sIheywv6vUSy3brfkcFtKD46PK9ZaE3b7Z17LfjspBe2d3wt6H/jevpa3jvJx4fP6RUZ3LP5Q8N5fct7JqwW8JX4AAAAAAD0xJK4shkAAAAAgLml2QwAAAAAwNg0mwEAAAAAGJtmMwAAAAAAY9NsBgAAAABgbJrNAAAAAACMTbMZAAAAAICxaTYDAAAAADA2zWYWvKo6sqo+WlW3V9WtVfXeqtp7yvzXV9W1VXVXVd1QVa/vsl5gcRkhg95UVT+squ9NGfbrsmZgcdhZ/gyXObSqPjnMnm9W1Wu7qhdYXKrqwKq6sqruGA7/t6oOnDL/56vq41X1naq6scNSgUVmhPxxDraAaTbTqapaNsJiT0pyVpLVSZ6W5K4kfzl1NUlOGi63LslpVXXCZCsFFqMJZVCSvKe19vgpw1cnWymw2Ewif6pqryQXJfmzJE9OsibJJZOuFVh8Rsygryd5SZI9k+yV5MIkG6fM/8ckf5HExT7AyCaUP4lzsAVLs3mRqqo3VtVXhlf7bq6qX5oy75VV9emq+pPhJ0Q3VNVx0+Z/dcqVwi8fTr+pqg4bPn55VbWqOmg4fkpVfXD4+FFTtn9bVZ1fVXsO560e/t0pVfW1JH+7s31prX2ktfbe1tp3W2t3J3lHkudOmf/21tpnW2v3tda+mOSCqfOB+beUMghYWJZY/vxOkotba3/TWruntXZXa+36sZ9EYNYWWQbd2Vq7sbXWMrjA5/4MPtR6cP5nWmt/lUSDBxaApZQ/LGyazYvXV5I8L8keSd6c5K/rx792+ZwkX8zgE6K3J3l3DeyW5E+THNdae0KSn01y9fBvLk1y9PDxz2XwpuKoKeOXDh+/JskvDqc9NckdSc6cVt/PJXl6kmOTpKquqap/OeK+HZXkuplmVFUN93vG+cC8WWoZ9M9q8DX366rqX424HmBuLKX8OTLJ7VX1/6rqW1X1f6pqnxHXBcyNRZdBVXVnkh8k+e9J/sNOnwGgK0stf5yDLVStNcMSGDIIig3Dx69MsmXKvMclaUn+SZLdktyZ5JeTPHbaOk5JcuHw8fVJfj3JxuH4TUkOnTLvBVP+bu8kP0yyLIOvgbYk+81yPw5JcnuS521n/puTfD7Jo7t+zg0Gw4+GxZxBSQ7M4A3VLhm8MbslyYldP+cGg2EwLPL8+dKw5sOTPCaDE8W/6/o5NxgMPxoWUQbtluQ3k7x4hnkvTHJj18+1wWD48WEx50+cgy3owZXNi1RVnVRVV1fVncNPgg7O4NOrB33jwQdt8LXMJHl8a+0fk7wsyauS3FJVH66qfzqcf2mS5w0/GdslyflJnltVqzP45OzBT76eluQDU7Z9fQZfefjJKdu/eRb7tCbJR5K8trX2qRnmn5bBvZtf3Fq755GuH5icpZRBrbXNrbWvt9bub639vyT/LYP7iwEdWEr5k+T7ST7QWruitfaDDD50/9mq2uORbgOYjMWYQcNa/zHJu5KcW1VPmc06gLm1lPLHOdjCptm8CFXV05L8eZLTkjy5tfbEJNdmcJ+bnWqtXdxaOyaDT6K+MFxXWmtbktydwdcjPtla+24GYXVqkk+31h4YruLmDL5+8cQpw2Naa9umbmYW+/R/k/xRG9wXbPr8k5O8MYNP0rY+knUDk7UUM2j6LmTEfQUmawnmzzXT1veI1g1M1mLMoGkelcHVkCvGWAcwB+SPc7CFRLN5cdotgxfarUlSVb+WwSdaO1VVP1lVG4b37LknyfeSPDBlkUszCK8H78vziWnjyeATp7cMwy5VtbyqNsx2Z6pqRQY3kH9Ha+1dM8x/eQb37jmm+fVRWAiWWgZtqKonDe93dkSS0zP4oVJg/i2p/Enyl0l+qaqeVVU/keQPMjjx+85stwmMZbFl0DFV9eyq2qWqdk/ynzO4D+v1w/mPqqrHJPmJwWg9pqp2ne32gLEstfxxDraAaTYvQq21zUn+U5LLknwzyTOS/N2If/6oDH7Z/OsZ3Bfw55JMvdH6pUmekOST2xlPBl9fuDDJJVV1V5LLM7gR/XbV4IbuL9/O7F9Psl+SN1XV9x4cpsz/90menOSKKfNnOiED5sESzKATkmxJcleSc5P8cWvtnJ3tKDB5Sy1/Wmt/m+TfJvlwkm9l8Cvto/7YIDBhizCDnpjkvCTfyeCHx34qybrhbXuSwY+EfT/JpiT7DB9fsrMdBSZvCeaPc7AFrFrzbTsAAAAAAMbjymYAAAAAAMam2QwAAAAAwNg0mwEAAAAAGJtmMwAAAAAAY9NsBgAAAABgbMu62vBee+3VVq9e3dXmgTFdddVV326tLe+6jtmSQdBf8gfokgwCutL3/ElkEPTZqBnUWbN59erVufLKK7vaPDCmqrqp6xrGIYOgv+QP0CUZBHSl7/mTyCDos1EzaFHcRuPkk0/OU57ylBx88MEzzm+t5fTTT8+aNWtyyCGH5LOf/exD884555zsv//+2X///XPOOec8NP2qq67KM57xjKxZsyann356Wmtzvh9AP1100UU54IADsmbNmrztbW972PybbropL3jBC3LIIYfk6KOPztatWx+a94Y3vCEHH3xwDj744LznPe952N+efvrpefzjHz+n9QP9NtsMuummm3LooYfmWc96Vg466KC8613vSpLcddddedaznvXQsNdee+W3fuu35nWfgH5wHgZ0Rf7AAtZa62Q47LDD2qRceuml7aqrrmoHHXTQjPM//OEPt3Xr1rUHHnigXXbZZe2II45orbV22223tX333bfddttt7fbbb2/77rtvu/3221trrR1++OHtsssuaw888EBbt25d27Rp08TqhcUgyZWto/yYxDCpDLrvvvvafvvt177yla+0e+65px1yyCHtuuuu+7FlXvKSl7Szzz67tdbaxz72sfaKV7yitdbahz70ofbCF76w/fCHP2zf+9732tq1a9t3vvOdh/7uiiuuaK94xSvabrvtNpFaYbGQPz8yTgbdc8897Qc/+EFrrbW77rqrPe1pT2vbtm172DYOPfTQdumll06sZug7GfQjzsNgfvU9f9oEM0j+wPwbNYMWxZXNRx11VPbcc8/tzr/gggty0kknpapy5JFH5s4778wtt9ySiy++OMccc0z23HPPPOlJT8oxxxyTiy66KLfccku++93v5sgjj0xV5aSTTsoHP/jBedwjoC8+85nPZM2aNdlvv/2y66675oQTTsgFF1zwY8ts3rw5z3/+85MkP//zP//Q/M2bN+eoo47KsmXLsttuu+WQQw7JRRddlCS5//778/rXvz5vf/vb53eHgF4ZJ4N23XXXPPrRj06S3HPPPXnggQcetv4vfelL+da3vpXnPe95c7wnQB85DwO6In9g4VoUzead2bZtW1atWvXQ+MqVK7Nt27YdTl+5cuXDpgPzr6r+oqq+VVXXbmd+VdWfVtWWqrqmqg6dz/q2lyNTPfOZz8z73//+JMkHPvCB3HXXXbntttvyzGc+MxdddFHuvvvufPvb387HP/7x3HzzzUmSd7zjHVm/fn323nvv+dsZoHfGyaAkufnmm3PIIYdk1apVecMb3pCnPvWpP/a3GzduzMte9rJU1RzvCbAYOQ8DuiJ/oDs7bTYv9EYPsOidnWTdDuYfl2T/4XBqkv8xDzU9In/yJ3+SSy+9NM9+9rNz6aWXZsWKFdlll13yohe9KMcff3x+9md/NieeeGJ+5md+Jrvssku+/vWv573vfW9e85rXdF06sAhsL4OSZNWqVbnmmmuyZcuWnHPOOfnmN7/5Y3+7cePGnHjiiV2UDUue8zCgSzIImK1Rrmw+Oz1v9KxYseKhqwWTZOvWrVmxYsUOp0/9Aa8HpwPzr7X2ySS372CRDUnOHd5C6PIkT6yqebsceHs5MtVTn/rUvP/978/nPve5vOUtb0mSPPGJT0yS/N7v/V6uvvrqfPSjH01rLT/90z+dz33uc9myZUvWrFmT1atX5+67786aNWvma5eAHhk3g6Yuc/DBB+dTn/rUQ9M+//nP57777sthhx02h3sA7MDZcR7mPAy6c3Z6nEHyB7qz02bzQm/0jGL9+vU599xz01rL5Zdfnj322CN77713jj322FxyySW54447cscdd+SSSy7Jsccem7333ju77757Lr/88rTWcu6552bDhg1d7wYwsxVJbp4yvnU47WGq6tSqurKqrrz11lsnsvHDDz88X/7yl3PDDTfk3nvvzcaNG7N+/fofW+bb3/72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GJpmMwAAAAAAQ9NsBgAAAABgaJrNAAAAAAAMTbMZAAAAAIChaTYDADBSW7duzfHHH5+xsbFceeWVz9n++OOP541vfGPGxsZy6qmn5oEHHtiz7Wtf+1p+5Ed+JOvXr88rX/nKPPbYY3n00Udzzjnn5BWveEXWr1+fyy+/fITfDQAA8AzNZgAARuapp57KxRdfnBtvvDHbt2/Ptddem+3btz9rzNVXX53DDz88O3bsyKWXXprLLrssSTI+Pp43velN+chHPpJt27bllltuyfOf//wkybve9a584xvfyFe+8pV88YtfzI033jjy7w0AAJY6zWYAAEbmtttuy9jYWI499tisWLEi559/fjZv3vysMZs3b86FF16YJDnvvPNy8803p7WWT33qU3nVq16VE044IUlyxBFHZNmyZTn44INz2mmnJUlWrFiRE088MTt37hztNwYAAGg2AwAwOrt27cqaNWv2LK9evTq7du2acczy5ctz6KGH5qGHHso3v/nNVFXOOuusnHjiifnQhz70nM9/+OGH84lPfCJnnHHG/H4jAADAcyzvOgAAAMzG+Ph4vvCFL+T222/PwQcfnDPOOCMnnXTSnsby+Ph4LrjggrzjHe/Iscce23FaAABYesxsBgBgZFatWpUHH3xwz/LOnTuzatWqGceMj4/nkUceyRFHHJHVq1fnNa95TY488sgcfPDBef3rX58vf/nLe77uoosuytq1a/POd75zNN8MAADwLJrNAACMzMknn5x77703999/f5544ols2rQpGzdufNaYjRs35pprrkmSXH/99Tn99NP33D7j61//eh599NGMj4/nc5/7XNatW5ckee9735tHHnkkv//7vz/y7wkAAJjgNhoAAMypoy//5F63f/ekX8hxJ/1Y0p7OIa88M+f88QN5+PO/nRUvXpuD156aNv7SfPuWa3P14S/N815wSI7ceNmez/yXVafnsJf9QFLJC47dkIs/n/zSJ6/Jrj/8QJa/aHW+5yVjSZIXnvjTeeEJZyVJHrjynPn9hgEAgCSazQAAjNgLXn5yVr385GetO+zH37TnfS1fkZU/8+5pv/aQ9aflkPWnPWvd8u89Mt9/2V/MfVAAAGC/uI0GAAAAAABD02wGAAAAAGBoms0AAAAAAAxNs7lDW7duzfHHH5+xsbFceeWVz9n++OOP541vfGPGxsZy6qmn5oEHHtiz7Xd+53cyNjaW448/PjfddNOsP3Op5u5j5j7nph/mev967LHHcsopp+SEE07I+vXr8773vU/meco9m89ciplhvvXxuOhj5j7nph/6uH/1MbPcahDT6+P+1cfMfc3dx8xTaTZ35KmnnsrFF1+cG2+8Mdu3b8+1116b7du3P2vM1VdfncMPPzw7duzIpZdemssuuyxJsn379mzatCnbtm3L1q1b8/a3vz1PPfXUrD5zKebuY+Y+56Yf5mP/Ouigg/KZz3wmX/3qV3PnnXdm69atufXWW5d05vnKrW7C6PXxuOhj5j7nph/6uH/1MbPcahDT6+P+1cfMfc3dx8zT0WzuyG233ZaxsbEce+yxWbFiRc4///xs3rz5WWM2b96cCy+8MEly3nnn5eabb05rLZs3b87555+fgw46KMccc0zGxsZy2223zeozl2LuPmbuc276YT72r6rKIYcckiR58skn8+STT6aqlnTm+cqtbsLo9fG46GPmPuemH/q4f/Uxs9xqENPr4/7Vx8x9zd3HzNPRbO7Irl27smbNmj3Lq1evzq5du2Ycs3z58hx66KF56KGHZvza2XzmUszdx8x9zk0/zMf+lUz8JvbVr351jjrqqJx55pk59dRTl3Tm+cqtbsLo9fG46GPmPuemH/q4f/Uxs9yjz00/9HH/6mPmvubuY+bpzKrZXFVnV9U9VbWjqi6fZvtBVfU/Btu/VFVHz3VQYOlSg/pj2bJlufPOO7Nz587cdtttueuuu7qOtE99zMzoqD9Al9QgoCvqD3Cg9tlsrqplSa5K8rok65JcUFXrpgx7a5LvtNbGkvxekg/OddDFZtWqVXnwwQf3LO/cuTOrVq2accz4+HgeeeSRHHHEETN+7Ww+cynm7mPmPueea2rQ/JiP/Wuyww47LKeddlq2bt26pDPPV251czTUHybr43HRx8x9zj3X1KD50cf9q4+Z5R597rmk/syfPu5ffczc19x9zDyd2cxsPiXJjtbafa21J5JsSnLulDHnJrlm8P76JGfUXN/0cpE5+eSTc++99+b+++/PE088kU2bNmXjxo3PGrNx48Zcc83Ej/X666/P6aefnqrKxo0bs2nTpjz++OO5//77c++99+aUU06Z1Wcuxdx9zNzn3PNADZoH87F/7d69Ow8//HCS5Lvf/W4+/elP5xWveMWSzjxfudXN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\n", 500 | "text/plain": [ 501 | "" 502 | ] 503 | }, 504 | "metadata": {}, 505 | "output_type": "display_data" 506 | } 507 | ], 508 | "source": [ 509 | "### Print out the top five softmax probabilities for the predictions on the German traffic sign images found on the web. \n", 510 | "with tf.Session() as sess:\n", 511 | " top5 = sess.run(tf.nn.top_k(tf.constant(probabilities), k=5))\n", 512 | "\n", 513 | "values = top5.values\n", 514 | "indices = top5.indices\n", 515 | "fig, axes = plt.subplots(2, 5, figsize=(25, 8))\n", 516 | "for i in range(2):\n", 517 | " for j in range(5):\n", 518 | " axes[i][j].bar(range(5), values[i*5+j])\n", 519 | " axes[i][j].set_xticklabels(indices[i*5+j])\n", 520 | " axes[i][j].set_title(\"answer: \"+str(online_labels[i*5+j]))\n", 521 | " for x_,y_ in zip(range(5), values[i*5+j]):\n", 522 | " axes[i][j].text(x_ - 0.25, y_, '%.3f'%y_)" 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": null, 528 | "metadata": {}, 529 | "outputs": [], 530 | "source": [] 531 | } 532 | ], 533 | "metadata": { 534 | "kernelspec": { 535 | "display_name": "Python 3", 536 | "language": "python", 537 | "name": "python3" 538 | }, 539 | "language_info": { 540 | "codemirror_mode": { 541 | "name": "ipython", 542 | "version": 3 543 | }, 544 | "file_extension": ".py", 545 | "mimetype": "text/x-python", 546 | "name": "python", 547 | "nbconvert_exporter": "python", 548 | "pygments_lexer": "ipython3", 549 | "version": "3.5.2" 550 | } 551 | }, 552 | "nbformat": 4, 553 | "nbformat_minor": 2 554 | } 555 | --------------------------------------------------------------------------------