Convertir votre modèle PyTorch au format ONNX

Dans l’étape précédente de ce tutoriel, nous avons utilisé PyTorch pour créer notre modèle de Machine Learning. Toutefois, ce modèle est un fichier .pth. Pour être en mesure de l’intégrer à l’application Windows ML, vous devez convertir le modèle au format ONNX.

Exporter le modèle

Pour exporter un modèle, vous allez utiliser la fonction torch.onnx.export(). Cette fonction exécute le modèle, et enregistre une trace des opérateurs utilisés pour calculer les sorties.

  1. Copiez le code suivant dans le fichier DataClassifier.py dans Visual Studio, au-dessus de votre fonction principale.
#Function to Convert to ONNX 
def convert(): 

    # set the model to inference mode 
    model.eval() 

    # Let's create a dummy input tensor  
    dummy_input = torch.randn(1, 3, 32, 32, requires_grad=True)  

    # Export the model   
    torch.onnx.export(model,         # model being run 
         dummy_input,       # model input (or a tuple for multiple inputs) 
         "Network.onnx",       # where to save the model  
         export_params=True,  # store the trained parameter weights inside the model file 
         opset_version=11,    # the ONNX version to export the model to 
         do_constant_folding=True,  # whether to execute constant folding for optimization 
         input_names = ['input'],   # the model's input names 
         output_names = ['output'], # the model's output names 
         dynamic_axes={'input' : {0 : 'batch_size'},    # variable length axes 
                                'output' : {0 : 'batch_size'}}) 
    print(" ") 
    print('Model has been converted to ONNX') 

Il est important d’appeler model.eval() ou model.train(False) avant d’exporter le modèle, car cela définit le modèle en mode d’inférence. Cela est nécessaire, car les opérateurs comme dropout ou batchnorm se comportent différemment en mode d’inférence et en mode d’entraînement.

  1. Pour exécuter la conversion au format ONNX, ajoutez un appel à la fonction de conversion à la fonction principale. Vous n’avez pas besoin d’entraîner à nouveau le modèle. Nous allons donc convertir en commentaires certaines fonctions que nous n’avons plus besoin d’exécuter. Votre fonction principale sera la suivante.
if __name__ == "__main__": 
    num_epochs = 10 
    train(num_epochs) 
    print('Finished Training\n') 
    test() 
    test_species() 
    convert() 
  1. Réexécutez le projet en sélectionnant le bouton Start Debugging dans la barre d’outils, ou en appuyant sur F5. Il n’est pas nécessaire d’effectuer une nouvelle tentative d’entraînement du modèle. Chargez simplement le modèle existant à partir du dossier du projet.

Accédez à l’emplacement de votre projet et recherchez le modèle ONNX en regard du modèle .pth.

Remarque

Vous voulez en savoir plus ? Consultez le tutoriel PyTorch sur l’exportation d’un modèle.

Explorez votre modèle.

  1. Ouvrez le fichier de modèle Network.onnx avec Neutron.

  2. Sélectionnez le nœud data pour ouvrir les propriétés du modèle.

ONNX model properties

Comme vous pouvez le voir, le modèle requiert un objet float tenseur de 32 bits (tableau multidimensionnel) comme entrée et retourne un float Tensor en sortie. Le tableau de sortie inclut la probabilité pour chaque étiquette. Dans le modèle que vous avez créé, les étiquettes sont représentées par trois chiffres, chacun d’eux étant associé à un type spécifique d’iris.

Étiquette 1 label 2 Étiquette 3
0 1 2
Iris-setosa Iris-versicolor Iris-virginica

Vous devrez extraire ces valeurs pour afficher la prédiction correcte avec l’application Windows ML.

Étapes suivantes

Notre modèle est prêt à être déployé. Ensuite, pour l’événement principal, nous allons créer une application Windows et l’exécuter localement sur votre appareil Windows.