.. _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 VOC2007 comme la requête (*e.g.* les images de la classe 'potted plant') et évaluer la capacité du modèle à ordonner les exemples pertinents par rapport à la requête (*e.g.* les images de la classe 'potted plant') avant les exemples non pertinents (*e.g.* les images des autres classes que la classe 'potted plant'). On rappelle le code pour charger les données ("Deep Features") du TP 7 : .. code-block:: python outfile = 'DF_ResNet50_VOC2007.npz' npzfile = np.load(outfile) X_train = npzfile['X_train'] Y_train = npzfile['Y_train'] X_test = npzfile['X_test'] Y_test = npzfile['Y_test'] On va ensuite consiérer une classe requête : .. code-block:: python LABELS = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'] # Query (class) c=15 nbPlusTrain = np.where(Y_train[:,c]==1)[0].shape[0] nbPlusTest = np.where(Y_test[:,c]==1)[0].shape[0] print "nbPlusTrain=",nbPlusTrain, "nbPlusTest=", nbPlusTest 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 # 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 = 40 # Ranking model instanciation ranking_model = SRanking(output_train, X_train.shape[1], X_train.shape[1], learning_rate, nb_epoch) # Fitting model to data ranking_model.fit(X_train, 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, Y_train[:,c]) ranking_model.compute_RP_curve(X_test, Y_test[:,c]) 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 en test pour la classe 'potted plant' : .. |logo4| image:: _images/AP_TEST_VOC_PP_structRanking.png :height: 350px :width: 480px | |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 ?