Keras ile Model Kaydetme & Yükleme

ModelCheckpoint Callback ile derin öğrenme model ağırlıkları nasıl kaydedilir?

Tirendaz Akademi
5 min readApr 15, 2023
Kaynak: Freepik

Bildiğiniz gibi derin öğrenme modellerinin eğitimi uzun zaman alır. İsterseniz, modeli eğitim esnasında ya da eğitim bittikten sonra kaydedebilirsiniz.

Bu blog yazısında Keras ile modelinizi nasıl kaydedeceğinizi ve kaydedilen modeli nasıl yükleyeceğinizi adım adım göstereceğim. Ayrıca model eğitiminde çok sık kullanılan ModelCheckpoint callbacki anlatacağım.

Veri Setini Yükleme

Model kaydetmeyi göstermek için MNIST veri setini kullanalım. Bu veri seti rakamların görüntülerinden oluşur.

MNIST dataset

MNSIT veri setini yüklemek için öncelikle TensorFlow ve Keras’ı import edelim.

import tensorflow as tf
from tensorflow import keras

Şimdi Keras’ı kullanarak eğitim ve test veri setlerini yükleyelim. Bunun için load_data metodunu kullanalım.

(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

Eğitim girdi ve çıktı veri setleri 60,000 örneklemden ve test girdi ve çıktı veri setleri 10,000 örneklemden oluşuyor.

Veri Ön İşleme

Veri analizinin en önemli adımlarından biri veri ön işlemedir. Derin öğrenmede, normalleştirme ve regülerleştirme gibi bazı veri ön işleme teknikleri modelin performansını attırır.

Öncelikle kodları daha hızlı çalıştırmak için bu veri setlerinden ilk 1000 örneği alalım. İlk olarak çıktı değişkenleri için bunu yapalım.

train_labels = train_labels[:1000]
test_labels = test_labels[:1000]

Aynı şeyleri eğitim verileri için de yapalım. Veri örnekleri rakam resimlerinden oluşuyor. Bu resimler iki boyutlu. Bu verileri modele vermeden önce reshape metodu ile bir boyuta çevirelim. Ayrıca hem modelin performansını arttırmak hem de eğitimlerin daha hızlı olması için verileri normalleştirelim.

train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0

Tamam, veri setlerimizi modele uygun hale getirdik. Hadi devam edelim ve model kurma aşamasına geçelim.

Model Kurma

Keras’da model kurmak için en kolay yöntem Sequential tekniğinidir. Bu teknik ile katmanlar art arda sıralanır. Sequnetial tekniğini daha ayrıntılı öğrenmek için aşağıdaki yazıyı inceleyebilirsiniz.

Kodlarımızın daha derli toplu olması için modelimizi bir fonksiyon içinde tanımlayalım.

def create_model():
model = tf.keras.Sequential([
keras.layers.Dense(512, activation='relu',input_shape=(784,)),
keras.layers.Dropout(0.2),
keras.layers.Dense(10)
])

model.compile(
optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]
)
return model

Harika, basit bir Sequential model tanımladık. Şimdi bu fonksiyondan model isminde bir örnek obje alalım.

model = create_model()

Şimdi modelimizin mimarisini summary metodu ile görelim.

model.summary()

Gördüğünüz gibi modelimiz bir girdi, bir regülerleştirme ve bir çıktı katmanından oluşuyor.

ModelCheckpoint Callback ile Model Ağırlıklarını Kaydetme

Eğittiğiniz bir modeli tekrar kullanmak için veya eğitim sürecinin kesintiye uğraması durumunda eğitime kaldığınız yerden devam etmek için modelinizi kaydedebilirsiniz.

Bildiğiniz gibi bir modeli eğitmek demek aslında modelin parametre denen ağırlıklarını kaydetmek demektir.ModelCheckpoint callback ile model eğitimi esnasında modelin ağırlıklarını kaydedebilirsiniz. Bunu göstermek için bu callbackten bir örnek alalım.

Öncelikle os modülü ile modelin kaydedileceği dizini oluşturalım.

import os
checkpoint_path = "training_1/my_checkpoints"
checkpoint_dir = os.path.dirname(checkpoint_path)

Tamam, dizinimizi oluşturduk. Şimdi modelin ağırlıklarını kaydetmek için bir callback oluşturalım.

checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
# Modelin sadece ağırlıklarını kaydedelim
save_weights_only=True)

Harika, callbackimizi oluşturduk. Şimdi fit metodunu çağıralım ve callbackimizi bu metoda geçirelim.

model.fit(train_images, 
train_labels,
epochs=10,
validation_data=(test_images, test_labels),
callbacks=[checkpoint_cb])

Böylece model ağırlıklarını dizinimize kaydettik. Kullandığımız callback, her epoch sonunda checkpoint dosyalarını günceller. Hadi eğitim sonunda dizinde yer alan dosyalara bakalım.

os.listdir(checkpoint_dir)

# Output
['my_checkpoints.index', 'my_checkpoints.data-00000-of-00001', 'checkpoint']

Dizinde kaydedilen dosyalar karşımıza geldi.

Ağırlıkları Model Yükleme

Bu ağırlıkları bir modele yükleyebiliriz. Unutmayın, kaydedilen ağırlıkları sadece aynı mimariye sahip modeller için kullanabilirsiniz.

Hadi bunu göstermek için sıfırdan bir model örneği alalım.

model = create_model()

Bu modelin katsayılarını henüz eğitmedik. Bu katsayılar rasgele oluşturuldu. Şimdi evaluate metodu ile bu eğitilmemiş modelin test verileri üzerindeki doğruluk skoruna bakalım.

loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Untrained model, accuracy: {100 * acc:5.2f}%")

# Output:
Untrained model, accuracy: 10.70%

Gördüğünüz gibi eğitilmemiş modelin test verileri üzerindeki doğruluğu yaklaşık yüzde 10. Bu oldukça kötü bir skor.

Şimdi daha önce kaydettiğimiz ağırlıkları load_weights metodu ile modele yükleyelim ve bu modelin test verileri üzerindeki doğruluk skoruna bakalım.

model.load_weights(checkpoint_path)

Tamam, kaydettiğimiz ağırlıkları modele yükledik. Şimdi modeli tekrar test edelim.

loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Untrained model, accuracy: {100 * acc:5.2f}%")

#Output:
Untrained model, accuracy: 87.40%

Gördüğünüz gibi modelin doğruluğu yüzde 90'lara yaklaştı.

Bu bölümde model ağırlıklarının nasıl kaydedileceğini ve bu ağırlıkların nasıl yükleneceğini gördük. Şimdi devam edelim ve tüm modeli nasıl kaydedeceğimize bakalım.

Tüm Modeli Kaydetme

Modelinizi canlıya almak için kaydetmeniz gerekir. Tek bir dosyada modelin mimarisini, ağırlıklarını ve eğitim konfigürasyonunu kaydetmek için save metodunu kullanabiliriz.

Modelinizi, SaveModel ve HDF5 şeklinde iki farklı formatta kaydedebilirsiniz. Unutmayın, Keras'daSavedModel formatı ön tanımlı olarak kullanılır.

Hadi son modelimizi kaydedelim. Bunun için bir dizin oluşturalım.

mkdir saved_model

Şimdi bu dosyanın içine modelimizi kaydedelim.

model.save('saved_model/my_model')

Güzel, modelimizi kaydettik. Hadi bu dizin içindeki dosyalara bakalım.

ls saved_model/my_model

# Output:
assets fingerprint.pb keras_metadata.pb saved_model.pb variables

Modeli canlıya almak için modelin kaynak kodlarına gerek yok. Deploy için SavedModel yeterlidir. Hadi bu dosyalara yakından bakalım.

saved_model.pb dosyası, modelin mimarisini ve hesaplama grafiklerini içerir.

keras_metadata.pb dosyasında, Keras tarafından gerekli ekstra bilgiler vardır.

variables alt dizini, ağırlık ve bias gibi parametre değerlerini içerir.

assets alt dizini, özniteliklerin ve sınıfların isimleri gibi ekstra dosyaları içerir.

Harika, modeli nasıl kaydedeceğimizi gördük. Şimdi model yükleme nasıl yapılır bakalım.

Model Yükleme

Kaydettiğiniz modeli load_model metodu ile yükleyebilirsiniz. Bunu yapmak için öncelikle model mimarisini oluşturalım ve daha sonra modeli yükleyelim.

new_model = create_model()
new_model = tf.keras.models.load_model('saved_model/my_model')

Tamam, modeli yükledik. Hadi bu modelin mimarisine bakalım.

new_model.summary()

Bu modelin, orijinal modeldeki aynı argümanlar ile compile edildiğini unutmayın. Hadi bu modelin test verileri üzerindeki doğruluğuna bakalım.

loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print(f'Restored model, accuracy: {100 * acc:5.2f}%')

# Output:
Restored model, accuracy: 87.40%

Gördüğünüz gibi yüklediğimiz modelin test verileri üzerindeki doğruluk skoru, yüzde 87.

Modeli, h5 formatında da kaydedebilirsiniz. Fakat çoğu TensorFlow deployment aracı, SavedModel formatını ister.

Son Sözler

Bu blog yazısında, derin öğrenme modelleri nasıl kaydedilir ve nasıl yüklenir konularını işledik. İlk olarak ModelCheckpoint callback ile model ağırlıklarının kaydetmeyi gördük. Daha sonra modeli deploy etmek için tüm modeli kaydetmeyi ve yüklemeyi inceledik.

Bu yazının daha ayrıntılı videosunu, YouTube kanalımızdaki katılda veya Udemy kursumuzda bulabilirsiniz.

Yazıyı okuduğunuz için teşekkür ederim. Herhangi bir sorunuz varsa yorumlara yazabilirsiniz. Bu derste kullandığım notebookun linkine buradan ulaşabilirsiniz.

Hadi bağlanalım: YouTube | Udemy | Twitter | Instagram | LinkedIn.

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

Yazıyı beğendiyseniz alttaki alkış butonuna bir kaç defa basmayı unutmayın.

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

--

--