Derin Öğrenme (Deep Learning) - Keras Çekierdek Katmanı (Core Layer)
Flatten
Flatten Layer (Düzleştirme Katmanı), verinin toplam boyutunu değiştirmeden çıktı boyutunu 1 boyutlu bir biçime dönüştürmek için kullanılan yapay sinir ağ katmanıdır.
Kullanılabilmesi için "Flatten" kütüphanesinin içe aktarılması gerekmektedir.
from tensorflow.keras.layers import Flatten
Söz dizimi: Flatten(data_format=None, **kwargs)
- 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.
Yukarıdaki parametre 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.
Flatten katmanını daha iyi anlayabilmek için basit bir resim oluşturalım ve onu Flatten ile düzleştirelim.
#Gerekli kütüphaneler içe aktarılır.
import numpy
import matplotlib.pyplot as plt
%matplotlib inline
import tensorflow as tf
3x3 (3x3 piksel) boyutlarında resim oluşturmak için ilk olarak bir liste tanımlayalım ve bu resmi görüntüleyelim.
Not: Resim oluşturmak için; her sayı bir kareyi temsil etmektedir. 0-255 arasında istenilen sayı verilebilir. Resim kalitesinin yüksek olması için kare sayısının (piksel boyutunun) yüksek olması gerekmektedir.
image=[[0,12,0],
[0,0,0],
[0,0,0]]
plt.imshow(image)
Çıktı:
Liste içerisinde 0 olan sayıları da farklı sayılarla doldurarak resmi tamamlayalım.
image=[[15,20,25],
[30,35,40],
[45,50,55]]
plt.imshow(image)
Çıktı:
Oluşturulan "image" listesini Tensorflow'a uygun olacak şekilde dönüştürme işlemi yapalım.
#Tensorflow'a uygun hale çevirme işlemi
image=tf.convert_to_tensor(image)
image
Çıktı:
<tf.Tensor: shape=(3, 3), dtype=int32, numpy= array([[15, 20, 25], [30, 35, 40], [45, 50, 55]])>
#Resmin boyutu
image.shape
Çıktı:
TensorShape([3, 3])
Mevcut resim için ön hazırlık olarak modeli oluşturalım ve modelin sonucunda ne olacağına bakalım;
#Model oluşturulur
model=Sequential()
#Modele giriş katmanı(input_shape ile) ve Flatten katmanı eklenir
model.add(Flatten(input_shape=(3,3))) #3,3 değeri resim 3x3 olduğu için verildi.
#Modelin özeti
model.summary()
Çıktı:
Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten_1 (Flatten) (None, 9) 0 ================================================================= Total params: 0 Trainable params: 0 Non-trainable params: 0
Katmanların görselleri incelenirse;
plot_model(model,show_shapes=True)
Çıktı:
Özet kısmında ve görselde de görüldüğü gibi Flatten katmanına girmeden 3x3 olan nesne boyutu 9 olarak çıkmış oldu.
Yukarda oluşturulan 3x3'lük resim ilgili model tarafından tahmin edilmiş olsaydı sonucu ne olurdu diye bakalım;
Not: Bu kısımdan sonra yapılan tahminleme işlemi henüz anlatılmadı, sonraki derslerimizde anlatacağız ama Flatten katmanın işlevinin daha iyi görüntülenmesi için son durumdaki resim çıktısına dikkat ediniz.
#Oluşturulan modeli kullanma işlemi
result=model.predict(tf.expand_dims(image,[0]))
result
Çıktı:
array([[15., 20., 25., 30., 35., 40., 45., 50., 55.]], dtype=float32)
3x3 olan resim boyutu 9 elemanlı bir boyuta dönüştü.
Son durumda resim görüntüsü;
plt.imshow(result)
Çıktı:
Flatter katmanı sayesinde resimdeki tüm kareler tek satırda düzleştirilmiş oldu.