package org.neuroph.samples.adalineDigits;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.core.events.LearningEvent;
import org.neuroph.core.events.LearningEventListener;
import org.neuroph.nnet.MultiLayerPerceptron;
import org.neuroph.nnet.learning.BackPropagation;
/**
*
* @author Ivan Petrovic
*/
/*
In this sample MultiLayerPerceptron network is used for pattern recognition. The
input pattern must match EXACTLY with what the network was trained with.
This example teaches the adaline to recognize the 10 digits.
This is based on a an example from Encog (Encog Examples/org.encog.examples.neural.adaline).
Encog example is based on a an example by Karsten Kutza,
written in C on 1996-01-24.
http://www.neural-networks-at-your-fingertips.com
*/
public class DigitsRecognition {
public static void main(String args[]) {
//create training set from Data.DIGITS
DataSet dataSet = generateTraining();
int inputCount = Data.CHAR_HEIGHT * Data.CHAR_WIDTH;
int outputCount = Data.DIGITS.length;
int hiddenNeurons = 19;
//create neural network
MultiLayerPerceptron neuralNet = new MultiLayerPerceptron(inputCount, hiddenNeurons, outputCount);
//get backpropagation learning rule from network
BackPropagation learningRule = neuralNet.getLearningRule();
learningRule.setLearningRate(0.5);
learningRule.setMaxError(0.001);
learningRule.setMaxIterations(5000);
//add learning listener in order to print out training info
learningRule.addListener(new LearningEventListener() {
@Override
public void handleLearningEvent(LearningEvent event) {
BackPropagation bp = (BackPropagation) event.getSource();
if (event.getEventType().equals(LearningEvent.Type.LEARNING_STOPPED)) {
System.out.println();
System.out.println("Training completed in " + bp.getCurrentIteration() + " iterations");
System.out.println("With total error " + bp.getTotalNetworkError() + '\n');
} else {
System.out.println("Iteration: " + bp.getCurrentIteration() + " | Network error: " + bp.getTotalNetworkError());
}
}
});
//train neural network
neuralNet.learn(dataSet);
//train the network with training set
testNeuralNetwork(neuralNet, dataSet);
}
/**
* Prints network output for the each element from the specified training
* set.
*
* @param neuralNet neural network
* @param testSet test data set
*/
public static void testNeuralNetwork(NeuralNetwork neuralNet, DataSet testSet) {
System.out.println("--------------------------------------------------------------------");
System.out.println("***********************TESTING NEURAL NETWORK***********************");
for (DataSetRow testSetRow : testSet.getRows()) {
neuralNet.setInput(testSetRow.getInput());
neuralNet.calculate();
int izlaz = maxOutput(neuralNet.getOutput());
String[] niz = Data.convertDataIntoImage(testSetRow.getInput());
for (int i = 0; i < niz.length; i++) {
if (i != niz.length - 1) {
System.out.println(niz[i]);
} else {
System.out.println(niz[i] + "----> " + izlaz);
}
}
System.out.println("");
}
}
public static DataSet generateTraining() {
DataSet dataSet = new DataSet(Data.CHAR_WIDTH * Data.CHAR_HEIGHT, Data.DIGITS.length);
for (int i = 0; i < Data.DIGITS.length; i++) {
// setup input
DataSetRow inputRow = Data.convertImageIntoData(Data.DIGITS[i]);
double[] input = inputRow.getInput();
// setup output
double[] output = new double[Data.DIGITS.length];
for (int j = 0; j < Data.DIGITS.length; j++) {
if (j == i) {
output[j] = 1;
} else {
output[j] = 0;
}
}
//creating new training element with specified input and output
DataSetRow row = new DataSetRow(input, output);
//adding row to data set
dataSet.addRow(row);
}
return dataSet;
}
public static int maxOutput(double[] array) {
double max = array[0];
int index = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
index = i;
max = array[i];
}
}
return index;
}
}
Ads help maintain this website.