.. _chap-tpDeepLearning8: ############################################################################## Travaux pratiques - Ordonnancement Structuré (2) : application et évaluation ############################################################################## Exercice 2 : Entraînement du modèle et évaluation des performances ***************************************************************************************** Pour évaluer le modèle d'ordonnancement structuré mis en place au TP7, on va considérer une catégorie de la base MNIST comme la requête (*e.g.* les images de la classe 8), et évaluer la capacité du modèle à ordonner les exemples pertinents par rapport à la requête (*e.g.* les images de la classe 8) avant les exemples non pertinents (*e.g.* les images des autres classes que la classe 8). Le code suivant permet d'obtenir les données et labels binaire pour les images de la base MNIST et une requête .. code-block:: python from keras.datasets import mnist (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train.reshape(60000, 784) X_test = X_test.reshape(10000, 784) X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 X_test /= 255 # Query (class) c = 9 # Getting binary labels y_trainb = np.zeros(60000) y_testb = np.zeros(10000) y_trainb[y_train==c] = 1 y_trainb[y_train!=c] = 0 y_testb[y_test==c] = 1 y_testb[y_test!=c] = 0 Le constructeur de la classe ``SRanking`` du TP 7 nécessite une annotation de type ranking ``RankingOutput``. Créer les sorties structurées pour du ranking données par la supervision pour les données d'apprentissage : .. code-block:: python # Training with the first nbex examples nbex = 1000 # Getting RankingOutput supervision for train and test output_train = # COMPLETE WITH YOUR CODE output_test = # COMPLETE WITH YOUR CODE Ensuite on pourra défnir un modèle de ranking structuré et l'entraîner : .. code-block:: python from structured import SRanking learning_rate = 0.5 nb_epoch = 100 # Ranking model instanciation d= output_train, X_train[0:nbex,:].shape[1] ranking_model = SRanking(d, X_train[0:nbex,:].shape[0], learning_rate, nb_epoch) # Fitting model to data ranking_model.fit(X_train[0:nbex,:], output_train) On pourra enfin évaluer les performances du modèle sur la base de test : .. code-block:: python ranking_model.compute_RP_curve(X_train[0:nbex,:], y_trainb[0:nbex]) ranking_model.compute_RP_curve(X_test, y_testb) En ajoutant la fonction ``compute_RP_curve`` dans la classe ``SRanking`` .. code-block:: python def compute_RP_curve(self, X,labels): pred = np.matmul(X,self.w) AP = average_precision_score(labels, pred) precision, recall, _ = precision_recall_curve(labels,pred) plt.clf() plt.plot(recall, precision, lw=2, color='navy',label='Precision-Recall curve') plt.xlabel('Recall') plt.ylabel('Precision') plt.ylim([0.0, 1.05]) plt.xlim([0.0, 1.0]) plt.title('Precision-Recall example: AP={0:0.2f}'.format(AP*100.0)) plt.legend(loc="lower left") plt.show() Ci-dessous un exemple de résultat obtenu pour la classe 8 : .. |logo3| image:: img/APTRAIN_8_ranking.png :height: 250px :width: 380px .. |logo4| image:: img/APTEST_8_ranking.png :height: 250px :width: 380px | |logo3| |logo4| .. admonition:: Commentaires : Comparer les performances obtenues avec le modèle d'ordonnancement structuré par rapport à celles obtenues avec un modèle de classification binaire ? Comment s'explique cette différence ?