Condividi tramite


Convertire il modello PyTorch in formato ONNX

Nella fase precedente di questa esercitazione è stato usato PyTorch per creare il modello di Machine Learning. Tuttavia, tale modello è un .pth file. Per essere in grado di integrarlo con l'app Windows ML, è necessario convertire il modello in formato ONNX.

Esportare il modello

Per esportare un modello, si userà la torch.onnx.export() funzione . Questa funzione esegue il modello e registra una traccia degli operatori usati per calcolare gli output.

  1. Copiare il codice seguente nel DataClassifier.py file in Visual Studio, sopra la funzione 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') 

È importante chiamare model.eval() o model.train(False) prima di esportare il modello, perché imposta il modello sulla modalità di inferenza. Questa operazione è necessaria perché gli operatori come dropout o batchnorm si comportano in modo diverso in modalità di inferenza e training.

  1. Per eseguire la conversione in ONNX, aggiungere una chiamata alla funzione di conversione alla funzione main. Non è necessario eseguire di nuovo il training del modello, quindi verranno commentato alcune funzioni che non è più necessario eseguire. La funzione principale sarà la seguente.
if __name__ == "__main__": 
    num_epochs = 10 
    train(num_epochs) 
    print('Finished Training\n') 
    test() 
    test_species() 
    convert() 
  1. Eseguire di nuovo il progetto selezionando il Start Debugging pulsante sulla barra degli strumenti o premendo F5. Non è necessario eseguire di nuovo il training del modello, è sufficiente caricare il modello esistente dalla cartella del progetto.

Passare al percorso del progetto e trovare il modello ONNX accanto al .pth modello.

Nota

Sei interessato a scoprire di più? Esaminare l'esercitazione su PyTorch sull'esportazione di un mdoel.

Esplorare il modello.

  1. Aprire il file del Network.onnx modello con Neutron.

  2. Selezionare il nodo dati per aprire le proprietà del modello.

ONNX model properties

Come si può notare, il modello richiede un oggetto float a 32 bit (matrice multidimensionale) come input e restituisce un valore float Tensor come output. La matrice di output includerà la probabilità per ogni etichetta. Il modo in cui è stato creato il modello, le etichette sono rappresentate da 3 numeri, ognuno associato a un tipo specifico di fiore iris.

Etichetta 1 etichetta 2 Etichetta 3
0 1 2
Iris-setosa Iris-versicolor Iris-virginica

Dovrai estrarre questi valori per visualizzare la stima corretta con l'app Windows ML.

Passaggi successivi

Il modello è pronto per la distribuzione. Successivamente, per l'evento principale, creare un'applicazione Windows ed eseguirla in locale nel dispositivo Windows.