Program Algoritma Backpropagation ( Algoritma Backpropagation )
class Backpropagation{
private void DefineInput(){
inputpattern = new double[numberofpattern][patterndimension];
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;
}
private void DefineTarget(){
targetpattern = new double[numberofpattern];
targetpattern[0] = 0;
targetpattern[1] = 1;
targetpattern[2] = 1;
targetpattern[3] = 0;
}
private double RandomNumberGenerator(){
java.util.Random rnd = new java.util.Random();
return rnd.nextDouble();
}
private void CreateNetworks(){
numberofinputneuron = patterndimension;
numberofhiddenneuron = 2;
numberofoutputneuron = targetdimension;
inputlayer = new double[numberofinputneuron];
hiddenlayer = new double[numberofhiddenlayer][numberofhiddenneuron];
backpropagationhiddenlayer = new double[numberofhiddenlayer][numberofhiddenneuron];
errorhidden = new double[numberofhiddenlayer][numberofhiddenneuron];
outputlayer = new double[numberofoutputneuron];
outputerror = new double[numberofoutputneuron];
activatedhiddenlayer = new double[numberofhiddenlayer][numberofhiddenneuron];
activatedoutputlayer = new double[numberofoutputneuron];
patternerror = new double[numberofpattern];
weights = new double[2][][];
weights[0] = new 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];
SSE = new double[maxiteration];
//System.out.println("InputToHiddenWeigth:");
for(int i=0;i<=numberofinputneuron;i++){
for(int j=0;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
weights[1][i][j] = RandomNumberGenerator();
//System.out.println(weights[1][i][j]);
}
}
}
private double ActivationFunction(double value){
double result = 0;
switch(activationtype){
case 1://sigmoid
result = 1 / (1+Math.exp(-value));
break;
case 2://bipolar sigmoid
result = (2 / (1+Math.exp(-value))) - 1;
break;
case 3:
result = (Math.exp(value) - Math.exp(-value))/((Math.exp(value) + Math.exp(-value)));
default:
result = 1 / (1+Math.exp(-value));
break;
}
return result;
}
private double DerivationOfActivationFunction(double value){
double result=0;
switch(activationtype){
case 1:
result = ActivationFunction(value) * (1 - ActivationFunction(value));
break;
case 2:
result = 0.5 * (1 + ActivationFunction(value)) * (1 - ActivationFunction(value));
break;
case 3:
result = (1 + ActivationFunction(value)) * (1 - ActivationFunction(value));
break;
default:
result = ActivationFunction(value) * (1 - ActivationFunction(value));
break;
}
return result;
}
private void FeedForward(int iteration){
System.out.println("Learning...");
for(int iter=0;iter
for(int k=0;k
//Forward
for(int i=0;i
hiddenlayer[0][i] = 0;
for(int i=0;i
outputlayer[i] = 0;
for(int i=0;i
for(int j=0;j<=numberofinputneuron;j++){
if(j!=numberofinputneuron){
hiddenlayer[0][i] += weights[0][j][i]*inputpattern[k][j];
}
else{
hiddenlayer[0][i] += weights[0][j][i];
}
}
//System.out.println("hiddenout["+i+"]:"+hiddenlayer[0][i]);
}
for(int i=0;i
activatedhiddenlayer[0][i] = ActivationFunction(hiddenlayer[0][i]);
//System.out.println("activatedhiddenout["+i+"]:"+activatedhiddenlayer[0][i]);
}
for(int i=0;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
activatedoutputlayer[i] = ActivationFunction(outputlayer[i]);
//System.out.println("activatedhiddenout["+i+"]:"+activatedoutputlayer[i]);
}
for(int i=0;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
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
totalerror += patternerror[i];
}
SSE[iter] = totalerror / numberofpattern;
System.out.println("SSE at iteration["+(iter+1)+"]= "+SSE[iter]);
}
for(int i=0;i
for(int j=0;j<=numberofhiddenneuron;j++){
if(j!=numberofhiddenneuron){
deltaweights[1][j][i] = (learningrate*outputerror[i]*activatedhiddenlayer[0][j])+(momentum*deltaweightsbuffer[1][j][i]);
}
else{
deltaweights[1][j][i] = (learningrate*outputerror[i])+(momentum*deltaweightsbuffer[1][j][i]);
}
}
}
for(int i=0;i
for(int j=0;j<=numberofhiddenneuron;j++){
deltaweightsbuffer[1][j][i] = deltaweights[1][j][i];
}
}
//backpropagation
for(int i=0;i
backpropagationhiddenlayer[0][i] = 0;
}
for(int i=0;i
for(int j=0;j
backpropagationhiddenlayer[0][i] += outputerror[j]*weights[1][i][j];
}
}
for(int i=0;i
errorhidden[0][i] = backpropagationhiddenlayer[0][i]*DerivationOfActivationFunction(hiddenlayer[0][i]);
}
for(int i=0;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
for(int j=0;j<=numberofinputneuron;j++){
deltaweightsbuffer[0][j][i] = deltaweights[0][j][i];
}
}
for(int i=0;i
for(int j=0;j<=numberofhiddenneuron;j++){
weights[1][j][i] += deltaweights[1][j][i];
}
}
for(int i=0;i
for(int j=0;j<=numberofinputneuron;j++){
weights[0][j][i] += deltaweights[0][j][i];
}
}
}
}
}
public void PatternMapping(){
double[] result = new double[numberofpattern];
System.out.println("");
System.out.println("Mapping Pattern");
for(int k=0;k
for(int i=0;i
hiddenlayer[0][i] = 0;
for(int i=0;i
outputlayer[i] = 0;
for(int i=0;i
for(int j=0;j<=numberofinputneuron;j++){
if(j!=numberofinputneuron){
hiddenlayer[0][i] += weights[0][j][i]*inputpattern[k][j];
}
else{
hiddenlayer[0][i] += weights[0][j][i];
}
}
//System.out.println("hiddenout["+i+"]:"+hiddenlayer[0][i]);
}
for(int i=0;i
activatedhiddenlayer[0][i] = ActivationFunction(hiddenlayer[0][i]);
//System.out.println("activatedhiddenout["+i+"]:"+activatedhiddenlayer[0][i]);
}
for(int i=0;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
activatedoutputlayer[i] = ActivationFunction(outputlayer[i]);
result[k] = activatedoutputlayer[i];
//System.out.println("Mapping["+k+"]:"+activatedoutputlayer[i]);
}
}
System.out.println("0 XOR 0 = "+result[0]);
System.out.println("0 XOR 1 = "+result[1]);
System.out.println("1 XOR 0 = "+result[2]);
System.out.println("1 XOR 1 = "+result[3]);
}
public void DefineParameters(){
numberofpattern = 4;
patterndimension = 2;
targetdimension = 1;
numberofhiddenlayer = 1;
activationtype = BIPOLAR_SIGMOID;
learningrate = 0.5;
momentum = 0.8;
maxiteration = 100;
}
public void Run(){
DefineParameters();
DefineInput();
DefineTarget();
CreateNetworks();
FeedForward(maxiteration);
PatternMapping();
}
//variable definition
private double[][] inputpattern;
private int numberofpattern;
private int patterndimension;
private double[] targetpattern;
private int targetdimension;
private double[] inputlayer;
private double[][] hiddenlayer;
private double[][] backpropagationhiddenlayer;
private double[][] errorhidden;
private double[] outputlayer;
private double[][] activatedhiddenlayer;
private double[] activatedoutputlayer;
private double[] outputerror;
private double[][][] weights;
private double[][][] deltaweightsbuffer;
private double[][][] deltaweights;
private double[] patternerror;
private double[] SSE;
private double learningrate;
private double momentum;
private int numberofhiddenneuron;
private int numberofinputneuron;
private int numberofoutputneuron;
private int numberofhiddenlayer;
private int activationtype;
private int maxiteration;
private static final int BINARY_SIGMOID = 1;
private static final int BIPOLAR_SIGMOID = 2;
private static final int HYPERBOLIC_TANGENT = 3;
public static void main(String[] args){
Backpropagation backpropagation = new Backpropagation();
backpropagation.Run();
}
}
2 komentar to "Algoritma Backpropagation"
ALRIS says:
Wah saya baca matematika ginian pening...hehehe
salam
blog teknologi terbaru says:
wedew programming neh ky nya, jd inget jaman msh muda dlu. walah kayak ud tua ajah..