Backpropagation Neural Network For XOR Problem Java Source Code
Backpropagation Neural Network For XOR Problem Java Source Code
import java.util.Random;
class ProjectNN{
inputpattern[0][0] = 0;
inputpattern[0][1] = 0;
inputpattern[1][0] = 0;
inputpattern[1][1] = 1;
inputpattern[2][0] = 1;
inputpattern[2][1] = 0;
inputpattern[3][0] = 1;
inputpattern[3][1] = 1;
}
targetpattern[0] = 0;
targetpattern[1] = 1;
targetpattern[2] = 1;
targetpattern[3] = 0;
}
double[numberofinputneuron+1][numberofhiddenneuron];
weights[1] = new
double[numberofhiddenneuron+1][numberofoutputneuron];
deltaweights = new double[2][][];
deltaweights[0] = new
double[numberofinputneuron+1][numberofhiddenneuron];
deltaweights[1] = new
double[numberofhiddenneuron+1][numberofoutputneuron];
deltaweightsbuffer = new double[2][][];
deltaweightsbuffer[0] = new
double[numberofinputneuron+1][numberofhiddenneuron];
deltaweightsbuffer[1] = new
double[numberofhiddenneuron+1][numberofoutputneuron];
System.out.println("InputToHiddenWeigth:");
for(int i=0;i<=numberofinputneuron;i++){
for(int j=0;j<numberofhiddenneuron;j++){
weights[0][i][j] = RandomNumberGenerator();
System.out.println(weights[0][i][j]);
}
}
System.out.println("HiddenToOutputWeigth:");
for(int i=0;i<=numberofhiddenneuron;i++){
for(int j=0;j<numberofoutputneuron;j++){
weights[1][i][j] = RandomNumberGenerator();
System.out.println(weights[1][i][j]);
}
}
}
//System.out.println("hiddenout["+i+"]:"+hiddenlayer[0][i]);
}
for(int i=0;i<numberofhiddenneuron;i++){
activatedhiddenlayer[0][i] =
ActivationFunction(hiddenlayer[0][i]);
//System.out.println("activatedhiddenout["+i+"]:"+activatedhiddenlayer[0][i]);
}
for(int i=0;i<numberofoutputneuron;i++){
for(int j=0;j<=numberofhiddenneuron;j++){
if(j!=numberofhiddenneuron){
outputlayer[i] += weights[1][j][i] *
activatedhiddenlayer[0][j];
}
else{
outputlayer[i] += weights[1][j][i];
}
}
//System.out.println("Outputout["+i+"]:"+outputlayer[i]);
}
for(int i=0;i<numberofoutputneuron;i++){
activatedoutputlayer[i] =
ActivationFunction(outputlayer[i]);
//System.out.println("activatedhiddenout["+i+"]:"+activatedoutputlayer[i]);
}
for(int i=0;i<numberofoutputneuron;i++){
outputerror[i] = (targetpattern[k] -
activatedoutputlayer[i])*(DerivationOfActivationFunction(outputlayer[i]));
//System.out.println("outputerror["+i+"]:"+outputerror[i]);
}
patternerror[k] = 0;
for(int i=0;i<numberofoutputneuron;i++){
patternerror[k] += Math.pow((targetpattern[k]-
activatedoutputlayer[i]),2);
//System.out.println("patternerror["+k+"]:"+patternerror[k]);
}
patternerror[k] = 0.5 * patternerror[k];
if(k==numberofpattern-1){
double totalerror = 0;
for(int i=0;i<numberofpattern;i++){
totalerror += patternerror[i];
}
SSE[iter] = totalerror / numberofpattern;
System.out.println("SSE["+iter+"]:"+SSE[iter]);
}
for(int i=0;i<numberofoutputneuron;i++){
for(int j=0;j<=numberofhiddenneuron;j++){
if(j!=numberofhiddenneuron){
deltaweights[1][j][i] =
(learningrate*outputerror[i]*activatedhiddenlayer[0][j])+(momentum*deltaweightsb
uffer[1][j][i]);
}
else{
deltaweights[1][j][i] =
(learningrate*outputerror[i])+(momentum*deltaweightsbuffer[1][j][i]);
}
}
}
for(int i=0;i<numberofoutputneuron;i++){
for(int j=0;j<=numberofhiddenneuron;j++){
deltaweightsbuffer[1][j][i] =
deltaweights[1][j][i];
}
}
//backpropagation
for(int i=0;i<numberofhiddenneuron;i++){
backpropagationhiddenlayer[0][i] = 0;
}
for(int i=0;i<numberofhiddenneuron;i++){
for(int j=0;j<numberofoutputneuron;j++){
backpropagationhiddenlayer[0][i] +=
outputerror[j]*weights[1][i][j];
}
}
for(int i=0;i<numberofhiddenneuron;i++){
errorhidden[0][i] =
backpropagationhiddenlayer[0][i]*DerivationOfActivationFunction(hiddenlayer[0][i
]);
}
for(int i=0;i<numberofhiddenneuron;i++){
for(int j=0;j<=numberofinputneuron;j++){
if(j!=numberofinputneuron){
deltaweights[0][j][i] =
(learningrate*errorhidden[0][i]*inputpattern[k][j])+(momentum*deltaweightsbuffer
[0][j][i]);
}
else{
deltaweights[0][j][i] =
(learningrate*errorhidden[0][i])+(momentum*deltaweightsbuffer[0][j][i]);
}
}
}
for(int i=0;i<numberofhiddenneuron;i++){
for(int j=0;j<=numberofinputneuron;j++){
deltaweightsbuffer[0][j][i] =
deltaweights[0][j][i];
}
}
for(int i=0;i<numberofoutputneuron;i++){
for(int j=0;j<=numberofhiddenneuron;j++){
weights[1][j][i] += deltaweights[1][j][i];
}
}
for(int i=0;i<numberofhiddenneuron;i++){
for(int j=0;j<=numberofinputneuron;j++){
weights[0][j][i] += deltaweights[0][j][i];
}
}
}
}
}
//System.out.println("hiddenout["+i+"]:"+hiddenlayer[0][i]);
}
for(int i=0;i<numberofhiddenneuron;i++){
activatedhiddenlayer[0][i] =
ActivationFunction(hiddenlayer[0][i]);
//System.out.println("activatedhiddenout["+i+"]:"+activatedhiddenlayer[0][i]);
}
for(int i=0;i<numberofoutputneuron;i++){
for(int j=0;j<=numberofhiddenneuron;j++){
if(j!=numberofhiddenneuron){
outputlayer[i] += weights[1][j][i] *
activatedhiddenlayer[0][j];
}
else{
outputlayer[i] += weights[1][j][i];
}
}
//System.out.println("Outputout["+i+"]:"+outputlayer[i]);
}
for(int i=0;i<numberofoutputneuron;i++){
activatedoutputlayer[i] =
ActivationFunction(outputlayer[i]);
System.out.println("Mapping["+k+"]:"+activatedoutputlayer[i]);
}
}
}
//variable definition
private double[][] inputpattern;
private int numberofpattern;
private int patterndimension;
private double[] targetpattern;
private int targetdimension;
NN.numberofhiddenlayer = 1;
NN.activationtype = BIPOLAR_SIGMOID;
NN.learningrate = 0.5;
NN.momentum = 0.8;
NN.maxiteration = 100;
NN.RunNN();
}
}