İçeriğe geç

Python İle Derin Öğrenme #4 – Derin Öğrenmenin Temelleri

Ben ne diye beni yoktan yaratana ibadet etmeyecekmişim ki! (Oysa) hepiniz yalnızca O’na döndürüleceksiniz.
Yasin 22

Giriş

Bu yazıda Model sınıfının içerisine biraz daha ayrıntılı girmeye çalışacağım ve daha öncesinde yazmış olduğumuz örnek kodu daha ayrıntılı bir şekilde anlamayı deneyeceğiz. Öncelikle belirtmeliyim ki, okuduğum kitaba biraz ara verip BTK Akademiden bir eğitim serisini takip ediyorum kısa sürede burada neler varmış diye inceleyeip daha sonrasında kitaba geri döneceğim. Eğitim serisinde de https://keras.io/api/models/ gibi keras'ın aslında resmi kaynaklarına çok fazla bakıldığını farkettim. Bende bundan dolayı Models'i buradaki anlatımı referans alarak anlatmaya çalışacağım. Hadi başlayalım.

Keras'ta Model nedir?

Keras, derin öğrenme modelleri oluşturmak için kullanılan bir kütüphanedir. Bu kütüphanenin kalbinde ise Model sınıfı yer alır. Model sınıfı, en basit ifadeyle, sinir ağınızı oluşturan katmanları bir araya getiren bir yapıdır. Bir pastanın farklı katmanlarını düşünün; kek, krema, çikolata sosu... Bu katmanların hepsini bir araya getirip bir bütün haline getirdiğinizde, ortaya pasta çıkar. Keras'taki Model de aynen bu şekilde çalışır. Giriş verisini alıp, bu katmanlardan sırayla geçirerek bir çıktı üretir.

Model sınıfının ne işe yaradığını daha iyi anlamak için üç temel işlevini inceleyelim:

  • Katmanları Birleştirme: Bir sinir ağının her bir aşaması bir katman olarak adlandırılır. Örneğin, ilk katman veriyi alır, ikinci katman bu veriyi işler, üçüncü katman başka bir işlem yapar ve en son katman sonucu verir. Model, bu katmanları doğru sırada birleştirerek karmaşık bir işlem zinciri oluşturur.

  • Eğitim ve Tahmin: Model nesnesi, sinir ağınızı eğitmek (makineye öğrenmesini sağlamak) ve yeni verilerle tahminler yapmak için gerekli olan tüm fonksiyonlara sahiptir. Örneğin, model.fit() fonksiyonuyla modelinizi eğitir, model.predict() ile de tahmin yaparsınız.

  • Ayarları Saklama: Model aynı zamanda, modelin öğrenme sürecinde kullanılan kayıp fonksiyonu, optimizer ve metrikler gibi ayarları da saklar. Bu ayarlar sayesinde modelinizin nasıl öğrenmesi gerektiği belirlenir.

Neden Model sınıfı bu kadar önemli?

Keras'ta bir sinir ağı oluşturmanın birden fazla yolu vardır ama en yaygın olanları Sequential (sıralı) ve Functional (fonksiyonel) API'lerdir. Her iki yöntemle de oluşturulan modeller aslında temel olarak Model sınıfının bir örneğidir.

  • Sequential: Adından da anlaşılacağı gibi, katmanların ardı ardına eklendiği basit sinir ağları için kullanılır. Diyelim ki, sadece bir katmanınız var, sonra bir tane daha eklediniz ve bir tane daha. Bu, bir Sequential modeldir.

  • Functional: Daha karmaşık yapılar, yani katmanların birbirine paralel bağlanabildiği veya bir katmanın çıktısının birden fazla katmana girdi olarak verilebildiği durumlar için kullanılır. Bu da daha gelişmiş modeller oluşturmanıza olanak tanır.

Bu iki yöntemle de oluşturduğunuz modellerin her biri, Model sınıfının sunduğu ortak fonksiyonları (eğitim, tahmin, kaydetme vb.) kullanabilir.

Keras'ta Sequential Modeli Nedir?

Bir önceki açıklamada Model sınıfının katmanları bir araya getiren bir yapı olduğunu söylemiştik. İşte Sequential modeli de, bu Model sınıfının özel bir türüdür. Adı üstünde (Sequential = Sıralı), bu model, katmanları tek bir sıra halinde, art arda dizmek için kullanılır.

Bunu, bir montaj hattı gibi düşünebilirsiniz. Bir araba montaj hattında her istasyon belirli bir görevi yapar: ilk istasyonda şasi takılır, ikinci istasyonda motor, üçüncü istasyonda tekerlekler... Her işlem bir öncekinin üzerine eklenir ve sıra bozulmaz. Keras'taki Sequential model de aynen bu şekilde çalışır. Veri, ilk katmandan girer, oradan ikinci katmana geçer, sonra üçüncüye ve bu böyle devam eder.

Sequential Modelinin Temel Özellikleri ve Kullanımı

  • Sade ve Basit: Sequential model, basit sinir ağları oluşturmak için idealdir. Katmanları birbiri ardına ekleyerek kolayca bir model kurmanızı sağlar. Bu, özellikle yeni başlayanlar için çok kullanışlıdır.

  • Katman Ekleme: Bir Sequential model oluşturduktan sonra, model.add() metodu ile modelinize yeni katmanlar ekleyebilirsiniz. Örneğin, model.add(tf.keras.layers.Dense(32)) komutuyla modele 32 nöronlu tam bağlantılı bir katman eklersiniz.

  • Otomatik Yapılandırma: Sequential modelini kullanırken, çoğu zaman ilk katmanda giriş verisinin boyutunu belirtmeniz yeterlidir. Keras, daha sonraki katmanların giriş ve çıkış boyutlarını otomatik olarak ayarlayabilir, bu da işinizi kolaylaştırır.

  • Sınırlılıkları: Sequential modelinin en büyük sınırlılığı, katmanlar arasında dallanma veya karmaşık bağlantılar yapamamasıdır. Yani, bir katmanın çıktısını birden fazla katmana girdi olarak vermek veya birleştirme gibi işlemler yapmak mümkün değildir. Daha karmaşık bir mimari için (örneğin, bir katmanın çıktısının hem bir sonraki katmana hem de iki katman sonrasına gittiği durumlarda), Keras'ın Functional API adı verilen başka bir yöntemini kullanmak gerekir.

Model Oluşturma ve Katman Ekleme

model = keras.Sequential()
model.add(keras.Input(shape=(16,)))
model.add(keras.layers.Dense(8))

Bu, bir model oluşturmanın en temel yoludur.

  • model = keras.Sequential(): İlk olarak boş bir Sequential modeli oluşturursunuz.
  • model.add(...): add metodu ile bu boş modelinize katmanları teker teker eklersiniz.
  • keras.Input(shape=(16,)): Bu, modelinize gelecek verinin şeklini belirtir. (16,) demek, her bir veri parçasının 16 elemanlı bir vektör olacağı anlamına gelir. Bu katmanı eklemek, modelinizin hemen "yapılandırılmasını" sağlar. Bu, modelin hangi tür veriyi beklediğini ve katmanların nasıl bağlanacağını hemen bilmesini sağlar.

Giriş Katmanını Belirtmemek: "Gecikmeli Yapılandırma"

model = keras.Sequential()
model.add(keras.layers.Dense(8))
model.add(keras.layers.Dense(4))
# model.weights not created yet

Burada, Input katmanı eklenmiyor. Peki bu ne anlama geliyor?

  • Model, henüz giriş verisinin boyutunu bilmediği için, katmanlar arasındaki bağlantıları ve ağırlıkları (weights) oluşturamaz.
  • Bu durumda model, siz onu bir veriyle kullanana kadar (yani fit, eval veya predict metotlarını çağırana kadar) "yapılandırılmaz". Bu duruma "Gecikmeli Yapılandırma" (delayed-build pattern) denir.
  • Veriyle karşılaştığında, otomatik olarak verinin şeklini anlar ve tüm katmanları birbirine bağlar, yani modelin ağırlıklarını oluşturur.

Manuel Yapılandırma

Gecikmeli yapılandırma durumunda bile, modelinizi elle yapılandırmak isterseniz build metodunu kullanabilirsiniz:

model = keras.Sequential()
model.add(keras.layers.Dense(8))
model.add(keras.layers.Dense(4))
model.build((None, 16)) # Manuel olarak giriş boyutunu belirtiyoruz.
  • model.build((None, 16)): Burada (None, 16) diyerek, modelin batch (veri paketinin) boyutunu bilmediğimizi (None), ancak her bir veri parçasının 16 elemanlı olacağını belirtiriz. Bu komut, modeli hemen yapılandırır ve ağırlıklarını oluşturur.

add Metodu

Sequential.add(layer): Bu, modelinize yeni bir katman eklemek için kullanılan temel komuttur. Her yeni katman, mevcut katmanların en üstüne eklenir.

pop Metodu

Sequential.pop(): Bu, modelinizdeki en son eklenen katmanı kaldırmanıza yarar. Tıpkı bir LEGO kulesinin en üstündeki parçayı almak gibi. Bu komutu kullanarak, modelinizin mimarisini dinamik olarak değiştirebilirsiniz.

summary method

Genel olarak modelinizdeki katmanlar hakkında tablo şeklinde özet bir bilgi elde etmek istiyorsanız kullanmanız gereken methoddur. Örnek kodumuzu referans alırsak aşağıdaki gibi kullanabiliriz.

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

#  BURAYA EKLE
network.summary()

Çıktısı ise şu şekilde olacak.

Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_2 (Dense)                 │ (None, 512)            │       401,920 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_3 (Dense)                 │ (None, 10)             │         5,130 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 407,050 (1.55 MB)
 Trainable params: 407,050 (1.55 MB)
 Non-trainable params: 0 (0.00 B)

Neden Önemli?

  • Eğitimden önce model yapısını kontrol etmek için idealdir.
  • Yanlış input_shape verip “dimension mismatch” hatası alma riskini azaltır.
  • Özellikle karmaşık modellerde debugging için çok faydalıdır.

get_layer method

get_layer() metodu, bir Keras modelinde tanımlı olan katmanlara erişmek için kullanılır. Bu yöntem özellikle eğitim sonrası ağırlıkları incelemek, katman çıktısını almak veya bazı katmanlara özel işlemler yapmak istediğinde çok işe yarar.

Her katman tanımlanırken otomatik bir isim alır (örneğin "dense", "dense_1", "conv2d" gibi). Ama sen istersen özel isim verebilirsin:

model = models.Sequential()
model.add(layers.Dense(128, activation='relu', input_shape=(784,), name='gizli_katman'))
model.add(layers.Dense(10, activation='softmax', name='cikis_katman'))

katman = model.get_layer(name='gizli_katman')
print(katman.output_shape)

Katmanlar sıralı olduğu için indeks ile de erişebilirsin:

ilk_katman = model.get_layer(index=0)

Ne Zaman Kullanılır?

  • Ağırlık/Weight çekmek için:,

    katman = model.get_layer(name='gizli_katman')
    weights = katman.get_weights()
    print("Ağırlıklar:", weights)
  • Transfer Learning’de sadece bazı katmanları dondurmak için

    katman = model.get_layer(name='gizli_katman')
    katman.trainable = False
  • Bir katmanın çıktısını almak için

from tensorflow.keras.models import Model

ara_katman = model.get_layer('gizli_katman').output
ara_model = Model(inputs=model.input, outputs=ara_katman)

ara_cikti = ara_model.predict(test_images)
Kategori:Derin Öğrenme

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir