Introduction à l'apprentissage automatique - TP6 exercice 3

CNN pour MNIST


Dans cet exercice nous allons mettre en oeuvre un réseau de neurones convolutif pour la base de données MNIST sur laquelle nous avons testé les classifieurs tout au long du cours.


La cellule suivante importe les données et les sépare en base d'apprentissage (9000 images) et en base de test (1000 images). Les niveaux de gris sont normalisés entre 0 et 1.

In [ ]:
from sklearn import datasets, metrics
%matplotlib inline 

# Mnist database: (il faut quelques dizaines de secondes pour charger la base)
# les données sont décrites ici: https://www.openml.org/d/554
size_images=(28,28)
X_digits, y_digits = datasets.fetch_openml('mnist_784', version=1, return_X_y=True)

n_samples = len(X_digits)
print("nombre total d'observations (apprentissage + test): %d" % n_samples)

n_features = len(X_digits[0])
print("nombre de caractéristiques par observation: %d" % n_features)

print(X_digits.shape)

X_train = X_digits[: 9000]/255.
y_train = y_digits[: 9000]
X_test = X_digits[9000 : 10000]/255.
y_test = y_digits[9000 : 10000]
print("nombre d'observations dans la base d'apprentissage: %d" %len(X_train))
print("nombre d'observations dans la base de test: %d" %len(X_test))

On définit la fonction d'affichage habituelle:

In [ ]:
import numpy as np
import matplotlib.pyplot as plt
import time

def affichage_150_images(X_test,y_test,y_pred):
    plt.figure(figsize=[15,12])   
    for n in range(150):
        plt.subplot(10,15,n+1,xticks=[],yticks=[])
        plt.imshow(255*np.reshape(X_test[n,:],size_images),cmap='gray_r',vmin=0,vmax=16)
        if y_pred[n]==y_test[n]:
            plt.text(0.1,0.1,str(y_pred[n])+' / '+str(y_test[n]),fontsize=6,bbox=dict(facecolor='white', alpha=1))    
        else:
            plt.text(0.1,0.1,str(y_pred[n])+' / '+str(y_test[n]),fontsize=6,bbox=dict(facecolor='red', alpha=1))    
    plt.suptitle('classe predite / classe réelle')
    plt.show();

Les CNN de Tensorflow exigent des bases de données sous la forme de tableaux numpy de dimension 4, de taille $(N,li,co,ch)$ où

  • $N$ est le nombre d'observations
  • $li$ est le nombre de lignes de chaque image
  • $co$ est le nombre de colonnes de chaque image
  • $ch$ est le nombre de canaux de chaque image (1 ici, car les images sont en noir-et-blanc)

On reformate donc les tableaux X_train et X_test. Par ailleurs, y_train et y_test doivent être de type entier.

In [ ]:
X_train = X_train.reshape((len(X_train),)+size_images+(1,))
X_test = X_test.reshape((len(X_test),)+size_images+(1,))
y_train = y_train.astype(int)
y_test = y_test.astype(int)


Travail à faire:

en vous inspirant de la première partie de l'exercice 2, construisez un CNN permettant de lire les chiffres.


In [ ]:
# à vous de jouer!