[JAVA] Quand j'ai retrouvé mon esprit sur Tribuo publié par Oracle, la personne à l'intérieur était une personne sexy.

Préface

Puisqu'il est mis à jour en temps réel, j'ai à nouveau résumé le contenu du tutoriel pour organiser les informations. Cet article a été rédigé sur la base du contenu de ici.

À propos des matériaux

Voir ici pour l'histoire originale. Si vous avez besoin du japonais, veuillez voir ici. Cliquez ici pour télécharger les données Ayame. Voir ici pour le code source. Voir ici pour Java Doc.

point de changement

Le bogue de chargement des données CSV a été corrigé. v4.0.1 *

Correction d'un problème où CSVReader ne pouvait pas lire les fichiers avec des sauts de ligne supplémentaires à la fin. Ajout d'IDXDataSource pour lire les ensembles de données au format IDX (c'est-à-dire MNIST). Mise à jour du didacticiel de configuration pour lire MNIST à partir de fichiers IDX au lieu de fichiers libsvm.

Dans l'histoire de la personne au milieu, il a dit J'ai oublié la v4.0.0 écrite dans le document, je l'ai corrigée.

Parce que j'en suis conscient, la troisième ligne du code ci-dessous qui apparaît dans l'introduction requiert le modèle comme premier 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 30/09/2020 J'ai reçu une réponse disant que je l'ai corrigé et commis.

Autre matériel

Cela, This est [sur les problèmes git](https: / /github.com/oracle/tribuo/issues/47) J'ai essayé de le donner, mais on y a répondu sérieusement. J'avais l'intention d'être un article d'histoire, mais merci pour votre relation sérieuse.

Selon la personne au milieu, la page officielle de Tribuo a déjà été corrigée. C'est. Le contrôle nul et javadoc seront corrigés cette semaine. La correspondance est rapide.

Personnes dans ce Committer java Tensorflow. Dit la personne elle-même.

Pour les calculs basés sur le GPU FP16, JVM prend déjà en charge aarch64, donc Tensorflow Java et l'API Java de ONNX Runtime devraient le prendre en charge bientôt, Tribuo les suivra également [la personne à l'intérieur] ](Https://github.com/Craigacp). M'a dit. Même maintenant, il a dit que cela pouvait être fait en utilisant Tensorflow Java ou ONNX Runtime.

~~ Ces personnes ont beaucoup d'énergie. Je veux faire ça au Japon. OpenAI n'est pas du tout ouvert. ~~

Configuration (mise en route)

J'ai changé de version depuis la dernière fois.

Dans maven, définissez comme suit.

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

Dans gradle, le fichier jar ne peut pas être téléchargé avec succès par la méthode décrite dans le document. Seuls les fichiers pom seront téléchargés. Il est nécessaire de régler comme suit.

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

Il semble que cela fonctionne différemment avec kotlin. Je vais ajouter un onglet au document et l'écrire, mais je suis en colère de ne pas avoir envie de créer un onglet pour gradle et de l'écrire deux fois dans Groovy et kotlin.

Obtenez les données de l'iris.

Télécharger la destination des données Ayame


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

Créez une classe avec une méthode main régulière et implémentez-la comme mise en route

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 Arguments de la méthode principale.
     * @jette IOException Lancé en cas d'erreur de lecture de fichier.
     */
    public static void main(String[] args) throws IOException {

        //Lire les données d'iris étiquetées
        var irisHeaders = new String[] { "sepalLength", "sepalWidth", "petalLength", "petalWidth", "species" };
        DataSource<Label> irisData = new CSVLoader<>(new LabelFactory()).loadDataSource(Paths.get("bezdekIris.data"),
                irisHeaders[4], irisHeaders);
        //* Puisque le chemin des données à lire est intégré, veuillez le faire correspondre à votre propre environnement.

        //70 lire les données d'iris pour l'entraînement%, 30 pour les tests%Divisée en
        var splitIrisData = new TrainTestSplitter<>(irisData, 0.7, 1L);
        var trainData = new MutableDataset<>(splitIrisData.getTrain());
        var testData = new MutableDataset<>(splitIrisData.getTest());

        //L'apprentissage de l'arbre de décision peut être utilisé
        var cartTrainer = new CARTClassificationTrainer();
        Model<Label> tree = cartTrainer.train(trainData);

        //Vous pouvez également utiliser la régression logistique
        var linearTrainer = new LogisticRegressionTrainer();
        Model<Label> linear = linearTrainer.train(trainData);

        //En fin de compte, faites des prédictions à partir de données inconnues
        //Les prédictions sont le nom de la sortie (c'est-à-dire l'étiquette) et le score/Cela devient une probabilité.
        Prediction<Label> prediction = linear.predict(testData.getExample(0));

        //L'ensemble de données de test complet peut être évalué pour calculer la précision, F1, etc.
        LabelEvaluation evaluation = new LabelEvaluator().evaluate(linear, testData);

        //Vous pouvez également inspecter manuellement la note
        double acc = evaluation.accuracy();

        // 0.Renvoie 978
        //Affichez la chaîne d'évaluation formatée.
        System.out.println(evaluation.toString());
    }
}

Je viens de créer une classe avec le nom SampleTribuo. Exécutez tel quel.

Résultat d'exécution


29 septembre, 2020 5:12:51 pm org.tribuo.data.csv.CSVIterator getRow
avertissement: Ignoring extra newline at line 151
29 septembre, 2020 5:12:51 pm org.tribuo.classification.sgd.linear.LinearSGDTrainer train
information: Training SGD classifier with 105 examples
29 septembre, 2020 5:12:51 pm 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

Description de chaque article

Dans le code SampleTribuo créé, la partie suivante est la partie d'en-tête des données d'iris.

//Lire les données d'iris étiquetées
var irisHeaders = new String[] { "sepalLength", "sepalWidth", "petalLength", "petalWidth", "species" };

Le nom de l'en-tête est le suivant.

・ SepalLength = longueur du gaku ・ SepalWidth = largeur du gaku ・ PetalLength = longueur du pétale ・ PetalWidth = largeur des pétales ・ Espèce = types

De plus, si vous faites attention aux types de données d'iris, vous pouvez voir que les trois types de données suivants sont inclus. Ce qui suit est un extrait de Downloaded Ayame Data.

・ 5.8,4.0,1.2,0.2, Iris-setosa ・ 6.7,2.5,5.8,1.8, Iris-virginica ・ 5.5,2.6,4.4,1.2, Iris-versicolor

Les types sont les suivants. Cela semble être une sorte d'iris.

・ Iris setosa = ・ Iris versicolor = couleur de la barge ・ Iris virginica = Virginie (Kobanozuina?)

Dans l'exemple de code Tribuo, la dernière sortie de system.out.println est la classe LabelEvaluation. La classe LabelEvaluation reçoit ensuite le modèle entraîné du linearTrainer et les données de test. Ce qui suit est la partie pertinente. Le résultat de sortie déjà mentionné dans la section précédente est le résultat de l'évaluation de l'ensemble de données.

SampleTribuo



Omission

//Vous pouvez également utiliser la régression logistique
var linearTrainer = new LogisticRegressionTrainer();
Model<Label> linear = linearTrainer.train(trainData);

//L'ensemble de données de test complet peut être évalué pour calculer la précision, F1, etc.
LabelEvaluation evaluation = new LabelEvaluator().evaluate(linear, testData);

Omission

//Affichez la chaîne d'évaluation formatée.
System.out.println(evaluation.toString());

En regardant le Java Doc de la classe LabelEvaluation, le contenu suivant a été écrit. Une fonction de sortie individuelle ou de sortie en HTML est implémentée.

Extrait de l'élément d'évaluation d'étiquette dans JavaDoc


double	accuracy()Exactitude globale de l'évaluation.

double	accuracy(Label label)Précision par étiquette de notation.

double	AUCROC(Label label)Zone sous la courbe ROC.

double	averageAUCROC(boolean weighted)L'aire sous la courbe ROC moyennée entre les étiquettes.

double	averagedPrecision(Label label)Précision en prenant une moyenne pondérée de précision à un seuil donné-Résumez la courbe de rappel et les poids représentent les rappels réalisés à ce seuil.

LabelEvaluationUtil.PRCurve	precisionRecallCurve(Label label)Calcule la courbe de rappel de précision pour une seule étiquette.

static String	toFormattedString(LabelEvaluation evaluation)Cette méthode produit une sortie de chaîne joliment formatée avec les onglets et les sauts de ligne appropriés pour l'affichage dans le terminal.

default String	toHTML()Renvoie une chaîne au format HTML représentant cette note.

static String	toHTML(LabelEvaluation evaluation)Cette méthode produit une sortie de chaîne au format HTML avec les onglets et sauts de ligne appropriés, adaptés à l'incorporation dans les pages Web.


static String	toFormattedString(LabelEvaluation evaluation)Cette méthode produit une sortie de chaîne joliment formatée avec les onglets et les sauts de ligne appropriés pour l'affichage dans le terminal.

static String	toHTML(LabelEvaluation evaluation)Cette méthode produit une sortie de chaîne au format HTML avec les onglets et sauts de ligne appropriés, adaptés à l'incorporation dans les pages Web.

La partie suivante est la partie qui prédit des données inconnues. Cela dit, je n'ai pas de données inconnues, donc c'est 30% des données divisées.


Omission

//En fin de compte, les prédictions sont faites à partir de données inconnues.
//Les prédictions sont le nom de la sortie (c'est-à-dire l'étiquette) et le score/Cela devient une probabilité.
Prediction<Label> prediction = linear.predict(testData.getExample(0));

//Ajoutée.
//Données inconnues(données de test)Sortir le contenu de.
System.out.println("Tester les données à saisir: " + testData.getExample(0));

//Sortie des données de prédiction à partir du modèle.
System.out.println("Résultat de la prédiction: " + prediction.getOutput());
Omission

Le matériel original est implémenté tel quel, mais comme les premières données de test sont prédites et que rien n'est fait tel quel, il s'agit d'une sortie. Je vais essayer.

29 septembre, 2020 9:34:34 pm org.tribuo.data.csv.CSVIterator getRow
avertissement: Ignoring extra newline at line 151
29 septembre, 2020 9:34:34 pm org.tribuo.classification.sgd.linear.LinearSGDTrainer train
information: Training SGD classifier with 105 examples
29 septembre, 2020 9:34:34 pm org.tribuo.classification.sgd.linear.LinearSGDTrainer train
information: Labels - (0,Iris-versicolor,34), (1,Iris-virginica,35), (2,Iris-setosa,36)
Tester les données à saisir: ArrayExample(numFeatures=4,output=Iris-setosa,weight=1.0,features=[(petalLength, 1.3)(petalWidth, 0.3), (sepalLength, 4.5), (sepalWidth, 2.3), ])
Résultat de la prédiction: (Iris-setosa,0.8752021370239595)

Les données d'entrée sont les données d'Iris-setosa, chacune avec une longueur sépale de 4,5, une largeur sépale de 2,3, une longueur de pétale de 1,3 et une longueur de pétale. La largeur (largeur des pétales) est de 0,3.

D'un autre côté, le résultat de la prédiction était de 87% de probabilité, et il a été prédit qu'il s'agissait d'Iris-setosa. Tu as raison.

Cela seul n'est pas très intéressant, prévoyons donc 30% des données. J'ai changé le code comme ci-dessous.

SampleTribuo


Omission
for (var example : testData) {
    //Bonne réponse
    var correctAnswer = example.getOutput().getLabel();
    //Résultat de la prédiction
    var predictResult = linear.predict(example);

    if (correctAnswer.equals(predictResult.getOutput().getLabel())) {
        System.out.println("Résultat de la prédiction->Bonne réponse: " + predictResult.getOutputScores());
    } else {
        System.out.println("Résultat de la prédiction->Réponse incorrecte: " + predictResult.getOutputScores() + "Bonne réponse->" + correctAnswer);
    }
}
Omission

Résultat d'exécution


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

Une réponse incorrecte, mais la probabilité d'Iris-versicolor est de 57% et la probabilité d'Iris-virginica est de 42%. Au contraire, même si les données sont correctes, il y a 56% de chance d'iris-versicolor, et il y a une probabilité assez faible de réponse correcte. Puisqu'il y a peu de données à former, il y aura un biais. À partir de là, il devrait être amusant d'améliorer la précision.

SampleTribuo utilise la régression logistique pour apprendre, mais il existe d'autres classes disponibles. Il existe de nombreuses implémentations de l'interface du formateur, donc les essayer prendra un certain temps. Après tout, j'aimerais essayer d'apprendre avec le GPU plutôt que d'apprendre avec le CPU, il semble donc préférable de regarder la partie coopération ONNX ou la partie coopération TensorFlow avant le modèle d'apprentissage lui-même. J'en ai envie. image.png

~~ Eh bien, je n'ai fait du machine learning que ces derniers jours ... ~~

Épilogue

Dans l'exemple Tribuo que j'ai créé, je cherchais un moyen de sauvegarder les données entraînées car je lisais les données de test et les entraînais à chaque fois, mais je ne les trouvais pas dans le document. À partir du code source, vous pouvez voir que la méthode d'enregistrement de TensorflowModel à l'aide de Tensorfrow et la méthode d'enregistrement de CSV sont fournies, mais comme c'est le premier code à toucher, je ne comprends pas l'habitude ou l'idée. Je ne pense pas que ce soit ce que ça devrait être ici ...

Quand je pensais à sérialiser et désérialiser moi-même, je l'ai trouvé dans Issues.

Le contenu de la question est le suivant.

Les didacticiels et la documentation peuvent-ils inclure des exemples de sérialisation de modèles et de jeux de données sur disque? Il serait utile d'avoir une aide supplémentaire sur la façon d'utiliser ONNX.

Voici la réponse.

Bien sûr, vous pouvez ajouter des exemples de sérialisation à votre documentation. À ce stade, la sérialisation utilise le mécanisme standard java.io.Serializable. Un exemple de chargement et d'enregistrement d'un modèle ou d'un ensemble de données peut être trouvé dans le programme de démonstration fourni avec Tribuo. Notez que vous devez utiliser une liste d'autorisation de sérialisation pour empêcher les attaques de désérialisation.

Le meilleur exemple de chargeur ONNX pour le moment est celui des tests unitaires. Nous prévoyons d'ajouter un didacticiel qui passe par le processus de chargement des modèles tiers.

En d'autres termes, il n'est pas répertorié dans le document et il semble que vous puissiez utiliser java.io.Serializable et le faire vous-même. Comment utiliser le chargeur ONNX est dans le code de test ... Vous devez rechercher la source vous-même. J'ai cherché le code de test, mais il a été chargé. cette? Et pour économiser?

J'ai regardé à l'intérieur d'OnnxRuntime, mais il ne fait que charger. Il dit: "Chargeur statique pour la liaison JNI. Il n'y a pas d'API publique, mais il est appelé par diverses classes de ce package." Il ne semble pas être dans le package d'exécution ai.onnx ou dans le package org.tribuo.interop.onnx. En premier lieu, pour le moment, il est dit que "la sérialisation utilise le mécanisme standard java.io.Serializable", donc il semble que Tensorflow puisse le faire, mais officiellement, il n'y a rien de tel pour le moment. ..

La fonction est assez complète, mais la documentation ne rattrape pas même en anglais. Dans certains endroits, javadoc n'est pas inclus. Il semble que si vous demandez, cela vous le dira, mais c'est plus rapide de l'essayer que de l'écouter un par un, mais c'est ennuyeux et je veux le voir. Pour le moment, c'est comme hmm, mais j'ai l'impression que ça va changer d'un seul coup. La personne à l'intérieur est assez chaude.

Ensuite, réfléchissons par où commencer.

Recommended Posts

Quand j'ai retrouvé mon esprit sur Tribuo publié par Oracle, la personne à l'intérieur était une personne sexy.
J'ai essayé Tribuo édité par Oracle. Tribuo --Une bibliothèque de prédiction Java (v4.0)
Lors de la mise à jour de ma propre application, j'ai sérieusement réfléchi à la structure du package
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'ai touché Tribuo publié par Oracle. Document Tribuo --Une bibliothèque de prédiction Java (v4.0)
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji