{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "German Traffic Sign Recognition Benchmark (GTSRB)\n", "=================================================\n", "---\n", "Introduction au Deep Learning (IDLE) - S. Arias, E. Maldonado, JL. Parouty - CNRS/SARI/DEVLOG - 2020 \n", "\n", "## Episode 2 : First Convolutions\n", "\n", "Our main steps:\n", " - Read H5 dataset\n", " - Build a model\n", " - Train the model\n", " - Evaluate the model\n", "\n", "## 1/ Import and init" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras.callbacks import TensorBoard\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import h5py\n", "import os,time\n", "\n", "import fidle.pwk as ooo\n", "from importlib import reload\n", "\n", "ooo.init()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2/ Load dataset\n", "We're going to retrieve a previously recorded dataset. \n", "For example: set-24x24-L" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%time\n", "\n", "def read_dataset(name):\n", " '''Reads h5 dataset from ./data\n", "\n", " Arguments: dataset name, without .h5\n", " Returns: x_train,y_train,x_test,y_test data'''\n", " # ---- Read dataset\n", " filename='./data/'+name+'.h5'\n", " with h5py.File(filename) as f:\n", " x_train = f['x_train'][:]\n", " y_train = f['y_train'][:]\n", " x_test = f['x_test'][:]\n", " y_test = f['y_test'][:]\n", "\n", " # ---- done\n", " print('Dataset \"{}\" is loaded. ({:.1f} Mo)\\n'.format(name,os.path.getsize(filename)/(1024*1024)))\n", " return x_train,y_train,x_test,y_test\n", "\n", "x_train,y_train,x_test,y_test = read_dataset('set-24x24-L')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3/ Have a look to the dataset\n", "We take a quick look as we go by..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"x_train : \", x_train.shape)\n", "print(\"y_train : \", y_train.shape)\n", "print(\"x_test : \", x_test.shape)\n", "print(\"y_test : \", y_test.shape)\n", "\n", "ooo.plot_images(x_train, y_train, range(12), columns=6, x_size=2, y_size=2)\n", "ooo.plot_images(x_train, y_train, range(36), columns=12, x_size=1, y_size=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4/ Create model\n", "We will now build a model and train it...\n", "\n", "Some models :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# A basic model\n", "#\n", "def get_model_v1(lx,ly,lz):\n", " \n", " model = keras.models.Sequential()\n", " \n", " model.add( keras.layers.Conv2D(96, (3,3), activation='relu', input_shape=(lx,ly,lz)))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Conv2D(192, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Flatten()) \n", " model.add( keras.layers.Dense(1500, activation='relu'))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Dense(43, activation='softmax'))\n", " return model\n", " \n", "# A more sophisticated model\n", "#\n", "def get_model_v2(lx,ly,lz):\n", " model = keras.models.Sequential()\n", "\n", " model.add( keras.layers.Conv2D(64, (3, 3), padding='same', input_shape=(lx,ly,lz), activation='relu'))\n", " model.add( keras.layers.Conv2D(64, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D(pool_size=(2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Conv2D(128, (3, 3), padding='same', activation='relu'))\n", " model.add( keras.layers.Conv2D(128, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D(pool_size=(2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Conv2D(256, (3, 3), padding='same',activation='relu'))\n", " model.add( keras.layers.Conv2D(256, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D(pool_size=(2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Flatten())\n", " model.add( keras.layers.Dense(512, activation='relu'))\n", " model.add( keras.layers.Dropout(0.5))\n", " model.add( keras.layers.Dense(43, activation='softmax'))\n", " return model\n", "\n", "# My sphisticated model, but small and fast\n", "#\n", "def get_model_v3(lx,ly,lz):\n", " model = keras.models.Sequential()\n", " model.add( keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(lx,ly,lz)))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Conv2D(64, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Conv2D(128, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Conv2D(256, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Flatten()) \n", " model.add( keras.layers.Dense(1152, activation='relu'))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Dense(43, activation='softmax'))\n", " return model\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5/ Train the model\n", "**Get the shape of my data :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(n,lx,ly,lz) = x_train.shape\n", "print(\"Images of the dataset have this folowing shape : \",(lx,ly,lz))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get and compile a model, with the data shape :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = get_model_v1(lx,ly,lz)\n", "\n", "model.summary()\n", "\n", "model.compile(optimizer = 'adam',\n", " loss = 'sparse_categorical_crossentropy',\n", " metrics = ['accuracy'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Train it :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%time\n", "\n", "batch_size = 64\n", "epochs = 5\n", "\n", "# ---- Shuffle train data\n", "x_train,y_train=ooo.shuffle_np_dataset(x_train,y_train)\n", "\n", "# ---- Train\n", "history = model.fit( x_train, y_train,\n", " batch_size = batch_size,\n", " epochs = epochs,\n", " verbose = 1,\n", " validation_data = (x_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Evaluate it :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "max_val_accuracy = max(history.history[\"val_accuracy\"])\n", "print(\"Max validation accuracy is : {:.4f}\".format(max_val_accuracy))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "score = model.evaluate(x_test, y_test, verbose=0)\n", "\n", "print('Test loss : {:5.4f}'.format(score[0]))\n", "print('Test accuracy : {:5.4f}'.format(score[1]))" ] } ], "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.7.5" } }, "nbformat": 4, "nbformat_minor": 4 }