Pada postingan kali ini saya akan menjelaskan algoritma backprogation. Algoritma neural network backpropagation merupakan algoritma pengembalian nilai error yang di hasilkan oleh sigmoid function pada proses neural network yang nantinya akan di learning lagi. Algoritma neural network ini menggunakan rumus turunan dari masing masing output layer neural network
rumus turunan
x’ =x* (1-x)
dimana x' adalah hasil dan x merupakan output layer neural network
berikut adalah sources code neural network backpropagation yang saya buat menggunakan bahasa pemrograman java
/* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package nnmultiperceptron;
import java.util.Random;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
//import static nnmultiperceptron.NNmultiPerceptron.datalear;
/**
*
* @author faisalkwok
*/
public class NNmultiPerceptron {
/**
* @param args the command line arguments
*/
// Jumlah Perulangan
static int epoch = 1000;
// Jumlah Bobot(W)
// static int jumW = ;
// Data Learning
static double datalear[][] = {
{0, 0, 0, 0, 1},
{0, 2, 1, 1, 1},
{1, 0, 0, 1, 0},
{1, 2, 2, 2, 2},
{2, 2, 2, 2, 2}};
//jumlah data
static int jumdata = datalear.length;
// Jumlah input layer
static int jumInput=datalear[0].length;
//mendefinisikan hidden layer
static int jumlayer = 10;
//inisialisasi jumla output layer
static int jumoutput = 1;
//inisialisasi weight
// Target Data
static double target[] = {0, 0, 0, 1, 1};
// static double target[]=new double[600];
// Nilai Bias
static double bias[] = {0.1,0.1};
//Mendefinisikan nilai Learning Rate
static double miu = 0.1;
static double[][] X = new double[100][100];
static double[][] dw = new double[100][100];
static double D[][] = new double[100][100];
public static void main(String[] args) {
double error;
double w1[][] = new double[100][100];
double w2[][] = new double[100][100];
Random r = new Random();
//membangkitkan bobot(W) secara Random
for (int k = 0; k < jumlayer; k++) {
for (int l = 0; l < jumInput + 1; l++) {
w1[k][l] = -1.0 + (1.0 - (-1.0)) * r.nextDouble();
}
}
for (int k = 0; k < jumoutput; k++) {
for (int l = 0; l < jumlayer + 1; l++) {
w2[k][l] = -1.0 + (1.0 - (-1.0)) * r.nextDouble();
}
}
double totalsse=0;
for (int ep=0;ep<epoch;ep++) {
System.out.println("Perulangan ke-" + (ep + 1));
double tot = 0;
for (int s = 0; s < jumdata; s++) {
for (int in = 0; in < jumInput; in++) {
X[0][in] = datalear[s][in];
}
X[0][jumInput]=bias[0];
for (int m = 0; m < jumlayer; m++) {
double sum = 0;
for (int i = 0; i < jumInput; i++) {
sum =sum+X[0][i] * w1[m][i];
}
sum = sum + X[0][jumInput] * w1[m][jumInput];
//sigmoid hidden layer
X[1][m] = sigmoid(sum);
}
X[1][jumlayer]=bias[1];
for (int a = 0; a < jumoutput; a++) {
double sum = 0;
for (int b = 0; b < jumlayer; b++) {
sum = sum +X[1][b] * w2[a][b];
//System.out.println(w2[a][b]);
}
sum = sum+X[1][jumlayer]*w2[a][jumlayer] ;
//sigmoid output layer
X[2][a] = sigmoid(sum);
}
DecimalFormat df = new DecimalFormat("#.##");
double selisih = 0;
for (int sse = 0; sse < jumoutput; sse++) {
selisih = Math.abs(target[s] - X[2][sse]);
tot +=selisih;
}
//back pro
for (int k = 0; k < jumoutput; k++) {
D[3][k] = (X[2][k] * (1 - X[2][k])) * (target[s] - X[2][k]);
for (int l = 0; l < jumlayer; l++) {
D[2][l] = X[1][l] * (1 - X[1][l]) * w2[k][l] * D[3][k];
}
for (int t = 0; t < jumlayer+1; t++) {
dw[2][t] = miu * X[1][t] * D[3][k];
w2[k][t] = w2[k][t] + dw[2][t];
}
}
for (int k = 0; k < jumlayer; k++) {
for (int l = 0; l < jumInput; l++) {
dw[k][l] = miu * X[0][l] * D[2][k];
w1[k][l] = w1[k][l] + dw[k][l];
}
}
}
error=Math.sqrt(tot)*1000;
System.out.println(error);
}
}
public static double sigmoid(double x) {
double hasil = 0;
hasil = (1 / (1 + Math.exp(-1 * x)));
return hasil;
}


1 komentar:
keren
ReplyPosting Komentar