Neuralnetwork
This is a neural network implementation in java, it uses double arrays in the background to provide quick calculations.
The network is build to simulate a simple model of a network, it supports almost unlimited layers of processing cells, and is only bound by the computation limit of the integer size of connections, because it uses standard java arrays to store the data.
Design
The design of this network is pretty simple, instead of going the classes way, we have a few large double arrays, this provides increased performance and decreased memory usage, at the expance of readability.
These double arrays are then read in simple for loops, the indexes are calculated by the layer sizes, and this gives very efficient array access times.
Usage
Building
This project is build using Maven, once you installed Maven, you can build this project (execute from the directory where you cloned the project):
"C:/Maven/bin/mvn" clean install
Gui
Start the gui using java -cp neuralnetwork.jar me.ferrybig.javacoding.neuralnetwork.gui.network.ApplicationForm
API
This project is designed to be used from the api, a few examples are given below.
training example:
CompiledNetwork network = constructNetwork();
List<SupervisedTrainingSet> training = Arrays.asList(
new SupervisedTrainingSet(new double[]{1, 1}, new double[]{0}),
new SupervisedTrainingSet(new double[]{1, 0}, new double[]{1}),
new SupervisedTrainingSet(new double[]{0, 1}, new double[]{1}),
new SupervisedTrainingSet(new double[]{0, 0}, new double[]{0})
);
double[] out = new double[network.getOutputSize()];
// Create a calculation cache, so we don't produce any garbage during our run
double[] cache = new double[network.getMinCacheSize()];
Random random = new Random();
RandomNetworkTrainer trainer = new RandomNetworkTrainer(random, 0.1f,
0.0001, 10_000);
SupervisedErrorCalculator errorCalculator = new SupervisedErrorCalculator(training);
boolean success = trainer.train(network, errorCalculator, (i, err) -> {
if ((i % (Math.pow(10, (int) Math.log10(i)) * 5) == 0) || (i == 0)) {
System.out.println("Iteration " + i + " error " + err);
}
});
if (success) {
System.out.println("Succeded iteration");
} else {
System.out.println("Failed iteration");
}
System.out.println("Final error: " + errorCalculator.calculate(network, out, cache));
System.out.println("Network: " + network.debug());
More training examples: https://github.com/ferrybig/neuralnetwork/tree/master/src/test/java/me/ferrybig/javacoding/neuralnetwork/data
Examples of networks:
XOR with 4 inputs solved by the network
XOR with 2 inputs solved by the network
Resizing
At the moment, dynamic resizing is not possible. To change the size of the
neural net, go into the file src/main/java/me/ferrybig/javacoding/neuralnetwork/gui/network/ApplicationForm.java
.
Inside this file, on line 55, you will find an array, containing the size of the
network, together with a few examples of sizes. The other parts (like training) will automaticly adjust based on these sizes.