Java-Programa Perceptron Modeli ile And Kapılarını Öğretme

Merhaba arkadaşlar bugün de javada, neural(nöral) network modeli olan perceptron(tek katmanlı) modeli ile programa or kapısını öğrenmeye çalışacağız.And kapısının doğruluk tablosu şöyle:

Biz bu girdi ve çıktıları modellemek için ArrayListleri kullandık.Girdileri “arrInput”,çıktıları ise “arrOutput” dizilerine ekledik ve başlangıçta verdiğimiz alfa değerleri ile weight değerlerini kullanarak bu tabloyu öğrenmesini sağladık.Öğrenme sürecinde alfa değerini 1,ve weight başlangıç değeri olarak da 1 girdiğimizde her seferinde fonksiyon sonuçları hesapladık. Bu sonuçların thresholdu geçip geçmemesine göre bir output oluşturduk.Bu outputları,bizim beklediğimiz outputlar ile uyuşuyor mu onu kontrol ettik.Eğer uyuşmuyorsa şu formülle tekrar ağırlık güncellemesi yapacağız;

ağırlık =ağırlık+((beklenenDeger-gelenDeger)*alfa);

 

ve yeni ağırlık için tekrar kontrol işlemlerini gerçekleştireceğiz.En son da bulduğu son ağırlık değerini yazdıracağız.

Eğer anlattıklarım anlamsız geliyorsa Sadi Evren Şeker Hocamızın şu videosunu izlemenizi tavsiye ederim.Dilerseniz şu adrese tıklayarak sitesine girip, bununla alakalı bir sürü içeriği inceleyedebilirsiniz..

Direkt bu anlatılanları koda döküp yaptığımda şöyle bir şey çıktı:


import java.util.ArrayList;

public class Or_YapaySinir {

static double alfa, threshold, delta, weight;
static ArrayList<Integer> arrOutput;

public static void main(String[] args) {

alfa = 1;
threshold = 5;
weight = 1;

ArrayList<String> arrInput = new ArrayList<>();
arrInput.add("0.0");
arrInput.add("0.1");
arrInput.add("1.0");
arrInput.add("1.1");

arrOutput = new ArrayList<>();
arrOutput.add(0);
arrOutput.add(0);
arrOutput.add(0);
arrOutput.add(1);
double lastWeight = output(arrInput);
System.out.println("Son Weight : " + lastWeight);
}

public static double output(ArrayList arrInput) {
String strTmp = "";
for (int i = 0; i < arrInput.size(); i++) {
String strInput = arrInput.get(i) + "";
int noktaIndex = strInput.indexOf(".");
//System.out.println("Nokta Index:" + noktaIndex);

strTmp = strInput.substring(0, noktaIndex);
int a = Integer.parseInt(strTmp);
System.out.println("a : " + a);

strTmp = strInput.substring(noktaIndex + 1, strInput.length());
int b = Integer.parseInt(strTmp);
System.out.println("b : " + b);

double sonuc = (a * weight) + (b * weight) * alfa;
int output;
if (sonuc < threshold) {
output = 0;
} else {
output = 1;
}

if (output != arrOutput.get(i)) {
System.out.println("Cikti : " + output + ",Beklenen : " + arrOutput.get(i) + " = FALSE");
weight += (arrOutput.get(i) - output) * alfa;
System.out.println("Agirlik Guncellendi: " + weight);
return output(arrInput);
} else {
System.out.println("Cikti : " + output + ",Beklenen : " + arrOutput.get(i) + " = TRUE");
}
}
return weight;
}

}

 

Output:

run:
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 1
Cikti : 0,Beklenen : 1 = FALSE
Agirlik Guncellendi: 2.0
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 1
Cikti : 0,Beklenen : 1 = FALSE
Agirlik Guncellendi: 3.0
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 1
Cikti : 1,Beklenen : 1 = TRUE
Son Weight : 3.0
BUILD SUCCESSFUL (total time: 0 seconds)

 

Fakat alfa değerleri büyük seçildiğinde ağırlıklar sürekli birbirini tekrar ettiğinde ben bu durumun da önüne geçmek için alfa değerlerini de güncelleyecek şekilde kodu düzenledim:


import java.util.ArrayList;

public class Or_YapaySinir {

static double alfa, threshold, delta, weight;
static ArrayList<Integer> arrOutput;
static ArrayList<Double> arrWeight;

public static void main(String[] args) {

alfa = 6;
threshold = 5;
weight = 1;

arrWeight = new ArrayList<>();
ArrayList<String> arrInput = new ArrayList<>();
arrInput.add("0.0");
arrInput.add("0.1");
arrInput.add("1.0");
arrInput.add("1.1");

arrOutput = new ArrayList<>();
arrOutput.add(0);
arrOutput.add(0);
arrOutput.add(0);
arrOutput.add(1);
double lastWeight = output(arrInput);
System.out.println("Son Weight : " + lastWeight);
System.out.println("Son alfa: " + alfa);
}

public static double output(ArrayList arrInput) {
arrWeight.add(weight);
String strTmp = "";
for (int i = 0; i < arrInput.size(); i++) {
String strInput = arrInput.get(i) + "";
int noktaIndex = strInput.indexOf(".");
//System.out.println("Nokta Index:" + noktaIndex);

strTmp = strInput.substring(0, noktaIndex);
int a = Integer.parseInt(strTmp);
System.out.println("a : " + a);

strTmp = strInput.substring(noktaIndex + 1, strInput.length());
int b = Integer.parseInt(strTmp);
System.out.println("b : " + b);

double sonuc = (a * weight) + (b * weight) * alfa;
int output;
if (sonuc < threshold) {
output = 0;
} else {
output = 1;
}

if (output != arrOutput.get(i)) {

System.out.println("Cikti : " + output + ",Beklenen" + arrOutput.get(i) + " = FALSE");
double newWeight = weight + (arrOutput.get(i) - output) * alfa;
//Kritik
while (arrWeight.contains(newWeight)) {
alfa -= 0.1;
newWeight = weight + (arrOutput.get(i) - output) * alfa;
}
System.out.println("Alfa:" + alfa);
weight = newWeight;
System.out.println("Agirlik Guncellendi: " + weight);
return output(arrInput);
} else {
System.out.println("Cikti : " + output + ",Beklenen : " + arrOutput.get(i) + " = TRUE");
}
}
return weight;
}

}

 

Output:

run:
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 1,Beklenen0 = FALSE
Alfa:6.0
Agirlik Guncellendi: -5.0
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 1
Cikti : 0,Beklenen1 = FALSE
Alfa:5.9
Agirlik Guncellendi: 0.9000000000000004
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 1,Beklenen0 = FALSE
Alfa:5.800000000000001
Agirlik Guncellendi: -4.9
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 1
Cikti : 0,Beklenen1 = FALSE
Alfa:5.700000000000001
Agirlik Guncellendi: 0.8000000000000007
a : 0
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 0
b : 1
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 0
Cikti : 0,Beklenen : 0 = TRUE
a : 1
b : 1
Cikti : 1,Beklenen : 1 = TRUE
Son Weight : 0.8000000000000007
Son alfa: 5.700000000000001
BUILD SUCCESSFUL (total time: 0 seconds)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir