C#Yapay Zeka

C# İle Yapay Sinir Ağı Eğitimi – 2

Merhabalar, C# ile yapay sinir ağı kodlama serimizin ikinci yazısında beraberiz. Bir önceki yazımda yapay sinir ağları ile ilgili teorik ve tarihi gelişimi hakkında bilgi vermiştim ve artık bu yazıdan itibaren kodlama tarafına geçeceğiz.
Bu yazımda ise nöron ve biaslar için gerekli olan sınıf ve interface oluşturmalarını yapacağız. Tabi herşeyden önce bir tane konsol yada Windows Forms projesi oluşturalım. Sadece eğitim ve sonrasında tahmin yapacaksanız konsol projesi yeterli olacaktır fakat hata hesaplamalarını grafik ile gösterecekseniz Windows Forms projesi oluşturmanız gerekmekte.

Projeyi oluşturduktan sonra projeye Interface adında bir tane klasör ekleyelim. Çözüm Gezgini (İngilizce kullananlar için “Solution Explorer”) sekmesini açıp projeye sağ tıklayarak Ekle > Klasör (İngilizce için “Add > Directory”) yolunu izleyerek yeni bir klasör ekleyebilirsiniz.
Klasörü oluşturduktan sonra yine o klasör içine IGirdi adında bir tane abstract class ve ICiktiVerebilir adında iki tane interface ekleyelim.
Yapay sinir ağlarında katmanların her birinde değişken sayıda nöron ve her nöron içinde bias değeri bulunmakta ve nöronlar ile biaslar arasında şöyle bir fark vardır; nöronların girdi ve çıktı değerleri olurken biasların sadece girdi değeri vardır. Daha doğrusu biasın çıkış değeri girdi değeri ile aynıdır. Bias üretilirken 0-1 aralığında rastgele bir değer üretilir ve bu değer biasın girdi değeri ve aynı zamanda çıktı değeridir, yani bias içerisinde toplama ve aktivasyon fonksiyonları çalışmaz. Bu yüzden girdi değeri hiç değişmeden çıktı değeri olarak verilir.
İşte aradaki bu farkı sağlamak için iki farklı sınıf oluşturuyoruz.
IGirdi sınıfını açıp girdi değerini tutan bir tane property ekleyelim. Bunun için prop yazıp iki kere tab tuşuna basarak property oluşturabilirsiniz.
IGirdi interfacesinden türeteceğimiz her sınıfın girdi değerleri olduğundan birazda Java’dan aşina olduğumuz get ve set metodlarını oluşturalım.
public abstract class IGirdi
{
    public double GirdiDegeri { get; set; }
    internal void NoronaGirdiEkle(double girdiDegeri) => GirdiDegeri = girdiDegeri;
    internal double GirdiDegeriniGetir() => GirdiDegeri;   
}
Bide ICiktiVerebilir interfacesini açarak orayada CiktiDegeri adında bir tane property ekleyelim.
public interface ICiktiVerebilir
{
    double CikisDegeri { get; set; }
}
Nöron ve biasları üreteceğimiz interface ve abstract sınıfları oluşturduk, artık sıra geldi nöron ve bias sınıflarını oluşturmaya.

Proje ana dizininde Girdi, Noron ve Bias olmak üzere 3 tane sınıf oluşturalım.
Girdi sınıfı ile giriş katmanında bulunan nöronları, Noron sınıfı ile gizli katman ve çıkış katmanındaki nöronları ve Bias sınıfı ile de gizli katman ve çıkış katmanında nöronlara bağlı olan biasları oluşturacağız.
Giriş katmanındaki nöronlarda toplama ve aktivasyon fonksiyonu gerçekleşmediği için gizli katman ve çıkış katmanındaki nöronlardan ayrılmakta. İşte bu ayrımı sağlamak içinde Girdi ve Noron diye 2 ayrı sınıf oluşturduk.

Girdi ve Noron sınıflarında çıktı değeri olacak fakat Bias sınıfında sadece girdi değeri olacağı için Girdi ve Noron sınıflarını hem IGirdi hemde ICiktiVerebilir interfacelerinden, Bias sınıfını ise sadece IGirdi interfacesinden türeteceğiz.
Girdi ve Noron sınıflarını ICiktiVerebilir abstract sınıfından türettiğimiz ve ICiktiVerebilir sınıfında da CikisDegeri adında bir property oluşturduğumuz için bu özelliği (abstract sınıfların kuralı gereği) yeniden yazmamız gerekiyor.
Nöronlara bağlı biaslar olduğu için Noron sınıfında bir tane de Bias sınıfından property üreteceğiz. Her nörona bağlı bir tane bias değeri olduğu ve bizimde Bias sınıfımız olduğu için Noron sınıfından her yeni nesne türetiminde Bias sınıfından da otomatik olarak bir sınıf türetilmesini sağlayalım ki, geliştirici tarafında ayrıca Bias nesnesi türetilmesine gerek kalmasın.
Bizim yazacağımız yapay sinir ağı sabit biaslı olacak ve ağırlık değeri de 1 olacak. O yüzden IGirdi interfacesinden gelen GirdiDegeri isimli propertyi yeniden oluşturacak ve değerini 1 olarak belirleyeceğiz. Ayrıca biasların nöronlara benzer şekilde ağ ağırlığı olacağından bir tane AgAgirligi isminde property oluşturacağız. Biasların ağ ağırlığı değeri de başlangıçta 0-1 arasında rastgele bir değer olacağından Bias sınıfından bir nesne türetiminde oluşturduğumuz AgAgirligi değerine rastgele bir sayı üretip atama yapalım.
Yani son durumda Girdi sınıfımız şöyle olacak;
public class Girdi : IGirdi, ICiktiVerebilir
{
    public double CikisDegeri { get; set; }
}
Noron sınıfımız;
public class Noron : IGirdi, ICiktiVerebilir
{
    public double CikisDegeri { get; set; }
    public Bias Bias { get; set; }
    internal Noron() => Bias = new Bias();
}
Ve son olarak Bias sınıfıda şöyle olacak;
public class Bias : IGirdi
{
    public new double GirdiDegeri => 1;
    public double AgAgirligi { get; set; }
    internal Bias() => AgAgirligi = new Random().NextDouble();
}
Evet yapay sinir ağımıza ait nöron ve bias nesneleri için gerekli sınıf ve arayüzleri oluşturduk ve gerekli hazırlıkları yaptık. Bu yazıyıda burada bitireyim ve bir sonraki yazımda kaldığımız yerden devam edelim.
Tüm seriye buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.
Skorumuz:
Oy Vermek İçin Tıklayın
[Toplam: 0 Ortalama: 0]

Bir cevap yazın

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

Başa dön tuşu