Keras ile Kompleks Derin Öğrenme Modelleri Nasıl Kurulur?

Tirendaz Akademi
5 min readMar 6, 2023

TensorFlow içindeki Keras Functional API ile modern sinir ağlarını inşa etme

Freepik

Keras Sequential API ile kolay ve temiz bir şekilde modeller kurabilirsiniz. Fakat, çoklu girdilerin ve çıktıların olduğu kompleks modeller kurmak için bu API, çok kullanışlı değildir. Kompleks modeller için daha esnek olduğu için Keras Functional API kullanmak daha mantıklıdır.

Bunu göstermek için 2016'da ortaya çıkan Wide & Deep sinir ağı mimarisini ele alalım.

Kaynak

Bu mimari, verideki, hem derin kalıpları hem de basit kuralları bulmaya yardımcı olur.

Yapay zekaya ilginiz varsa TensorFlow ve Keras ile derin öğrenme Udemy kursumuzu şiddetle tavsiye ederim. İndirim kuponu için tirendaziletisim@gmail.com adresine mail atmanız yeterli.

Hadi bu deep-wide sinir ağını Keras Functional API ile nasıl kuracağımıza bakalım.

Veri Setini Yükleme

Keras Functional API nasıl kullanıldığını göstermek için Scikit -Learn’ deki California Housing veri setini kullanalım. Bu veri setini fetch_california_housing fonksiyonu ile yükleyelim.

from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()

Tamam veri setini yükledik. Şimdi eğitim ve test verilerini oluşturalım. Unutmayın eğitim verisi ile model kurulur, test verisi ile model değerlendirilir. Veri setini parçalamak için Scikit-Learn’ deki train_test_split fonksiyonunu kullanalım.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
housing.data, housing.target,random_state=42)

Tamam veri setlerimiz model için hazır. Şimdi Functional API ile derin sinir ağımızı inşa edelim.

Derin Sinir Ağı Modeli Kurma

Öncelikle rasgeleliği sabitlemek için TensorFlow’daki set.seed fonksiyonunu kullanalım.

import tensorflow as tf
tf.random.set_seed(42)

Şimdi katmanlarımızı tek tek inşa edelim. Unutmayın önce kullanacağımız katmanları oluşturacağız sonra bu katmanlar ile modelimizi inşa edeceğiz.

normalization_layer = tf.keras.layers.Normalization()         #(1)
hidden_layer1 = tf.keras.layers.Dense(30, activation="relu") #(2)
hidden_layer2 = tf.keras.layers.Dense(30, activation="relu")
concat_layer = tf.keras.layers.Concatenate() #(3)
output_layer = tf.keras.layers.Dense(1) #(4)

Hadi bu kodların üzerinden geçelim.

(1) Öncelikle Normalization katmanını yazdık. Bu katman, Scikit-Learn’ deki StandardScaler’ın yaptığı işi yapar. Yani bu fonksiyon sayısal verileri normalleştirmemize yardımcı olur. Bu katmanı kullanmak için adapt metodunu çağırmamız gerekecek. Bu metot, verilerinin ortalaması ve varyansını hesaplar. Bu metodu fit metodundan önce çağırıcağız. Bu katmanı kullandığımız için Flatten katmanı kullanmamıza gerek yok.

(2) Normalization katmanından sonra iki gizli katman oluşturduk. Bu katmanlara 30 nöron geçirdim ve aktivasyon fonksiyonu olarak ReLU yazdık.

(3) Katmanlarımızı birleştirmek için concat_layer isminde bir birleştirme katmanı oluşturduk. Bu katmanda istediğimiz katmanların çıktılarını birleştirebiliriz.

(4) En son çıktı katmanını yazdık. Problemimiz regresyon olduğu için yani sadece bir sayısal değer tahmin edeceğimiz için çıktı katmanına bir nöron geçirdik.

Tamam, böylece modelde kullanacağımız katmanları oluşturduk. Şimdi bu katmanlar ile sinir ağımızı inşa edelim.

input_ = tf.keras.layers.Input(shape=X_train.shape[1:])
normalized = normalization_layer(input_)
hidden1 = hidden_layer1(normalized)
hidden2 = hidden_layer2(hidden1)
concat = concat_layer([normalized, hidden2])
output = output_layer(concat)

Hadi bu kodların üzerinden geçelim. Önce girdi değişkenimizi oluşturduk. Daha sonra normalleştirme katmanını yazdık. Verilerimiz normalleştirme katmanından geçtikten sonra, gizli katmana gelecek. Dolayısıyla normalleştirme katmanı değişkenini gizli katmana girdi olarak verdik. Dikkat ederseniz Functional API’da bir katmanın çıktısını diğer katmana girdi olarak veriyoruz. Daha sonra ilk gizli katman çıktısını ikinci gizli katmana girdi olarak yazdık. Ardından girdi ve ikinci gizli katmanın çıktısını birleştirmek için birleştirme katmanını kullandık. En son bu birleştirme katmanından geçen verileri çıktı katmana verdik.

Harika, tek tek katmanların girdilerini ve çıktılarını oluşturduk. Şimdi bir Keras modeli oluşturalım. Modeli kurarken girdilerimizi ve çıktılarımızı modele geçirelim.

model = tf.keras.Model(inputs=[input_], outputs=[output])

Hadi şimdi summary metodu ile modelimizin özetini görelim.

model.summary()
Model Özeti

Bu tabloda, katmanları, katmanların çıktılarını, parametre sayılarını ve bağlantılı katmanları görebilirsiniz. Dikkat ederseniz, Concatenate katmanı, input ve dense 1 yani ikinci gizli katmanla bağlantılı. Buradaki none, batch sayısı yerine kullanılıyor. Batch sayımız ne ise bu sayı none yerine geçecek.

Tamam, böylece model mimarimizi oluşturduk. Şimdi modeli derleyelim. Modeli derlerken loss fonksiyonu, optimizer ve kullanacağınız metriği probleminize göre belirlemelisiniz.

optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)

model.compile(
loss="mse",
optimizer=optimizer,
metrics=["RootMeanSquaredError"])

Harika, modelimizi derledik. Artık modelimiz eğitim için hazır.

Model Eğitim

Modeli eğitmek için fit metodunu çağıracağız. Fakat daha önce eğitim verilerini normalleştirmek için adapt metodunu kullanalım. Bu metot normaleştirme için eğitim verilerinin ortalamasını ve standart sapmasını hesaplayacak.

normalization_layer.adapt(X_train)

Artık modeli fit metodunu çağırarak eğitmeye hazırız. Validasyon verisi kullanmak için validation_split parametresini kullanalım.

history = model.fit(X_train, y_train, epochs=20, validation_split=0.2)

Bu komutu çalıştırdığımızda model eğitilmeye başlar.

Dikkat ederseniz her bir epoch’da eğitim ve validasyon veri setleri için loss ve metrik değerleri hesaplanıyor. Her bir epoch’da loss değerlerinin düştüğünü görüyoruz. Bu modelin verilerden öğrendiği anlamına gelir. Buradaki amacım Functional API’nin nasıl kullanılacağını göstermek. Siz daha farklı mimariler ile daha iyi modeller inşa edebilirsiniz.

Model Değerlendirme

Modelimizi eğittikten sonra test veri seti üzerinde performansını görelim. Bunun için evaluate metodunu çağırmamız yeterli.

mse_test = model.evaluate(X_test, y_test)

# Output:
162/162 [==============================] - 0s 3ms/step -
loss: 0.3089 - root_mean_squared_error: 0.5558

Burada loss ve metriğin değerini görebilirsiniz. Şimdi test verisinden bir kaç değer alalım ve bu değeri tahmin edelim.

X_new = X_test[:3]

Şimdi predict metodunu çağırarak bu verileri kurduğumuz modele göre tahmin edelim. Verileri daha iyi görmek için Pandas DataFrame yapısını kullanalım.

import pandas as pd
y_pred = model.predict(X_new)
pd.DataFrame(y_pred)

# Output:
0 0.631996
1 1.136796
2 4.315046

Tamam, böylece ilk üç evin fiyatlarını tahmin ettik. Hadi şimdi gerçek değerlere bakalım.

pd.DataFrame(y_test[:3])

# Output:
0 0.47700
1 0.45800
2 5.00001

Verilerin gerçek etiketleri de bu şekilde. Genel olarak modelimizin tahminleri kötü değil.

Son Sözler

Bu yazımda, Keras Functional API ile nasıl kompleks sinir ağları kurabileceğinizi anlattım. Bu analizde tek bir girdinin ve tek bir çıktının olduğu bir yapay sinir ağı inşa ettik. Fakat bazı durumlarda birden fazla girdi ve birden fazla çıktı kullanmak isteyebilirsiniz. Böyle durumlarda nasıl derin sinir ağları inşa edeceğinizi öğrenmek için aşağıdaki videoyu izleyebilirsiniz.

Ayrıntılı Keras Functional API Kullanımı

Makaleyi okuduğunuz için teşekkür ederim. Umarım faydalı bir makale olmuştur. Bu derste kullandığım notebook’a buradan ulaşabilirsiniz. Sorularınız varsa yorumlara yazabilirsiniz. Bu yazıyı beğendiyseniz aşağıdaki alkış tuşuna basmayı ve arkadaşlarınız ile paylaşmayı unutmayın. Hadi bağlanalım: YouTube | Udemy | Twitter | Instagram 😊

Aşağıdaki yazılar da dikkatinizi çekebilir:

Gelecek yazılarda görüşmek üzere. Şimdilik hoşça kalın.

Kaynaklar

--

--