Derin Öğrenme (Deep Learning) - Keras Modeli Derleme İşlemleri

Fit Method (Öğrenme Yöntemi)

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

Fit Method (Öğrenme Yöntemi), Keras kullanılarak oluşturulan modellerden veri setini öğrenmek için kullanılan yöntemdir.

Söz dizimi: Model.fit(x=None, y=None, batch_size=None, epochs=1, verbose="auto", callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_batch_size=None, validation_freq=1, max_queue_size=10, workers=1, use_multiprocessing=False)

  • x, veri seti üzerindeki x_train (bağımsız değişkenler) verilerini temsil eder.
  • y, veri seti üzerindeki y_train (hedef değerlerini) temsil eder.
  • batch_size, yapılacak işin boyutunu temsil eder. Pozitif tam sayı olarak atama yapılabilir. Varsayılan olarak 32 değerini alır.
  • epochs, modeli eğitmek için kullanılan dönem sayısını temsil eder. Pozitif tam sayı olarak atama yapılabilir. Varsayılan olarak 1 değerini alır.
  • verbose, model eğitimi sırasında ekranda görünecek olan ayrıntıları temsil eder. "auto",0,1 veya 2 değelerini alabilir. Varsayılan olarak "auto"dur. 
    • 0, ayrıntı görünmeyeceğini gösterir. Örnek olarak;

    • 1, ilerleme çubuğunu gösterir. Örnek olarak;

    • 2, her dönem başına(epochs sayısı) bir satır olacak şekilde gösterim yapar. Örnek olarak;

    • auto, çoğu durumda 1 olarak işlem görür.
  • callbacks,  model eğitimi (fit) ve tahminleme(predict) yaşam döngüsünün çeşitli aşamalarına bağlanmak için kullanılır.
  • validation_split, test ve train verilerini ayırmak için kullanılır. 0-1 aralığında değer alabilir.
    • Veri setini ayırma işlemini son satırdan başlayarak sırayla yapmaktadır. Örneğin 0.2 olarak seçildiğinde son satırların %20'sini test verileri olarak alır.
    • Temel anlamda makine öğrenmesi konularında öğrenilen train_test_split fonksiyonuyla aynı işlemi yapmaktadır ama train_test_split işleminde test verileri için son satırları değil rasgele olarak veri seti değerlerinin %20'sini almaktadır.
  • validation_data, test edilecek x_test ve y_test verilerini temsil etmektedir. Eğer validation_data değeri boş bırakılmazsa validation_split değeri geçersiz bırakılacaktır. Kullanımı örnek olarak; validation_data=(x_test,y_test) şeklindedir.
  • shuffle, eğitim için ayrılan verilerin her dönemde(epoch) kendi içersinde karıştırılıp karıştırılmayacağını temsil etmektedir. Varsayılan olarak "True" değerini almaktadır.

Örnek-1: Bazı kişilerin diyabet hastalığına yakalanıp yakalanmama bilgilerini içeren "pima-indians-diabetes.csv" veri seti ile kişinin diyabet hastası olup olamayacağını gösterecek olan bir model oluşturaralım, modeli derleyelim ve modele veri setini öğrenme yöntemini uygulayalım. (Compile Method (Derleme Yöntemi) örneğinde verilen veri setinin devamını sağlayalım.)

#İlgili kütüphaneler yüklenir
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense 
#Veri seti okundu
df=pd.read_csv("pima-indians-diabetes.csv",header=None)

#Veri setinde sütun isimleri belirli olmadığından dolayı sütun isimleri ataması yapılır.
df.columns=["preg","plass","press","skin","test","mass","pedi","age","class"]
#İlk 5 satır
df.head()

Çıktı:

#x ve y(hedef-tahmin) değerleri belirtilir.
x,y=df.drop("class",axis=1),df[["class"]]

#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=42,test_size=.2)

#Train veri setindeki değişken sayısı
n_cols=x.shape[1]

Veri seti değişken sayısı da göz önüne alınarak bir model oluşturuldu. Model bir giriş katmanı, 3 gizli katman ve 1 tane de çıkış katmanından oluşmaktadır. Gizli katman sayısı duruma göre artırılıp azaltılabilir.

#Model oluşturulur.
model=Sequential()

#Giriş Katmanı ve 1.Gizli Katman oluşturulur.
model.add(Dense(units=12,activation="relu",input_shape=(n_cols,)))

#2.Gizli Katman oluşturulur.
model.add(Dense(units=8,activation="relu"))

#3.Gizli Katman oluşturulur.
model.add(Dense(units=4,activation="relu"))

#Çıkış Katmanı
model.add(Dense(units=1,activation="sigmoid"))
#Model özeti
model.summary()

Çıktı:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 12)                108       
                                                                 
 dense_1 (Dense)             (None, 8)                 104       
                                                                 
 dense_2 (Dense)             (None, 4)                 36        
                                                                 
 dense_3 (Dense)             (None, 1)                 5         
                                                                 
=================================================================
Total params: 253
Trainable params: 253
Non-trainable params: 0
#Model derleme işlemi yapılır
model.compile(loss='binary_crossentropy',optimizer="adam",metrics=["accuracy"])

Model derlendikten sonra derin öğrenme yapabilmek için modeli veri setindeki x_train ve y_train verileri ile eğitip, x_test ve y_test verileri ile başarı seviyesini "accuary" değeri ile değerlendirelim. 

#Model Öğrenme işlemi yapılır.
model.fit(
    x=x_train,
    y=y_train,
    epochs=10,
    batch_size=20,
    verbose=2,
    validation_data=(x_test,y_test)
)

 Çıktı:

Epoch 1/10
31/31 - 1s - loss: 1.7484 - accuracy: 0.5798 - val_loss: 1.2313 - val_accuracy: 0.5000 - 674ms/epoch - 22ms/step
Epoch 2/10
31/31 - 0s - loss: 0.9181 - accuracy: 0.5228 - val_loss: 0.8313 - val_accuracy: 0.4545 - 56ms/epoch - 2ms/step
Epoch 3/10
31/31 - 0s - loss: 0.7283 - accuracy: 0.4707 - val_loss: 0.7109 - val_accuracy: 0.4221 - 49ms/epoch - 2ms/step
Epoch 4/10
31/31 - 0s - loss: 0.6831 - accuracy: 0.4886 - val_loss: 0.6795 - val_accuracy: 0.6429 - 56ms/epoch - 2ms/step
Epoch 5/10
31/31 - 0s - loss: 0.6673 - accuracy: 0.6564 - val_loss: 0.6710 - val_accuracy: 0.6429 - 55ms/epoch - 2ms/step
Epoch 6/10
31/31 - 0s - loss: 0.6534 - accuracy: 0.6531 - val_loss: 0.6597 - val_accuracy: 0.6429 - 52ms/epoch - 2ms/step
Epoch 7/10
31/31 - 0s - loss: 0.6411 - accuracy: 0.6531 - val_loss: 0.6539 - val_accuracy: 0.6429 - 53ms/epoch - 2ms/step
Epoch 8/10
31/31 - 0s - loss: 0.6376 - accuracy: 0.6531 - val_loss: 0.6508 - val_accuracy: 0.6429 - 58ms/epoch - 2ms/step
Epoch 9/10
31/31 - 0s - loss: 0.6360 - accuracy: 0.6531 - val_loss: 0.6502 - val_accuracy: 0.6429 - 50ms/epoch - 2ms/step
Epoch 10/10
31/31 - 0s - loss: 0.6321 - accuracy: 0.6531 - val_loss: 0.6498 - val_accuracy: 0.6429 - 59ms/epoch - 2ms/step

Öğrenme işlemi sonucunda;

  • Verbose değeri 2 olarak ayarlandığından çıktı detaylandırılmıştır.
  • Epochs değeri(dönem sayısı) 10 olarak seçildiğinden 10 defa değerlendirilme işlemi yapmış ve sonuçları yansıtmıştır. (Epoch 1/10, Epoch 2/10....)
  • Loss(kayıp) değerlerinin öğrenme işlemi tekrarlandında azaldığına dikkat ediniz. Epochs değeri daha yüksek seçilirse loss değeri daha da düşecek gibi görünmektedir.
  • Model derleme sırasında başarı değerlendirmesi için seçilen "accuracy" değeri her epoch değerinde oluşmuş ve o da öğrenme işlemi her tekraralandığında artma veya sabit kalma eğiliminde olmuştur. Epochs değeri daha yüksek seçilirse accuracy değeri daha da yükselecek gibi görünmektedir.
  • validation_data değerleri öğrenme işleminde verildiği için "val_loss" ve "val_accuracy" değerleri de oluşmuştur. Bu değerler test verilerinin "accuracy" değerleridir. Verilmediği zaman bu değerler oluşmayacaktır.
  • 674ms/epoch ile başlayan sütunda da her epoch aşamasının ne kadar sürede oluştuğunu göstermektedir. Bu değerlerde bilgisayar gücüne göre farklılıklar olacaktır.

Model öğrenme işlemi sonrasında oluşan train verileri sonucunda oluşan "loss" ve "accuracy" değerleri ile, test verileri sonrasında oluşan "val_loss" ve "val_accuracy" değerlerinin birbirine benzer olup olmadığı konusunda grafik oluşturarak karşılaştırma işlemi yapalım. Bunun için ilk önce "model.history.history" komutu ile yukarıda yazan değerleri bir sözlük içerisinde liste halinde bize sunmaktadır, onları gözlemleyelim.

model.history.history

Çıktı:

{'loss': [1.7484434843063354,
  0.9181123971939087,
  0.7283371090888977,
  0.6830683350563049,
  0.6672510504722595,
  0.6533622741699219,
  0.6411458849906921,
  0.637586236000061,
  0.6360210180282593,
  0.6320714950561523],
 'accuracy': [0.579804539680481,
  0.5228012800216675,
  0.4706840515136719,
  0.48859935998916626,
  0.6563518047332764,
  0.653094470500946,
  0.653094470500946,
  0.653094470500946,
  0.653094470500946,
  0.653094470500946],
 'val_loss': [1.2312514781951904,
  0.8312508463859558,
  0.7109328508377075,
  0.6795305609703064,
  0.6710190176963806,
  0.6596686244010925,
  0.6538914442062378,
  0.6508499979972839,
  0.650152862071991,
  0.6498218178749084],
 'val_accuracy': [0.5,
  0.4545454680919647,
  0.4220779240131378,
  0.6428571343421936,
  0.6428571343421936,
  0.6428571343421936,
  0.6428571343421936,
  0.6428571343421936,
  0.6428571343421936,
  0.6428571343421936]}

Elimizde bir liste olduğundan dolayı karşılaştırma işlemini grafiksel olarak gösterme işlemine geçilebilir.

import matplotlib.pyplot as plt

fig=plt.figure(figsize=(20,6))

#Accuracy Grafiklemesi
x1=fig.add_subplot(121)
x1.plot(model.history.history['accuracy'])
x1.plot(model.history.history['val_accuracy'])
x1.set_title('Model accuracy')
x1.set_ylabel('Accuracy')
x1.set_xlabel('Epoch')
x1.legend(['Train', 'Test'], loc='upper left')

#Loss Grafiklemesi
x2=fig.add_subplot(122)
x2.plot(model.history.history['loss'])
x2.plot(model.history.history['val_loss'])
x2.set_title('Model loss')
x2.set_ylabel('Loss')
x2.set_xlabel('Epoch')
x2.legend(['Train', 'Test'], loc='upper left')

plt.show()

Çıktı:

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.