Zeichenerkennung mit MNIST in Java

Hier ist ein einfaches Tutorial für den Einstieg in die Ausführung von Inferenz auf einem bestehenden ONNX-Modell für gegebene Eingabedaten. Das Modell wird typischerweise mit einem der bekannten Trainingsframeworks trainiert und in das ONNX-Format exportiert.

Beachten Sie, dass der unten dargestellte Code die ab Java 10 verfügbare Syntax verwendet. Die Java 8-Syntax ist ähnlich, aber ausführlicher. Um eine Scoring-Sitzung zu starten, erstellen Sie zuerst die OrtEnvironment, öffnen Sie dann eine Sitzung mit der Klasse OrtSession und übergeben Sie den Dateipfad zum Modell als Parameter.

    var env = OrtEnvironment.getEnvironment();
    var session = env.createSession("model.onnx",new OrtSession.SessionOptions());

Sobald eine Sitzung erstellt wurde, können Sie Abfragen mit der Methode run des OrtSession-Objekts ausführen. Derzeit unterstützen wir OnnxTensor-Eingaben, und Modelle können OnnxTensor-, OnnxSequence- oder OnnxMap-Ausgaben erzeugen. Letztere beiden sind wahrscheinlicher, wenn Modelle gescort werden, die von Frameworks wie scikit-learn erzeugt wurden. Der run-Aufruf erwartet eine Map<String,OnnxTensor>, bei der die Schlüssel mit den Eingabeknotennamen übereinstimmen, die im Modell gespeichert sind. Diese können durch Aufruf von session.getInputNames() oder session.getInputInfo() auf einer instanziierten Sitzung angezeigt werden. Der run-Aufruf erzeugt ein Result-Objekt, das eine Map<String,OnnxValue> darstellt, die die Ausgabe enthält. Das Result-Objekt ist AutoCloseable und kann in einer try-with-resources-Anweisung verwendet werden, um zu verhindern, dass Referenzen entweichen. Sobald das Result-Objekt geschlossen ist, werden auch alle seine untergeordneten OnnxValues geschlossen.

    OnnxTensor t1,t2;
    var inputs = Map.of("name1",t1,"name2",t2);
    try (var results = session.run(inputs)) {
    // manipulate the results
   }

Sie können Ihre Eingabedaten auf verschiedene Arten in OnnxTensor-Objekte laden. Der effizienteste Weg ist die Verwendung eines java.nio.Buffer, aber es ist auch möglich, mehrdimensionale Arrays zu verwenden. Wenn sie mit Arrays konstruiert werden, dürfen die Arrays nicht gezackt sein.

    FloatBuffer sourceData;  // assume your data is loaded into a FloatBuffer
    long[] dimensions;       // and the dimensions of the input are stored here
    var tensorFromBuffer = OnnxTensor.createTensor(env,sourceData,dimensions);

    float[][] sourceArray = new float[28][28];  // assume your data is loaded into a float array 
    var tensorFromArray = OnnxTensor.createTensor(env,sourceArray);

Hier ist ein vollständiges Beispielprogramm, das Inferenz auf einem vortrainierten MNIST-Modell ausführt.

Ausführung auf einer GPU oder mit einem anderen Anbieter (optional)

Um andere Ausführungsanbieter wie GPUs zu aktivieren, schalten Sie einfach das entsprechende Flag bei SessionOptions ein, wenn Sie eine OrtSession erstellen.

    int gpuDeviceId = 0; // The GPU device ID to execute on
    var sessionOptions = new OrtSession.SessionOptions();
    sessionOptions.addCUDA(gpuDeviceId);
    var session = environment.createSession("model.onnx", sessionOptions);

Die Ausführungsanbieter werden in der Reihenfolge bevorzugt, in der sie aktiviert wurden.