Derin Öğrenme (Deep Learning) - Keras Çekierdek Katmanı (Core Layer)

Dense

Yayın tarihi :15-Şub-22
Bölüm kodlarını ve/veya veri setlerini indir.

Dense Layer(Yoğun Katman), en sık kullanılan Yapay Sinir Ağları katmanıdır. Oluşturulan her katmandaki düğümler(nöron) bir önceki katmanın düğümlerinden girdi alır. Dense katmanında bir matris-vektör çarpımı gerçekleşir ve sonuç değeri olarak olarak "m" boyutlu bir vektör oluşur. Bu nedenle de Dense katmanı vektörlerin boyutlarını değiştirmek için kullanılır. Vektör üzerinde döndürme, ölçekleme, öteleme gibi işlemleri de uygular.

Dense katmanı giriş elemanlarına aşağıdaki işlemi uygular ve çıkış sonucunu döndürür.

Formül: output = activation(dot(input, kernel) + bias)

  • output, çıktı değerini temsil eder.
  • activation, aktivasyon fonksiyonu temsil eder.
  • dot, iki dizinin nokta çarpımını döndürür. Yani burada input ve kernel değerlerinin nokta çarpımını döndürür. (dot için "Numpy" kütüphanesi kullanılabilir.)
  • input, girdi değerini temsil eder.
  • kernel, ağırlık verilerini temsil eder.
  • bias, önyargı vektörüdür.

Örnek-1:

  • Girdi değerleri: [[4,5],[9,12]]
  • Ağırlı değerleri : [[[1,3],[0.4,2.3]]]
  • Ön yargı değeri :0
  • aktivasyon fonksiyonu: Doğrusal (Doğrusal aktivasyon fonksiyonu sonuca etki etmeyecektir.)

Olan bir girdinin Dense Katmanı sonrasındaki değerini hesaplayalım.

input_=[[4,5],[9,12]]
kernel_=[[[1,3],[0.4,2.3]]]
bias_=0
import numpy as np

np.dot(input_,kernel_)+bias_

#nokta çarpımı özetle aşağıdaki işlemi yapar
#[[4*1+5*0.4,4*3+5*2.3],[9*1+12*0.4,9*3+12*2.3]]

Çıktı:

array([[[ 6. , 23.5]],

       [[13.8, 54.6]]])

Kullanılabilmesi için "Dense" kütüphanesinin içe aktarılması gerekmektedir.

from tensorflow.keras.layers import Dense

Söz dizimi: Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

  • units, katman sonucunda çıkacak boyutu belirler. Pozitif tam sayı değerleri alır.
  • activation, aktivasyon fonksiyonunu temsil eder. Varsayılan olarak Linear Activation (Doğrusal Aktivasyon)(a(x)=x) kullanılır. 
  • use_bias, katmanın bir sapma vektörü kullanıp kullanmadığını temsil eder.
  • kernel_initializer, yapay sinir ağının bazı ağırlıklarla başlaması ve ardından bunları yinelemeli olarak daha iyi değerlerle güncellemesi gerekir. Kernel_initializer terimi, ağırlıkları başlatmak için kullanılacak istatistiksel dağılımdır. Varsayılan olarak "glorot_uniform" seçilidir. Daha fazla seçenek için Keras sayfası incelenebilir.
  • bias_initializer, bias(ön yargı) vektörü için kullanılacak başlatıcıyı temsil eder.
  • kernel_regularizer, kernel(çekirdek) ağırlıkları matrisine uygulanacak düzenleyici işlevi temsil eder.
  • bias_regularizer , bias vektörüne uygulanacak düzenleyici işlevi temsil eder.
  • activity_regularizer, katmanın çıktısına uygulanacak olan düzenleyici işlevini temsil eder.
  • kernel_constraint, çekirdek ağırlıkları matrisine uygulanacak kısıtlama işlevini temsil eder.
  • bias_constraint, bias vektörüne uygulanacak kısıtlama fonksiyonunu temsil eder.

Yukarıdaki parametreler haricinde eğer modelde ilk katman olarak kullanılıyorsa input_shape adlı bir argümanı da kullanır. input_shape argümanı giriş katmanının boyutunu belirtmek için kullanılan, sayısal değer alan bir yapıdır.

Bir örnek üzerinden Dense katmanını daha iyi anlamaya çalışalım;

Örnek-2: Giriş değişken sayısı 6 olan modele 1 tane Dense katmanı ekleyelim ve sonuçları gözlemleyelim.

#Gerekli kütüphaneler içe aktarılır.
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import plot_model
#Model tanımlanır.
model=Sequential()

#Dense katmanı oluşturulur.
#İnput değişkeni 6 (input_shape)
#1.Katmandaki(Dense katmanı) nöron sayısı 12 olsun
layer_1=Dense(
    units=12,
    input_shape=(6,),
    activation="relu",
    kernel_initializer="glorot_uniform")

#Oluşturulan katman modele eklenir
model.add(layer_1)

Oluşturulan modelin; 6 giriş değişkeni ve 1 Dense katmanı görüntüsü; 

plot_model(model,show_shapes=True)

Çıktı:

 
#layer_1 katman ağırlıkları (kernel_initializer="glorot_uniform") 
layer_1.weights[0]

Çıktı:

<tf.Variable 'dense/kernel:0' shape=(6, 12) dtype=float32, numpy=
array([[-9.76288617e-02, -2.99482942e-01, -1.46031380e-04,
         2.87481129e-01,  5.17491937e-01,  2.79108107e-01,
        -5.29148459e-01,  5.48499346e-01, -2.02334523e-02,
         3.85779679e-01,  1.96406960e-01,  5.00772476e-01],
       [-5.67323744e-01, -3.25754315e-01, -5.54756641e-01,
         1.40550911e-01, -1.72638625e-01,  3.81250679e-01,
        -1.63012147e-02,  2.38221347e-01,  6.09108806e-02,
        -3.31348598e-01,  3.63109529e-01,  3.44136655e-01],
       [-4.27022517e-01, -2.58501738e-01,  6.30422235e-02,
        -2.42011011e-01, -3.82699460e-01,  3.15213561e-01,
        -9.60488915e-02, -4.47386205e-01,  3.88908327e-01,
        -5.28304517e-01,  3.61401677e-01,  2.05371082e-01],
       [ 4.76910353e-01, -5.15453815e-02, -2.54282594e-01,
        -1.19499266e-01,  1.78273082e-01,  3.10272872e-01,
         9.03016329e-03, -5.33478975e-01,  3.38593066e-01,
        -2.06120312e-01, -3.52582335e-02, -5.29991150e-01],
       [ 1.16925597e-01,  2.13012516e-01, -2.01041400e-01,
        -5.59439540e-01, -3.14138919e-01,  5.05072594e-01,
         3.38485777e-01, -5.39192557e-01, -3.70435417e-01,
        -1.95031136e-01, -1.77448153e-01, -2.88781255e-01],
       [ 5.55533528e-01,  1.12974346e-01,  3.00775230e-01,
        -5.07991493e-01,  2.42110491e-02,  3.87745738e-01,
        -3.84442121e-01, -4.10436958e-01,  4.07742858e-01,
        -4.14891243e-02, -2.90213823e-02, -6.78900480e-02]], dtype=float32)>

Katman ağırlıklarına dikkat edilirse "kernel_initializer="glorot_uniform" seçili iken 6 dizi(giriş elemanları sayısı) içinde 12 (Dense katmanı nöron sayısı) tane eleman bulunan ağırlıklar oluştu. kernel_initializer değerlerini "normal" olarak değiştirerek ağırlık değerlerinin değiştiğini gözlemleyelim.

#Model tanımlanır.
model=Sequential()

#Dense katmanı oluşturulur.
layer_1=Dense(
    units=12,
    input_shape=(6,),
    activation="relu",
    kernel_initializer="normal")

#Oluşturulan katman modele eklenir
model.add(layer_1)
#layer_1 katman ağırlıkları (kernel_initializer="glorot_uniform") 
layer_1.weights[0]

Çıktı:

<tf.Variable 'dense_8/kernel:0' shape=(6, 12) dtype=float32, numpy=
array([[ 0.05652654,  0.02629455,  0.00691713,  0.08787496,  0.03072941,
        -0.00496445, -0.0732972 , -0.03783061, -0.01492409,  0.00192444,
         0.06538999, -0.02804397],
       [ 0.03243489,  0.01385619,  0.01967296, -0.04485149, -0.04593671,
        -0.01960755, -0.06889601,  0.0539553 ,  0.03274212, -0.06728484,
         0.00429335,  0.07654882],
       [ 0.02304018,  0.03145753,  0.0525607 , -0.05954517,  0.021227  ,
        -0.00625892, -0.02245615, -0.07089334, -0.04015788,  0.05360511,
        -0.03255507, -0.08626998],
       [-0.0620482 , -0.01148296,  0.00384872,  0.04507874,  0.05700392,
        -0.01082407,  0.023988  ,  0.01287915, -0.02227914, -0.04792326,
        -0.00721978,  0.04935959],
       [ 0.01705877, -0.0745469 ,  0.0352935 , -0.03130062,  0.02313391,
        -0.01669847, -0.01862943, -0.00086508, -0.03953974,  0.04311273,
         0.06394717, -0.08162892],
       [ 0.02604059, -0.03463974, -0.02109264,  0.01583532, -0.03854043,
         0.04203052,  0.07045222, -0.00164613, -0.04369656,  0.0157973 ,
         0.06729602, -0.04029629]], dtype=float32)>

Modelin girdi ve çıktı boyutlarını gözlemleyelim

print("Model Girdi Boyutu:",model.input.shape)
print("Model Çıktı Boyutu:",model.output.shape)

Çıktı:

Model Girdi Boyutu: (None, 6)
Model Çıktı Boyutu: (None, 12)

Modelin özet bilgisi;

model.summary()

Çıktı:

Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_1 (Dense)             (None, 12)                84        
                                                                 
=================================================================
Total params: 84
Trainable params: 84
Non-trainable params: 0

Parametre sayısı; dense-1 katmanında Parametre sayısı(Param) 84 olarak bulunmuştur. Dense katmanı parametre sayısı hesaplanırken; parameters_count=output_size * (input_size + 1) formülü kullanılır.

Bir modele istenilen sayıda Dense katmanı eklenebilir. 

Örnek-3:

#Model tanımlanır.
model=Sequential()

#Dense katmanı oluşturulur.
#1.Gizli Katman
layer_1=Dense(
    units=12,
    input_shape=(6,),
    activation="relu",
    kernel_initializer="normal")

#2.Katman
layer_2=Dense(
    units=4,
    activation="relu",
    kernel_initializer="normal")

#Çıktı Katmanı
layer_out=Dense(
    units=1,
    activation="sigmoid")


#Oluşturulan katmanlar modele eklenir
model.add(layer_1)
model.add(layer_2)
model.add(layer_out)

Son durumda Çoklu Dense katmanlı modelin grafiğini inceleyelim.

plot_model(model,show_shapes=True)

Çıktı:

Modelin özeti;

model.summary()

Çıktı:

Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_3 (Dense)             (None, 12)                84        
                                                                 
 dense_4 (Dense)             (None, 4)                 52        
                                                                 
 dense_5 (Dense)             (None, 1)                 5         
                                                                 
=================================================================
Total params: 141
Trainable params: 141
Non-trainable params: 0
Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.