[JAVA] Als ich mich wieder an Tribuo erinnerte, das von Oracle veröffentlicht wurde, war die Person in mir eine heiße Person.

Vorwort

Da es in Echtzeit aktualisiert wird, habe ich den Inhalt des Tutorials erneut zusammengefasst, um die Informationen zu organisieren. Dieser Artikel basiert auf dem Inhalt von hier.

Über Materialien

Siehe hier für die ursprüngliche Geschichte. Wenn Sie Japanisch benötigen, lesen Sie bitte hier. Klicken Sie hier, um Ayame-Daten herunterzuladen. Siehe hier für den Quellcode. Siehe hier für Java Doc.

Wechselpunkt

Der Fehler beim Laden von CSV-Daten wurde behoben. v4.0.1 *

Es wurde ein Problem behoben, durch das CSVReader keine Dateien mit zusätzlichen Zeilenumbrüchen am Ende lesen konnte. IDXDataSource hinzugefügt, um Datensätze im IDX-Format (dh MNIST) zu lesen. Das Konfigurations-Tutorial wurde aktualisiert, um MNIST aus IDX-Dateien anstelle von libsvm-Dateien zu lesen.

In der Geschichte von der Person in der Mitte sagte er Ich habe die in dem Dokument geschriebene Version 4.0.0 übersehen, ich habe sie behoben.

Weil mir das bewusst ist, erfordert die dritte Zeile des folgenden Codes in der Einleitung ein Modell als erstes Argument.

1. var trainSet = new MutableDataset<>(new LibSVMDataSource(Paths.get("train-data"),new LabelFactory()));
2. var model    = new LogisticRegressionTrainer().train(trainSet);
3. var eval     = new LabelEvaluator().evaluate(new LibSVMDataSource(Paths.get("test-data"),trainSet.getOutputFactory()));
var eval = new LabelEvaluator()
                .evaluate(model, new LibSVMDataSource(Paths.get("test-data"), trainSet.getOutputFactory()));

Postscript 2020/09/30 Ich erhielt eine Antwort, dass ich es repariert und begangen habe.

Anderes Material

That, This ist [on git Issues](https: / /github.com/oracle/tribuo/issues/47) Ich habe versucht, es zu geben, aber es wurde ernsthaft beantwortet. Ich wollte ein Artikel über eine Geschichte sein, aber ich danke Ihnen für Ihre ernsthafte Beziehung.

Laut der Person in der Mitte wurde Tribuos offizielle Seite bereits behoben. Das ist. Der Nullcheck und Javadoc werden diese Woche behoben. Die Korrespondenz ist schnell.

Personen in diesem Tensorflow Java Committer. Die Person selbst sagte.

Für GPU-basierte Berechnungen in FP16 unterstützt JVM bereits aarch64, daher sollten Tensorflow Java und die Java-API von ONNX Runtime dies bald unterstützen. Tribuo wird ihnen ebenfalls folgen [die Person im Inneren]. ](Https://github.com/Craigacp). Sagte. Sogar jetzt sagte er, dass dies mit Tensorflow Java oder ONNX Runtime möglich ist.

~~ Diese Leute haben viel Energie. Ich möchte das in Japan machen. OpenAI ist überhaupt nicht geöffnet. ~~

Setup (Erste Schritte)

Ich habe die Version seit dem letzten Mal geändert.

Stellen Sie in maven wie folgt ein.

<dependency>
    <groupId>org.tribuo</groupId>
    <artifactId>tribuo-all</artifactId>
    <version>4.0.1</version>
    <type>pom</type>
</dependency>

In gradle kann das Glas mit der im Dokument beschriebenen Methode nicht erfolgreich heruntergeladen werden. Es werden nur POM-Dateien heruntergeladen. Es ist notwendig, wie folgt einzustellen.

    api ('org.tribuo:tribuo-all:4.0.1@pom') {
        transitive = true
    }

Es scheint, dass es mit Kotlin anders funktioniert. Ich werde dem Dokument einen Tab hinzufügen und ihn schreiben, aber ich bin wütend, dass ich mir nicht die Mühe machen möchte, einen Tab für Gradle zu erstellen und ihn zweimal in Groovy und Kotlin zu schreiben.

Holen Sie sich die Daten der Iris.

Laden Sie das Ziel der Ayame-Daten herunter


https://archive.ics.uci.edu/ml/machine-learning-databases/iris/bezdekIris.data

Erstellen Sie eine Klasse mit einer regulären Hauptmethode und implementieren Sie sie als Erste Schritte.

SampleTribuo


package org.project.eden.adam;

import java.io.IOException;
import java.nio.file.Paths;

import org.tribuo.DataSource;
import org.tribuo.Model;
import org.tribuo.MutableDataset;
import org.tribuo.Prediction;
import org.tribuo.classification.Label;
import org.tribuo.classification.LabelFactory;
import org.tribuo.classification.dtree.CARTClassificationTrainer;
import org.tribuo.classification.evaluation.LabelEvaluation;
import org.tribuo.classification.evaluation.LabelEvaluator;
import org.tribuo.classification.sgd.linear.LogisticRegressionTrainer;
import org.tribuo.data.csv.CSVLoader;
import org.tribuo.evaluation.TrainTestSplitter;

/**
 * @author jashika
 *
 */
public class SampleTribuo {

    /**
     * @param args Argumente der Hauptmethode.
     * @löst eine IOException aus, die beim Lesen der Datei ausgelöst wird.
     */
    public static void main(String[] args) throws IOException {

        //Lesen Sie die beschrifteten Irisdaten
        var irisHeaders = new String[] { "sepalLength", "sepalWidth", "petalLength", "petalWidth", "species" };
        DataSource<Label> irisData = new CSVLoader<>(new LabelFactory()).loadDataSource(Paths.get("bezdekIris.data"),
                irisHeaders[4], irisHeaders);
        //* Da der Pfad der zu lesenden Daten eingebettet ist, passen Sie ihn bitte an Ihre eigene Umgebung an.

        //70 Irisdaten für das Training lesen%, 30 zum Testen%Eingeteilt in
        var splitIrisData = new TrainTestSplitter<>(irisData, 0.7, 1L);
        var trainData = new MutableDataset<>(splitIrisData.getTrain());
        var testData = new MutableDataset<>(splitIrisData.getTest());

        //Entscheidungsbaumlernen kann verwendet werden
        var cartTrainer = new CARTClassificationTrainer();
        Model<Label> tree = cartTrainer.train(trainData);

        //Sie können auch die logistische Regression verwenden
        var linearTrainer = new LogisticRegressionTrainer();
        Model<Label> linear = linearTrainer.train(trainData);

        //Machen Sie letztendlich Vorhersagen aus unbekannten Daten
        //Vorhersagen sind der Name der Ausgabe (dh das Etikett) und die Punktzahl/Es wird eine Wahrscheinlichkeit.
        Prediction<Label> prediction = linear.predict(testData.getExample(0));

        //Der vollständige Testdatensatz kann ausgewertet werden, um Genauigkeit, F1 usw. zu berechnen.
        LabelEvaluation evaluation = new LabelEvaluator().evaluate(linear, testData);

        //Sie können die Bewertung auch manuell überprüfen
        double acc = evaluation.accuracy();

        // 0.Gibt 978 zurück
        //Zeigen Sie die formatierte Bewertungszeichenfolge an.
        System.out.println(evaluation.toString());
    }
}

Ich habe gerade eine Klasse mit dem Namen SampleTribuo erstellt. Ausführen wie es ist.

Ausführungsergebnis


29. September, 2020 5:12:51 Uhr org.tribuo.data.csv.CSVIterator getRow
Warnung: Ignoring extra newline at line 151
29. September, 2020 5:12:51 Uhr org.tribuo.classification.sgd.linear.LinearSGDTrainer train
Information: Training SGD classifier with 105 examples
29. September, 2020 5:12:51 Uhr org.tribuo.classification.sgd.linear.LinearSGDTrainer train
Information: Labels - (0,Iris-versicolor,34), (1,Iris-virginica,35), (2,Iris-setosa,36)
Class                           n          tp          fn          fp      recall        prec          f1
Iris-versicolor                16          16           0           1       1.000       0.941       0.970
Iris-virginica                 15          14           1           0       0.933       1.000       0.966
Iris-setosa                    14          14           0           0       1.000       1.000       1.000
Total                          45          44           1           1
Accuracy                                                                    0.978
Micro Average                                                               0.978       0.978       0.978
Macro Average                                                               0.978       0.980       0.978
Balanced Error Rate                                                         0.022

Beschreibung jedes Artikels

Im erstellten SampleTribuo-Code ist der folgende Teil der Header-Teil der Irisdaten.

//Lesen Sie die beschrifteten Irisdaten
var irisHeaders = new String[] { "sepalLength", "sepalWidth", "petalLength", "petalWidth", "species" };

Der Name des Headers lautet wie folgt.

・ SepalLength = Länge des Gaku ・ SepalWidth = Breite des Gaku ・ Blütenblattlänge = Blütenblattlänge ・ Blütenblattbreite = Breite der Blütenblätter ・ Spezies = Typen

Wenn Sie auf die Arten von Irisdaten achten, können Sie auch sehen, dass die folgenden drei Arten von Daten enthalten sind. Das Folgende ist ein Auszug aus Heruntergeladene Ayame-Daten.

・ 5.8.4.0.1.2.0.2.2, `Iris-setosa``` ・ 6,7,2,5,5,8,8,8, Iris-virginica``` ・ 5.5,2.6,4.4,1.2, `` Iris-versicolor```

Die Typen sind wie folgt. Es scheint eine Art Iris zu sein.

・ Iris setosa = ・ Iris versicolor = Lastkahnfarbe ・ Iris virginica = Virginia (Kobanozuina?)

Im Tribuo-Beispielcode ist die letzte Ausgabe von system.out.println die LabelEvaluation-Klasse. Die LabelEvaluation-Klasse erhält dann das trainierte Modell des linearTrainer und die Testdaten. Das Folgende ist der relevante Teil. Das bereits im vorherigen Abschnitt erwähnte Ausgabeergebnis ist das Bewertungsergebnis des Datensatzes.

SampleTribuo



Unterlassung

//Sie können auch die logistische Regression verwenden
var linearTrainer = new LogisticRegressionTrainer();
Model<Label> linear = linearTrainer.train(trainData);

//Der vollständige Testdatensatz kann ausgewertet werden, um Genauigkeit, F1 usw. zu berechnen.
LabelEvaluation evaluation = new LabelEvaluator().evaluate(linear, testData);

Unterlassung

//Zeigen Sie die formatierte Bewertungszeichenfolge an.
System.out.println(evaluation.toString());

Mit Blick auf das Java Doc der LabelEvaluation-Klasse wurde der folgende Inhalt geschrieben. Eine Funktion zur Einzelausgabe oder Ausgabe in HTML ist implementiert.

Auszug aus dem Element Label Evaluation in JavaDoc


double	accuracy()Gesamtgenauigkeit der Bewertung.

double	accuracy(Label label)Genauigkeit pro Bewertungsetikett.

double	AUCROC(Label label)Bereich unterhalb der ROC-Kurve.

double	averageAUCROC(boolean weighted)Die zwischen den Beschriftungen gemittelte Fläche unter der ROC-Kurve.

double	averagedPrecision(Label label)Genauigkeit durch Verwendung eines gewichteten Durchschnitts der Genauigkeit bei einem bestimmten Schwellenwert-Fassen Sie die Rückrufkurve zusammen und die Gewichte stellen die Rückrufe dar, die bei diesem Schwellenwert erreicht wurden.

LabelEvaluationUtil.PRCurve	precisionRecallCurve(Label label)Berechnet die Genauigkeitsrückrufkurve für ein einzelnes Etikett.

static String	toFormattedString(LabelEvaluation evaluation)Diese Methode erzeugt eine schön formatierte Zeichenfolgenausgabe mit den entsprechenden Tabulatoren und Zeilenumbrüchen für die Anzeige im Terminal.

default String	toHTML()Gibt eine HTML-formatierte Zeichenfolge zurück, die diese Bewertung darstellt.

static String	toHTML(LabelEvaluation evaluation)Diese Methode erzeugt eine HTML-formatierte Zeichenfolgenausgabe mit den entsprechenden Tabulatoren und Zeilenumbrüchen, die zum Einbetten in Webseiten geeignet sind.


static String	toFormattedString(LabelEvaluation evaluation)Diese Methode erzeugt eine schön formatierte Zeichenfolgenausgabe mit den entsprechenden Tabulatoren und Zeilenumbrüchen für die Anzeige im Terminal.

static String	toHTML(LabelEvaluation evaluation)Diese Methode erzeugt eine HTML-formatierte Zeichenfolgenausgabe mit den entsprechenden Tabulatoren und Zeilenumbrüchen, die zum Einbetten in Webseiten geeignet sind.

Der folgende Teil ist der Teil, der unbekannte Daten vorhersagt. Das heißt, ich habe keine unbekannten Daten, also sind es 30% der geteilten Daten.


Unterlassung

//Letztendlich werden Vorhersagen aus unbekannten Daten gemacht.
//Vorhersagen sind der Name der Ausgabe (dh das Etikett) und die Punktzahl/Es wird eine Wahrscheinlichkeit.
Prediction<Label> prediction = linear.predict(testData.getExample(0));

//Hinzugefügt.
//Unbekannte Daten(Testdaten)Geben Sie den Inhalt von aus.
System.out.println("Testdaten eingeben: " + testData.getExample(0));

//Prognosedaten aus dem Modell ausgeben.
System.out.println("Vorhersageergebnis: " + prediction.getOutput());
Unterlassung

Originalmaterial wird so wie es ist implementiert, aber da die ersten Testdaten vorhergesagt werden und nichts so gemacht wird, wie es ist, wird dies ausgegeben. Ich werde versuchen.

29. September, 2020 9:34:34 Uhr org.tribuo.data.csv.CSVIterator getRow
Warnung: Ignoring extra newline at line 151
29. September, 2020 9:34:34 Uhr org.tribuo.classification.sgd.linear.LinearSGDTrainer train
Information: Training SGD classifier with 105 examples
29. September, 2020 9:34:34 Uhr org.tribuo.classification.sgd.linear.LinearSGDTrainer train
Information: Labels - (0,Iris-versicolor,34), (1,Iris-virginica,35), (2,Iris-setosa,36)
Testdaten eingeben: ArrayExample(numFeatures=4,output=Iris-setosa,weight=1.0,features=[(petalLength, 1.3)(petalWidth, 0.3), (sepalLength, 4.5), (sepalWidth, 2.3), ])
Vorhersageergebnis: (Iris-setosa,0.8752021370239595)

Die Eingabedaten sind die Daten von Iris-setosa mit jeweils einer Kelchblattlänge von 4,5, einer Kelchblattbreite von 2,3, einer Blütenblattlänge von 1,3 und einer Blütenblattlänge. Die Breite (Blütenblattbreite) beträgt 0,3.

Andererseits betrug das Vorhersageergebnis eine Wahrscheinlichkeit von 87%, und es wurde vorausgesagt, dass es sich um Iris-Setosa handelt. Du hast recht.

Dies allein ist nicht sehr interessant, also lassen Sie uns 30% der Daten vorhersagen. Ich habe den Code wie folgt geändert.

SampleTribuo


Unterlassung
for (var example : testData) {
    //Richtige Antwort
    var correctAnswer = example.getOutput().getLabel();
    //Vorhersageergebnis
    var predictResult = linear.predict(example);

    if (correctAnswer.equals(predictResult.getOutput().getLabel())) {
        System.out.println("Vorhersageergebnis->Richtige Antwort: " + predictResult.getOutputScores());
    } else {
        System.out.println("Vorhersageergebnis->Falsche Antwort: " + predictResult.getOutputScores() + "Richtige Antwort->" + correctAnswer);
    }
}
Unterlassung

Ausführungsergebnis


29. September, 2020 10:35:18 Uhr org.tribuo.data.csv.CSVIterator getRow
Warnung: Ignoring extra newline at line 151
29. September, 2020 10:35:18 Uhr org.tribuo.classification.sgd.linear.LinearSGDTrainer train
Information: Training SGD classifier with 105 examples
29. September, 2020 10:35:18 Uhr org.tribuo.classification.sgd.linear.LinearSGDTrainer train
Information: Labels - (0,Iris-versicolor,34), (1,Iris-virginica,35), (2,Iris-setosa,36)
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.12465430241942166), Iris-virginica=(Iris-virginica,1.4356055661867684E-4), Iris-setosa=(Iris-setosa,0.8752021370239595)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.022985338660181973), Iris-virginica=(Iris-virginica,4.886599414569194E-6), Iris-setosa=(Iris-setosa,0.9770097747404035)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.8743791900480306), Iris-virginica=(Iris-virginica,0.11972594367759447), Iris-setosa=(Iris-setosa,0.005894866274374883)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.13752628567026762), Iris-virginica=(Iris-virginica,0.8624557718013333), Iris-setosa=(Iris-setosa,1.794252839916067E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.754662316591029), Iris-virginica=(Iris-virginica,0.24288192724655125), Iris-setosa=(Iris-setosa,0.00245575616241976)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.1114591917841135), Iris-virginica=(Iris-virginica,0.8885339140853985), Iris-setosa=(Iris-setosa,6.89413048798891E-6)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.018368556099769975), Iris-virginica=(Iris-virginica,2.8979851163953406E-6), Iris-setosa=(Iris-setosa,0.9816285459151136)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.8336662376434194), Iris-virginica=(Iris-virginica,0.16052879318949909), Iris-setosa=(Iris-setosa,0.005804969167081375)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.7401640849157867), Iris-virginica=(Iris-virginica,0.25814459323929695), Iris-setosa=(Iris-setosa,0.0016913218449164506)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.37734213887670864), Iris-virginica=(Iris-virginica,0.6225430896188512), Iris-setosa=(Iris-setosa,1.1477150444008675E-4)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.08165259920209698), Iris-virginica=(Iris-virginica,0.9183413054167227), Iris-setosa=(Iris-setosa,6.095381180367614E-6)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.9166451164592634), Iris-virginica=(Iris-virginica,0.0710098849793183), Iris-setosa=(Iris-setosa,0.012344998561418293)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.12496197859394245), Iris-virginica=(Iris-virginica,0.8750207513327715), Iris-setosa=(Iris-setosa,1.7270073286161786E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.08832616235771579), Iris-virginica=(Iris-virginica,0.9116697571921494), Iris-setosa=(Iris-setosa,4.080450134879567E-6)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.7606313121553816), Iris-virginica=(Iris-virginica,0.23595375784889286), Iris-setosa=(Iris-setosa,0.0034149299957255148)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.2838330052617929), Iris-virginica=(Iris-virginica,0.7160953733169281), Iris-setosa=(Iris-setosa,7.162142127894781E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.8962905028787402), Iris-virginica=(Iris-virginica,0.076593124958417), Iris-setosa=(Iris-setosa,0.027116372162842753)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.8781294741330369), Iris-virginica=(Iris-virginica,0.11263604829308826), Iris-setosa=(Iris-setosa,0.009234477573874762)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.02598246093746204), Iris-virginica=(Iris-virginica,9.258026355622071E-6), Iris-setosa=(Iris-setosa,0.9740082810361823)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.4125332441403861), Iris-virginica=(Iris-virginica,0.5874113240653356), Iris-setosa=(Iris-setosa,5.54317942782377E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.005480793710204649), Iris-virginica=(Iris-virginica,3.36057635603426E-7), Iris-setosa=(Iris-setosa,0.9945188702321598)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.7157983219006878), Iris-virginica=(Iris-virginica,0.28236588916463473), Iris-setosa=(Iris-setosa,0.0018357889346774156)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.041785356794614356), Iris-virginica=(Iris-virginica,1.63804767321482E-5), Iris-setosa=(Iris-setosa,0.9581982627286535)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.03557299656267042), Iris-virginica=(Iris-virginica,1.572396823310113E-5), Iris-setosa=(Iris-setosa,0.9644112794690964)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.7445227755500248), Iris-virginica=(Iris-virginica,0.25336879249494487), Iris-setosa=(Iris-setosa,0.0021084319550302984)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.23201927045744059), Iris-virginica=(Iris-virginica,0.7679353747675968), Iris-setosa=(Iris-setosa,4.535477496262948E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.6136153688335659), Iris-virginica=(Iris-virginica,0.38487059274540525), Iris-setosa=(Iris-setosa,0.0015140384210286877)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.0037281020760574794), Iris-virginica=(Iris-virginica,1.291282392314054E-7), Iris-setosa=(Iris-setosa,0.9962717687957032)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.04755707288123218), Iris-virginica=(Iris-virginica,1.934947705107781E-5), Iris-setosa=(Iris-setosa,0.9524235776417168)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.19993977432885074), Iris-virginica=(Iris-virginica,0.8000350473542086), Iris-setosa=(Iris-setosa,2.5178316940654208E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.04523347766974972), Iris-virginica=(Iris-virginica,2.000119721397452E-5), Iris-setosa=(Iris-setosa,0.9547465211330363)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.029794358762199272), Iris-virginica=(Iris-virginica,8.7737002425928E-6), Iris-setosa=(Iris-setosa,0.9701968675375582)}
Vorhersageergebnis->Falsche Antwort: {Iris-versicolor=(Iris-versicolor,0.5733177742115076), Iris-virginica=(Iris-virginica,0.42626475284848847), Iris-setosa=(Iris-setosa,4.1747294000396004E-4)}Richtige Antwort-> Iris-virginica
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.029877036683050945), Iris-virginica=(Iris-virginica,7.161847786201107E-6), Iris-setosa=(Iris-setosa,0.970115801469163)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.7821104478321824), Iris-virginica=(Iris-virginica,0.21391875776045305), Iris-setosa=(Iris-setosa,0.003970794407364584)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.019534516466634153), Iris-virginica=(Iris-virginica,5.375894384912967E-6), Iris-setosa=(Iris-setosa,0.9804601076389811)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.05383775370019657), Iris-virginica=(Iris-virginica,0.9461587580877066), Iris-setosa=(Iris-setosa,3.4882120966764877E-6)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.12393648653270413), Iris-virginica=(Iris-virginica,0.8760476481453248), Iris-setosa=(Iris-setosa,1.58653219710635E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.8991747020299696), Iris-virginica=(Iris-virginica,0.09631094366524456), Iris-setosa=(Iris-setosa,0.004514354304785789)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.8925507000636339), Iris-virginica=(Iris-virginica,0.10101559809853458), Iris-setosa=(Iris-setosa,0.00643370183783148)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.759603537166626), Iris-virginica=(Iris-virginica,0.23777484597390816), Iris-setosa=(Iris-setosa,0.00262161685946576)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.01560114791426806), Iris-virginica=(Iris-virginica,2.3647440157063515E-6), Iris-setosa=(Iris-setosa,0.9843964873417164)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.23490596676084197), Iris-virginica=(Iris-virginica,0.7650569443472615), Iris-setosa=(Iris-setosa,3.708889189648049E-5)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.5604116022032899), Iris-virginica=(Iris-virginica,0.4392143166585561), Iris-setosa=(Iris-setosa,3.740811381540314E-4)}
Vorhersageergebnis->Richtige Antwort: {Iris-versicolor=(Iris-versicolor,0.13060096881100045), Iris-virginica=(Iris-virginica,0.8693951745606155), Iris-setosa=(Iris-setosa,3.856628384041485E-6)}

Eine falsche Antwort, aber die Wahrscheinlichkeit von Iris-versicolor beträgt 57% und die Wahrscheinlichkeit von Iris-virginica beträgt 42%. Im Gegenteil, selbst wenn die Daten korrekt sind, besteht eine 56% ige Wahrscheinlichkeit für Iris-Versicolor und eine relativ geringe Wahrscheinlichkeit für eine korrekte Antwort. Da nur wenige Daten trainiert werden müssen, besteht eine Verzerrung. Von hier aus sollte es Spaß machen, die Genauigkeit zu verbessern.

SampleTribuo verwendet die logistische Regression, um zu lernen, es stehen jedoch auch andere Klassen zur Verfügung. Es gibt viele Implementierungen der Trainer-Oberfläche, daher dauert das Ausprobieren einige Zeit. Schließlich möchte ich versuchen, mit der GPU zu lernen, anstatt mit der CPU zu lernen. Daher scheint es besser, den ONNX-Kooperationsteil oder den TensorFlow-Kooperationsteil vor dem Lernmodell selbst zu betrachten. Ich fühle mich wie es. image.png

~~ Nun, ich habe erst in den letzten Tagen maschinelles Lernen gemacht ... ~~

Nachwort

In dem von mir erstellten Tribuo-Beispiel suchte ich nach einer Möglichkeit, die trainierten Daten zu speichern, da ich die Testdaten jedes Mal lesen und trainieren würde, sie jedoch nicht im Dokument finden konnte. Aus dem Quellcode können Sie ersehen, dass die Methode zum Speichern von TensorflowModel mit Tensorfrow und die Methode zum Speichern von CSV bereitgestellt werden. Da es sich jedoch um den ersten Code handelt, der berührt wird, verstehe ich die Gewohnheit oder Idee nicht. Ich denke nicht, dass es so sein sollte ...

Als ich darüber nachdachte, mich selbst zu serialisieren und zu deserialisieren, fand ich es in Issues.

Der Inhalt der Frage ist wie folgt.

Können Tutorials und Dokumentationen Beispiele für die Serialisierung von Modellen und Datensätzen auf die Festplatte enthalten? Es wäre hilfreich, zusätzliche Hilfe zur Verwendung von ONNX zu haben.

Hier ist die Antwort.

Natürlich können Sie Ihrer Dokumentation Serialisierungsbeispiele hinzufügen. Derzeit verwendet die Serialisierung den Standardmechanismus java.io.Serializable. Ein Beispiel für das Laden und Speichern eines Modells oder Datensatzes finden Sie im Demo-Programm, das mit Tribuo geliefert wird. Beachten Sie, dass Sie eine Serialisierungszulassungsliste verwenden sollten, um Deserialisierungsangriffe zu verhindern.

Das derzeit beste Beispiel für einen ONNX-Lader sind Unit-Tests. Wir planen, ein Tutorial hinzuzufügen, das den Ladevorgang von Modellen von Drittanbietern durchläuft.

Mit anderen Worten, es ist nicht im Dokument aufgeführt, und es scheint, dass Sie java.io.Serializable verwenden und es selbst tun können. Wie man den ONNX Loader benutzt, steht im Testcode ... Sie müssen die Quelle selbst suchen. Ich habe nach dem Testcode gesucht, aber er wurde geladen. Das? Wie wäre es mit Sparen?

Ich habe in OnnxRuntime geschaut, aber es wird nur geladen. Es heißt: "Statischer Loader für die JNI-Bindung. Es gibt keine öffentliche API, aber sie wird von verschiedenen Klassen in diesem Paket aufgerufen." Es scheint nicht im Paket ai.onnxruntime oder im Paket org.tribuo.interop.onnx enthalten zu sein. Erstens heißt es derzeit "Serialisierung verwendet den Standardmechanismus java.io.Serializable", so dass Tensorflow dies anscheinend kann, aber offiziell gibt es im Moment keine solche. ..

Die Funktion ist ziemlich vollständig, aber die Dokumentation holt nicht einmal auf Englisch auf. In einigen Orten ist Javadoc nicht enthalten. Es scheint, wenn Sie fragen, wird es Ihnen sagen, aber es ist schneller, es zu versuchen, als es einzeln anzuhören, aber es ist ärgerlich und ich möchte es sehen. Im Moment fühlt es sich an wie hmm, aber ich habe das Gefühl, dass es sich auf einmal ändern wird. Die Person drinnen ist ziemlich heiß.

Als nächstes überlegen wir, wo wir anfangen sollen.

Recommended Posts

Als ich mich wieder an Tribuo erinnerte, das von Oracle veröffentlicht wurde, war die Person in mir eine heiße Person.
Ich habe Tribuo von Oracle ausprobiert. Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Beim Aktualisieren meiner eigenen App habe ich ernsthaft über die Paketstruktur nachgedacht
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Ich habe Tribuo von Oracle berührt. Document Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln