Neuronale Netze in Java mit dem neuem Neuroph 2.6

Neuroph: Neuronale Netze in Java

Margarita Steinhauer, Valentin Steinhauer

Das neu veröffentlichte Neuroph 2.6 führt viele neue Features in der Performance und Anwendbarkeit in Android ein.

Einige Eigenschaften des Neuroph 2.6 wurden schon in früheren Publikationen beschrieben [1, 2]. An dieser Stelle möchten wir eine Anwendung zur Verfügung zu stellen, die einerseits Fraud Detection und andererseits die Anwendung von Neuroph 2.6 behandelt.

Einfache Identifizierung mittels Tippmustern

Die zugrunde liegende Idee beruht auf einer simplen Gegebenheit: Jeder Mensch weist ein einzigartiges Muster im Tippverhalten auf [3]. Dieses kann dazu verwendet werden, um Menschen voneinander, z.B. bei Eingabe von Passwörtern, zu unterscheiden und neuronale Netze damit individuell zu trainieren. Um die Implementierung zu vereinfachen, verwenden wir hier ein Beispiel mit einem einzigen Wort: „Muster“. Dazu definieren wir für das neuronale Netz die Intervalle zwischen den Buchstaben als Inputvektoren. Den Output beim Training nennen wir die Person. Am Ende werden wir nur zwischen zwei Personen unterscheiden. Als Umgebung verwenden wir JavaFX 2.0.

Trainingssätze

Nach den durchgeführten Messungen auf einem bestimmten Rechner liegen uns folgende Werte vor:

double[] datal1 = {440. / datamax, 454. / datamax, 336. / datamax, 287. / datamax, 224. / datamax};
double[] resl1 = {100. / datamax};
double[] datal2 = {431. / datamax, 457. / datamax, 431. / datamax, 336. / datamax, 200. / datamax};
double[] resl2 = {100. / datamax};
double[] datal3 = {400. / datamax, 353. / datamax, 240. / datamax, 152. / datamax, 152. / datamax};
double[] resl3 = {100. / datamax};
double[] datav1 = {328. / datamax, 391. / datamax, 272. / datamax, 272. / datamax, 192. / datamax};
double[] resv1 = {900. / datamax};
double[] datav2 = {287. / datamax, 369. / datamax, 272. / datamax, 256. / datamax, 183. / datamax};
double[] resv2 = {900. / datamax};
double[] datav3 = {255. / datamax, 360. / datamax, 263. / datamax, 232. / datamax, 177. / datamax};
double[] resv3 = {900. / datamax};
 TrainingSet trainingSet = new TrainingSet();
 trainingSet.addElement(new SupervisedTrainingElement(datal1, resl1));
 trainingSet.addElement(new SupervisedTrainingElement(datal2, resl2));
 trainingSet.addElement(new SupervisedTrainingElement(datal3, resl3));
 trainingSet.addElement(new SupervisedTrainingElement(datav1, resv1));
 trainingSet.addElement(new SupervisedTrainingElement(datav2, resv2));
 trainingSet.addElement(new SupervisedTrainingElement(datav3, resv3));

Im Vergleich zu Neuroph Version 2.5 sind die Werte in Arrays statt Vektoren verpackt. Eine Normierung (bei datamax) besteht aus einer einfachen Division auf 1.000 (msc). Wie wir schon früher gezeigt haben, müssen die Resultate nicht auf der Grenze liegen. Deswegen wurde der Wert 100 für die erste Person und 900 für die zweite Person angegeben.

Training der Netze

Als Netztopologie wird Multi Layer Perzeptron verwendet.

 int maxIterations = 10000;
 neuralNet = new MultiLayerPerceptron(5, 11, 1);
 ((LMS) neuralNet.getLearningRule()).setMaxError(0.0001);//0-1
 ((LMS) neuralNet.getLearningRule()).setLearningRate(0.60);//0-1
 ((LMS) neuralNet.getLearningRule()).setMaxIterations(maxIterations);//0-1
 neuralNet.learn(trainingSet);

Die Parameter des Netzes sind identisch in allen Beispielen: Maximale Zahl der Iterationen: 10.000; Topologieparameter: 5, 11, 1 (5 Inputwerte, 11 Neuronen in der Zwischenschicht und ein Neuron für das Resultat).

Kontrolle der Netze

Um trainierte Netze zu testen, nehmen wir einen Trainingssatz und prüfen, ob das Resultat mit der Erwartung übereinstimmt:

neuralNet.setInput(datal1);
neuralNet.calculate();
double[] networkOutput = neuralNet.getOutput();
double predicted = networkOutput[0];
System.out.println("PREDICTED:" + predicted);

Layout

Das Layout ist in JavaFX gestaltet und besteht aus einem Label, einem Eingabefeld und einer Ausgabenachricht.

…........................................................
 NeuralNetwork neuralNet;
 double datamax = 1000.0D; //normalize
 BorderPane borderPane = new BorderPane();
 ArrayList arrayList = new ArrayList();
 Label message = new Label("");
…..............................................................
 text();
 primaryStage.setTitle("Simple Fraud Detection");
 primaryStage.setScene(new Scene(borderPane, 640, 400));
 primaryStage.show();

Die Befehle „text()“ und „button()“ messen die zeitlichen Abstände zwischen dem Tippverhalten im Textfeld und binden die Elemente an das BorderPanel.

private void text() {
        final TextField textBox = new TextField();
        textBox.setPromptText("your text: muster, please tip");
        textBox.setOnKeyPressed(new EventHandler() {
            @Override
            public void handle(KeyEvent ke) {
                Date date = new Date();
                arrayList.add(date);
                //System.out.println("Key Pressed: " + ke.getText() + " msec:" + date.getTime());
            }
        });
        textBox.setOnKeyReleased(new EventHandler() {
            @Override
            public void handle(KeyEvent ke) {
            }
        });
        textBox.setOnKeyTyped(new EventHandler() {
            @Override
            public void handle(KeyEvent ke) {
            }
        });        
        Button btn = button();        
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.getChildren().addAll(textBox,btn,message);
        vbox.setPadding(new Insets(10, 10, 10, 10));
        borderPane.setCenter(vbox);
  }

Im Befehl „button()“ werden die Daten zusammengestellt, normiert und mit dem ML Perzeptron bewertet.

  private Button button() {
        Button btn = new Button();
        btn.setText("Login");
        btn.setOnAction(
                new EventHandler() {
                    @Override
                    public void handle(ActionEvent event) {
                        System.out.println("Pushed");
                        double[] testdata = new double[5];
                        for (int i = 1; i < arrayList.size(); i++) {
                            Long diff = ((Date) arrayList.get(i)).getTime() - ((Date) arrayList.get(i - 1)).getTime();
                            System.out.println(diff);
                            if (i <= 5) {                                 testdata[i - 1] = diff / datamax;                                 if (i == 5) {                                     neuralNet.setInput(testdata);                                     neuralNet.calculate();                                     double[] networkOutput = neuralNet.getOutput();                                     double predicted = networkOutput[0] * datamax;                                     System.out.println("LIVE PREDICTED:" + predicted);                                     double v = Math.abs(900.0 - predicted);                                     double l = Math.abs(100.0 - predicted);                                     if (v > l) {
                                        message.setText("Hallo Person 1!");
                                        System.out.println("Hallo Person 1!");
                                    } else {
                                        message.setText("Hallo Person 2!");
                                        System.out.println("Hallo Person2!");
                                    }
                                    arrayList = new ArrayList();
                                }
                            }
                        }
                    }
                });
        return btn;}

Erkennungstest

Hier erfolgt eine Darstellung des Ergebnisses in Form von Screenshots:

Abbildung 1: Leeres Eingabefeld in unserer Oberfläche.

Abbildung 1: Leeres Eingabefeld in unserer Oberfläche.

Abbildung 2: Korrekte Erkennung von Person 2 nach Eingabe des Beispielwortes „Muster“.

Abbildung 2: Korrekte Erkennung von Person 2 nach Eingabe des Beispielwortes „Muster“.

Fazit

Diese simple Anwendung dient nun als eine Vorlage für weitere Fraud Situationen.

 

Margarita Steinhauer studiert M. Sc. Biologie an der JLU-Gießen.

Dr.Valentin Steinhauer arbeitet bei der Devoteam GmbH in Weiterstadt. Er verfügt über langjährige Erfahrung aus B2B und B2C Softwareprojekten als Coach, Trainer, Architekt, Teamleiter und Entwickler.

Geschrieben von
Margarita Steinhauer, Valentin Steinhauer
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.