In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

In [ ]:
#@title MIT License
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

Modelleri kaydedelim ve tekrar yükleyelim

Note: Bu dökümanlar TensorFlow gönüllü kullanıcıları tarafından çevirilmiştir. Topluluk tarafından sağlananan çeviriler gönüllülerin ellerinden geldiğince güncellendiği için Resmi İngilizce dökümanlar ile bire bir aynı olmasını garantileyemeyiz. Eğer bu tercümeleri iyileştirmek için önerileriniz var ise lütfen tensorflow/docs havuzuna pull request gönderin. Gönüllü olarak çevirilere katkıda bulunmak için docs-tr@tensorflow.org listesi ile iletişime geçebilirsiniz.

Eğitim sırasında veya sonrasında modelin ilerleyişi kaydedilebilir. Bunun anlamı, modelin kaldığı yerden ilerlemeye devam edebilir olması, ayrıca uzun eğitim sürelerinin önüne geçilebilir olmasıdır. Modellerin kaydedilmesi, aynı zamanda modellerin paylaşılabilmesi ve diğerlerinin yaptığımız çalışmaları tekrardan oluşturabilmeleri anlamına gelmektedir. Çoğu uygulayıcı araştırma modellerini ve tekniklerini yayınladıklarında, aşağıdaki bilgileri paylaşırlar:

  • modeli oluşturan kodu
  • modele ait eğitilmiş ağırlık değerlerini veya parametrelerini

Bu verilerin paylaşılması, diğerlerinin modelimizin nasıl çalıştığını anlamasına ve yeni veriler ile modeli denemelerine yardımcı olur.

Dikkat: Güvenilmeyen kodlar ile ilgili dikkatli olunuz-Tensorflow modelleri kodlardan oluşmaktadır. Detaylar için TensorFlow'un Güvenli Kullanımı linkine göz atınız.

Seçenekler

Kullandığınız API'ye bağlı olarak, Tensorflow modellerini kaydetmenin farklı yolları vardır. Bu eğitim dökümanı, Tensorflowda yapay zeka modellerinin oluşturulması ve eğitilmesinde kullanılan tf.keras 'ı kullanmaktadır. Farklı yöntemler için TensorFlow Kaydet ve Geri Yükle eğitim dökümanına veya eager'da kaydedelim linkine göz atailirsiniz.

Kurulum

Kuralım ve İçeri Alalım

Tensorflow ve bağlı kütüphanelerini kuralım ve içeri alalım:


In [ ]:
!pip install h5py pyyaml

Örnek veri setini alalım

Ağırlıkların nasıl kaydedildiğini gösterebilmek için, modelimizi MNIST dataset verisi ile eğiteceğiz. Süreci hızlandırmak için, sadece ilk 1000 örneği kullanacağız:


In [ ]:
import os

import tensorflow.compat.v1 as tf

from tensorflow import keras

tf.__version__

In [ ]:
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

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

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

Modeli tanımlayalım

Ağırlıkların nasıl kaydedileceğini ve yükleneceğini gösterebilmek için basit bir model oluşturalım.


In [ ]:
# Returns a short sequential model
def create_model():
  model = tf.keras.models.Sequential([
    keras.layers.Dense(512, activation=tf.keras.activations.relu, input_shape=(784,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation=tf.keras.activations.softmax)
  ])
  
  model.compile(optimizer=tf.keras.optimizers.Adam(),
                loss=tf.keras.losses.sparse_categorical_crossentropy,
                metrics=['accuracy'])
  
  return model


# Create a basic model instance
model = create_model()
model.summary()

Eğitim sırasında kontrol noktalarını (checkpoints) kaydedelim

Ana kullanım şekli, eğitim sırasında ve sonunda kontrol noktalarının otomatik olarak kaydedilmesidir. Bu şekilde eğitilmiş modeli tekrar eğitmeye gerek kalmadan kullanabiliriz veya eğitim süreci yarıda kalmışsa kaldığı yerden eğitime devam edebiliriz.

tf.keras.callbacks.ModelCheckpoint bu işlemi yapan callback fonksiyonudur. Bu fonksiyon, kontrol noktalarını yapılandırmak için birkaç parametre değeri alır.

Kontrol noktası callback fonksiyonu kullanımı

Modeli eğitelim ve ModelCheckpoint callback fonksiyonunu modele aktaralım:


In [ ]:
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Create checkpoint callback
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, 
                                                 save_weights_only=True,
                                                 verbose=1)

model = create_model()

model.fit(train_images, train_labels,  epochs = 10, 
          validation_data = (test_images,test_labels),
          callbacks = [cp_callback])  # pass callback to training

# This may generate warnings related to saving the state of the optimizer.
# These warnings (and similar warnings throughout this notebook)
# are in place to discourage outdated usage, and can be ignored.

Bu kod, her bir ephoc sonunda güncellenen, bir grup TensorFlow kontrol noktası dosyası oluşturur:


In [ ]:
!ls {checkpoint_dir}

Eğitilmemiş yeni bir model oluşturalım. Sadece ağırlık değerleri ile bir modeli geri yüklemek istediğimizde, elimizde orjinal model ile aynı yapıyı sahip bir modelimiz olmalıdır. Aynı model yapısına sahip olduğumuz için, farklı zamanlarda oluşmuş model örnekleri arasında ağırlık değerlerini paylaşabiliriz.

Şimdi yeni bir eğitilmemiş model oluşturalım ve bu modeli test veri seti ile değerlendirelim. Eğitilmemiş bir model, şans yüzdesi kadar (~10% doğruluk) doğruluğa sahip olacaktır:


In [ ]:
model = create_model()

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

Sonrasında ağırlık değerlerini kaydettiğimiz kontrol noktasından model geri yükleyelim ve modeli tekrardan değerlendirelim:


In [ ]:
model.load_weights(checkpoint_path)
loss,acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

Kontrol noktası callback seçenekleri:

Callback fonksiyonu, kontrol noktalarının isimlendirilmesi ve frekanslarının ayarlanması için çeşitli seçenekler sunar.

Yeni bir modeli eğitelim ve her 5 epoch'ta bir farklı isimler ile kontrol noktalarını isimlendirelim:


In [ ]:
# include the epoch in the file name. (uses `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(
    checkpoint_path, verbose=1, save_weights_only=True,
    # Save weights, every 5-epochs.
    period=5)

model = create_model()
model.save_weights(checkpoint_path.format(epoch=0))
model.fit(train_images, train_labels,
          epochs = 50, callbacks = [cp_callback],
          validation_data = (test_images,test_labels),
          verbose=0)

Şimdi, oluşan kontrol noktalarına bakalım ve en güncel olanını seçelim:


In [ ]:
! ls {checkpoint_dir}

In [ ]:
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest

Not: Tensorflow varsayılan formatı, sadece en güncel 5 kontrol noktasını kaydeder.

Test için, modeli resetleyelim ve en güncel kontrol noktasını yükleyelim:


In [ ]:
model = create_model()
model.load_weights(latest)
loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

Bu dosyalar nedir?

Yukardaki kod, ağırlık değerlerini bir grup checkpoint- dosyaya binary formatta kaydeder. Kontrol noktası aşağıdakileri kapsar:

  • Modele ait ağırlık değerlerini içeren, bir veya daha fazla dosya parçası (shards).
  • Hangi ağırlık değerinin hangi dosya parçasında olduğunu gösteren bir index dosyası.

Eğer modelinizi tek bir bilgisayarda eğitiyorsanız, son takısı .data-00000-of-00001 olan tek bir dosya parçası oluşacaktır.

Ağırlıkların manuel kaydedilmesi

Yukarıda, ağırlıkların modele nasıl yüklendiğini gördünüz.

Model.save_weights methodunu kullanarak, ağırlıkların manuel olarak kaydedilmeside aynı şeklide kolaydır.


In [ ]:
# Save the weights
model.save_weights('./checkpoints/my_checkpoint')

# Restore the weights
model = create_model()
model.load_weights('./checkpoints/my_checkpoint')

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

Tüm modelin kaydedilmesi

Ağırlık değerleri, model yapısı ve hatta optimize edici parametrelerini (yapılandırmaya bağlı olarak) kapsayan tek bir dosya ile tüm model kaydedilebilir. Bu, orjinal koda ulaşmaya gerek kalmadan, modele ait kontrol noktasını kaydetmeyi ve sonrasında eğitime kalındığı yerden tekrardan başlanmasını sağlar.

Tam-fonksiyonel modelin kaydedilmesi çok faydalıdır, bu modeli TensorFlow.js ye (HDF5, Saved Model) yükleyip sonrasında eğitebilir ve web browserda çalıştırabiliriz. Veya modeli TensorFlow Lite formatına dönüştürerek (HDF5, Saved Model) mobil cihazlarda çalıştırabiliriz.

Modeli HDF5 dosyası olarak kaydedelim

Keras, HDF5 standartını kullanarak, temel bir kayıt formatı sunar. Bizim kullanım amacımıza göre, kayıtlı model tek bir binary blob olarak değerlendirilebilir.


In [ ]:
model = create_model()

model.fit(train_images, train_labels, epochs=5)

# Save entire model to a HDF5 file
model.save('my_model.h5')

Şimdi, bu dosya ile modelimizi tekrardan oluşturalım:


In [ ]:
# Recreate the exact same model, including weights and optimizer.
new_model = keras.models.load_model('my_model.h5')
new_model.summary()

Doğruluğunu kontrol edelim:


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

Bu yöntem modelle ilgili herşeyi kaydeder:

  • Ağırlık değerlerini
  • Model yapısını
  • Optimizer parametrelerini

Keras, modelleri kaydederken model yapılarını inceler ve TensorFlow optimizer'ları (tf.train'dan) kaydetmesi halihazırda mümkün değildir. Bunu kullanırken, modeli yükledikten sonra tekrar derlememiz gerekecektir ve optimizer'ın son durum bilgisini kaybetmiş oluruz.

Modelin saved_model olarak kaydedilmesi

Dikkat: tf.keras modellerinin bu yöntemle kaydedilmesi deneysel olup, gelecek versiyonlarda değişiklik gösterebilir.

Yeni ir model oluşturalım:


In [ ]:
model = create_model()

model.fit(train_images, train_labels, epochs=5)

saved_model oluşturalım:


In [ ]:
saved_model_path = tf.contrib.saved_model.save_keras_model(model, "./saved_models")

Kaydedilmiş modeller zaman bilgisini içeren klasörler içerisine oluşturulur:


In [ ]:
!ls saved_models/

Kaydedilmiş modeli kullanarak yeni bir keras modelini yükleyelim.


In [ ]:
new_model = tf.contrib.saved_model.load_keras_model(saved_model_path)
new_model.summary()

Yeniden yüklenmiş modeli çalıştıralım.


In [ ]:
# The model has to be compiled before evaluating.
# This step is not required if the saved model is only being deployed.

new_model.compile(optimizer=tf.keras.optimizers.Adam(), 
              loss=tf.keras.losses.sparse_categorical_crossentropy,
              metrics=['accuracy'])

# Evaluate the restored model.
loss, acc = new_model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

Sırada ne var?

Bu yardımcı döküman, tf.keras ile modellerin kaydedilmesi ve yüklenmesini içeren temel bilgiler sunar.

  • tf.keras guide modellerin tf.keras ile kaydedilip yüklenmesiyle ilgili daha fazla bilgi içerir.

  • Eager çalışma sırasında modellerin kaydedilmesiyle ilgi bilgi için Saving in eager linkine göz atabilirsiniz.

  • Save and Restore ise TensorFlow'da modellerin kaydedilmesiyle ilgili düşük-seviye detay bilgileri içerir.