Derin Öğrenme (Deep Learning) - Evrişim Katmanı (Convolution Layer)

Conv2D

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

Conv2D, genellikle görüntüler üzerinde kullanılan bir çıktı tensörü üretmek için evrişim çekirdeği (evrişim matrisi) oluşturur. Oluşan evrişim çekirdeği ile tüm görüntü üzerinde soldan sağa, yukarıdan aşağıya hareket ederek görüntüde bulanıklaştırma, keskinleştirme, kabartma, kenar algılama gibi işlemler yapar. Son durumda oluşan görüntüye filtrelenmiş görüntü denir.

Conv2D Evrişim Katmanı nasıl çalışır?

Yukarıdaki grafikte görüldüğü gibi solda bulunan (9x9) boyutundaki görüntü üzerinde ortada bulunan (3x3) boyutundaki çekirdek ile filtreleme yapılarak son durumda sağdaki gibi (7x7) boyutunda filtrelenmiş görüntü oluşmaktadır. Yapılan bu  işlem sırasında meydana gelen matematiksel işlemler de aşağıdaki gibidir.

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

from tensorflow.keras.layers import Conv2D

Söz dizimi: Conv2D(filters, kernel_size, strides=(1,1), padding="valid", data_format="None", dilation_rate=(1,1), groups=1, 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, **kwargs)

  • filters, evrişimdeki çıktı filtrelerinin boyunu temsil eder, tam sayı değeri alır.
  • kernel_size, evrişim penceresinin uzunluğunu temsil eder, tam sayı değeri alır.
  • strides, evrişimin adım uzunluğunu temsil eder, tam sayı değeri alır. Varsayılan olarak (1,1) dir. 
  • padding, dolgu olup olmayacağını temsil eder. 3 farklı değer alır; "valid", "same" veya "causal" dır. Varsayılan olarak "valid" dir.
    • valid, dolgu olmadığını temsil eder.
    • same, çıktının girdi ile aynı yükseklik/genişlik boyutuna sahip olması için girdinin sağına/soluna veya yukarısınıa/aşağısına eşit olarak sıfır ekler.
    • causal, genişletilmiş evrişimler oluşturur.
  • data_format, bir veri formatından diğerine geçerken ağırlık sırasını korumak için esas olarak giriş boyutlarını sıralamak için kullanılır. İki farklı değer alabilir: "channels_last","channels_first". Varsayılan olarak "channels_last"dir.
  • dilation_rate, genişlemiş evrişim için kullanılacak genişleme oranını temsil eder. Varsayılan olarak (1,1) dir. 
  • gruplar, girişin kanal ekseni boyunca bölündüğü grupların sayısını temsil eder. Varsayılan olarak 1'dir.
  • activation, kullanılacak aktivasyon fonksiyonunu temsil eder. Belirtilmezse herhangi bir aktivasyon uygulamaz.
  • use_bias, katmanın 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.

Örnek-1: Bir model oluşturarak girdi katmanından sonra Conv2D katmanı ile evrişim işlemi uygulayalım.

from tensorflow.keras.layers import Dense,Conv2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import plot_model
#Model tanımlanır.
model=Sequential()

#Giriş katmanı("input_shape" ile) ve giriş katmanı sonrasında Conv2D katmanı modele eklenir.
model.add(Conv2D(filters=20,
                 kernel_size=(3,3),
                 strides=(1,1),
                 padding="same",
                 activation="relu",
                 input_shape=(28,28,1)))

#1.Gizli katman modele eklenir.
model.add(Dense(units=6,activation="relu"))

#Çıkış katmanı eklendi
model.add(Dense(units=1,activation="sigmoid"))

Oluşturulan modelin katmanları görselleştirilirse;

plot_model(model,show_shapes=True)

Çıktı:

Yukarıdaki grafikte de görüldüğü üzere giriş katmanında (28,28,1) olan boyut Conv2D işlemi sonrasında (28,28,20) olarak evrişme işlemi yapıldı.

Örnek-2: (3, 8, 28, 28, 1) boyutlarında olan bir veriyi 2 defa Conv2D katmanından geçirip gözlemleyelim.

import tensorflow as tf
from tensorflow.keras.layers import Conv2D
#Boyut tanımlanır
input_shape = (3, 8, 28, 28, 1)

#Random değerlerle tanımlanan boyut kadar bir liste oluşturulur
x=tf.random.normal(input_shape)
print("Girdi boyutu:",x.shape)

#1. Conv2D katmanı oluşturulur.
y=Conv2D(
    filters=32,       #çıktı filtrelerinin boyut değeri
    kernel_size=(2,2), #evrişim penceresinin uzunluğu
    strides=(1,1),     #evrişimin adım uzunluğu
    padding="valid",  #dolgu durumu
    activation="relu",#activasyon fonksiyonu
    input_shape=input_shape[2:] #girdi boyutu (28, 28, 1)
)(x) #Conv2D katmanını x listesine uygula

#2. Conv2D katmanı oluşturulur.
y2=Conv2D(
    filters=64,       #çıktı filtrelerinin boyut değeri
    kernel_size=3,    #evrişim penceresinin uzunluğu
    strides=(2,2),     #evrişimin adım uzunluğu
    padding="valid",  #dolgu durumu
    activation="relu" #activasyon fonksiyonu
)(y) #Conv2D katmanını x listesine uygula

print("1. Çıktı boyutu:",y.shape)
print("2. Çıktı boyutu:",y2.shape)

Çıktı:

Girdi boyutu: (3, 8, 28, 28, 1)
1. Çıktı boyutu: (3, 8, 27, 27, 32)
2. Çıktı boyutu: (3, 8, 13, 13, 64)
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.