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

Merhabalar, C# ile yapay sinir ağı kodlama serimizin üçüncüsündeyiz. Bu yazımda nöronların tutulduğu katmanları oluşturacak ve katmanlara nöron ekleme işlemlerini yapacağız. Projemizin ana dizininde Katman adında bir tane sınıf oluşturalım ve bu sınıfı List tipinden kalıtım aldıralım. List türünden kalıtıyoruz çünkü katmanlar, içlerinde nöronlar olan bir yapıdır, yani nöron dizisidir. Bizde nöronları IGirdi interfacesi ile ürettiğimiz için ve liste olduğunu da belirtebilmek için List türünden kalıtım aldık. Ayrıca katmanın türünü belirleyebilmek için (giriş katmanı mı, gizli katman mı yoksa çıkış katmanı mı olduğunu belirleyebilmek için) KatmanDereceleri adında bir tane enum türünde dosya oluşturup GirisKatmani, GizliKatman ve CikisKatmani verilerini ekleyelim. Yani oluşturduğumuz enum şu şekilde olacak;
public enum KatmanDereceleri { GirisKatmani, GizliKatman, CikisKatmani }
Şimdi tekrardan dönelim Katman sınıfına ve KatmanDereceleri tipinde bir tane property oluşturalım. Ben burada C#’ın bi özelliğini kullanmak istedim ve doğrudan bu sınıftan yeni bir nesne türetilmesin istedim. Yani new anahtar kelimesiyle Katman nesnesi oluşturulmayacak, onun yerine static tipteki bir fonksiyon ile geliştiriciye yeni bir Katman nesnesi oluşturup göndermek istedim. Bunun içinde Katman sınıfının private tipte bir constructor metodunu oluşturdum ve bu fonksiyonun içini boş bıraktım. Ayrıca KatmanOlustur adında internal static tipte farklı bir fonksiyon ile de dediğim gibi yeni bir Katman sınıfı nesnesi oluşturup geriye döndürdüm. Ayrıca sınıfın kalıtımını aldığımız List nesnesinin kendi fonksiyonlarını doğrudan kullanmak yerine kendi fonksiyonlarımı oluşturdum. Fakat sadece ekleme metodlarını kendim oluşturdum. Bir katmana bir yada birden çok nöron eklenebildiği için hem tekli, hemde çoklu nöron eklenebilecek şekilde ekleme fonksiyonlarını yazdım. Uzun lafın kısası kodumuz şu şekilde;
public class Katman : List<IGirdi>
{
public KatmanDereceleri Derece { get; set; }
private Katman() { }
internal static Katman KatmanOlustur(KatmanDereceleri derece) => new Katman { Derece = derece };
internal void KatmanaNoronEkle(IGirdi noron)
{
if (noron is Noron && Derece == KatmanDereceleri.GirisKatmani)
throw new Exception('Giriş Katmanına Nöron Eklenemez !');
Add(noron);
}
internal void KatmanaNoronEkle(IGirdi[] noronlar)
{
Array.ForEach((noronlar, noron) => {
if (noron is Noron && Derece == KatmanDereceleri.GirisKatmani)
throw new Exception('Giriş Katmanına Nöron Eklenemez !');
Add(noron);
});
}
}
Yazdığımız kodları biraz irdelersek; KatmanaNoronEkle fonksiyonları tek nöron ve nöron dizisi alacak şekilde override ettik, ki koddan önce dediğim gibi bir katmana bir tane yada çoklu nöron eklenebiliyor. Bizde bunu tek fonksiyon ile sağlamak için bu şekilde yaptık. Geliştirme tarafında KatmanaNoronEkle() fonksiyonuna bir tane nöronda gönderilse, nöron diziside gönderilse hedeflenen katmana ekleme yapılabilmekte. Ayrıca fonksiyon içindeki if koşulu ile de giriş katmanına nöron eklenmesini engelledik. Çünkü bir önceki yazımda da anlattığım üzere giriş katmanındaki nöronlarda aktivasyon ve toplama fonksiyonları gerçekleştirilmediği için bu ayrımı sağlayabilmek adına giriş katmanındaki nöronları Girdi, gizli katman ve çıkış katmanındaki nöronları temsil etmek içinde Noron sınıfını oluşturmuştuk. Yani if koşulu ile giriş katmanına toplama ve aktivasyon işlemleri yapılan nöronlardan eklenmesini önledik.
Evet bu yazımızı da burada bitirelim, bir sonraki yazıda kaldığımız yerden devam ederiz inşallah. Tüm seriye buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.