Keras ile Model Kaydetme & Yükleme
ModelCheckpoint Callback ile derin öğrenme model ağırlıkları nasıl kaydedilir?
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.
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.