AI & Machine Learning
TensorFlow ile Model Eğitimi: Veri Hazırlama, Eğitim ve Değerlendirme
TensorFlow ve Keras, derin öğrenme modellerinin geliştirilmesi, eğitilmesi ve dağıtılması için endüstri standardı araçlardır. Veri ön işlemeden hiperparametre optimizasyonuna kadar tüm eğitim sürecini yönetmek, başarılı bir yapay zeka projesi için kritik öneme sahiptir. Bu yazıda model eğitiminin her aşamasını detaylı kod örnekleriyle inceleyeceğiz.
Veri Pipeline Oluşturma
tf.data ile Verimli Veri Yükleme
Büyük veri setleriyle çalışırken verinin GPU'ya verimli beslenmesi performans açısından kritiktir. tf.data API'si bu işi optimize eder:
import tensorflow as tf
import numpy as np
# Veri yükleme fonksiyonu
def veri_yukle_ve_isle(goruntu_yolu, etiket):
"""Görüntüyü diskten yükle ve ön işle."""
goruntu = tf.io.read_file(goruntu_yolu)
goruntu = tf.image.decode_jpeg(goruntu, channels=3)
goruntu = tf.image.resize(goruntu, [224, 224])
goruntu = tf.cast(goruntu, tf.float32) / 255.0
# ImageNet ortalamasıyla normalize et
ortalama = tf.constant([0.485, 0.456, 0.406])
std = tf.constant([0.229, 0.224, 0.225])
goruntu = (goruntu - ortalama) / std
return goruntu, etiket
# Veri artırma fonksiyonu
def veri_artir(goruntu, etiket):
"""Eğitim verisi için rastgele dönüşümler uygula."""
goruntu = tf.image.random_flip_left_right(goruntu)
goruntu = tf.image.random_brightness(goruntu, 0.2)
goruntu = tf.image.random_contrast(goruntu, 0.8, 1.2)
goruntu = tf.image.random_saturation(goruntu, 0.8, 1.2)
return goruntu, etiket
# Performanslı veri pipeline'ı
def pipeline_olustur(dosya_yollari, etiketler, batch_boyutu=32, egitim=True):
"""Optimize edilmiş tf.data pipeline'ı oluştur."""
ds = tf.data.Dataset.from_tensor_slices((dosya_yollari, etiketler))
if egitim:
ds = ds.shuffle(buffer_size=10000, seed=42)
ds = ds.map(veri_yukle_ve_isle, num_parallel_calls=tf.data.AUTOTUNE)
if egitim:
ds = ds.map(veri_artir, num_parallel_calls=tf.data.AUTOTUNE)
ds = ds.batch(batch_boyutu)
ds = ds.prefetch(tf.data.AUTOTUNE)
return dsModel Oluşturma ve Derleme
Keras Functional API ile Model Tanımlama
Karmaşık mimariler için Functional API daha esnek bir yapı sunar:
from tensorflow.keras import layers, models, optimizers
def model_olustur(sinif_sayisi, ogrenme_hizi=0.001):
"""Transfer learning tabanlı sınıflandırma modeli oluştur."""
# Önceden eğitilmiş backbone
backbone = tf.keras.applications.EfficientNetV2S(
include_top=False,
weights='imagenet',
input_shape=(224, 224, 3)
)
backbone.trainable = False # Backbone'u dondur
# Model mimarisi
girdiler = layers.Input(shape=(224, 224, 3))
x = backbone(girdiler, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.BatchNormalization()(x)
x = layers.Dense(512, activation='relu')(x)
x = layers.Dropout(0.4)(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.3)(x)
ciktilar = layers.Dense(sinif_sayisi, activation='softmax')(x)
model = models.Model(inputs=girdiler, outputs=ciktilar)
# Model derleme
model.compile(
optimizer=optimizers.Adam(learning_rate=ogrenme_hizi),
loss='sparse_categorical_crossentropy',
metrics=[
'accuracy',
tf.keras.metrics.TopKCategoricalAccuracy(k=5, name='top5_accuracy')
]
)
return model
model = model_olustur(sinif_sayisi=100)
model.summary()Callback'ler ile Eğitim Kontrolü
Keras callback'leri, eğitim sürecini otomatik olarak yönetmek için güçlü araçlardır:
import os
from datetime import datetime
# Log dizini
log_dizini = os.path.join("logs", datetime.now().strftime("%Y%m%d-%H%M%S"))
# Callback listesi
callbacks = [
# Erken durdurma: val_loss 7 epoch boyunca iyileşmezse dur
tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=7,
restore_best_weights=True,
verbose=1
),
# Öğrenme hızı azaltma: val_loss 3 epoch iyileşmezse yarıya indir
tf.keras.callbacks.ReduceLROnPlateau(
monitor='val_loss',
factor=0.5,
patience=3,
min_lr=1e-7,
verbose=1
),
# En iyi modeli kaydet
tf.keras.callbacks.ModelCheckpoint(
filepath='en_iyi_model.keras',
monitor='val_accuracy',
save_best_only=True,
verbose=1
),
# TensorBoard logları
tf.keras.callbacks.TensorBoard(
log_dir=log_dizini,
histogram_freq=1,
write_graph=True
),
# CSV log
tf.keras.callbacks.CSVLogger('egitim_log.csv')
]Eğitim Döngüsü
İki Aşamalı Eğitim Stratejisi
Transfer learning projelerinde yaygın bir strateji, önce sadece üst katmanları eğitmek, ardından fine-tuning yapmaktır:
# Aşama 1: Sadece sınıflandırma katmanlarını eğit
print("Aşama 1: Sınıflandırma katmanları eğitimi")
gecmis_1 = model.fit(
egitim_ds,
epochs=20,
validation_data=dogrulama_ds,
callbacks=callbacks,
verbose=1
)
# Aşama 2: Fine-tuning — backbone'un son katmanlarını aç
print("\nAşama 2: Fine-tuning")
backbone = model.layers[1]
backbone.trainable = True
# Son 30 katman hariç tümünü dondur
for layer in backbone.layers[:-30]:
layer.trainable = False
# Düşük öğrenme hızıyla yeniden derle
model.compile(
optimizer=optimizers.Adam(learning_rate=1e-5),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
gecmis_2 = model.fit(
egitim_ds,
epochs=30,
validation_data=dogrulama_ds,
callbacks=callbacks,
verbose=1
)Özel Eğitim Döngüsü (Custom Training Loop)
Keras'ın model.fit() yöntemi çoğu durumda yeterlidir, ancak bazı senaryolarda eğitim döngüsü üzerinde tam kontrol gerekir. Özel eğitim döngüleri, GAN'ler, meta-öğrenme ve araştırma projeleri gibi standart dışı eğitim prosedürleri için idealdir. tf.GradientTape bu kontrolü sağlar.
GradientTape, ileri geçiş sırasında yapılan işlemleri kaydeder ve ardından bu kayıtları kullanarak gradyanları otomatik olarak hesaplar. Bu mekanizma, herhangi bir TensorFlow işleminin türevini alabilmenizi sağlar.
# Özel eğitim döngüsü
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
kayip_fn = tf.keras.losses.SparseCategoricalCrossentropy()
egitim_dogruluk = tf.keras.metrics.SparseCategoricalAccuracy()
dogrulama_dogruluk = tf.keras.metrics.SparseCategoricalAccuracy()
@tf.function # Performans için grafik moduna derle
def egitim_adimi(goruntuler, etiketler):
"""Tek bir eğitim adımı."""
with tf.GradientTape() as tape:
tahminler = model(goruntuler, training=True)
kayip = kayip_fn(etiketler, tahminler)
# L2 regularizasyon kaybını ekle
toplam_kayip = kayip + tf.add_n(model.losses) if model.losses else kayip
# Gradyanları hesapla ve uygula
gradyanlar = tape.gradient(toplam_kayip, model.trainable_variables)
# Gradyan kırpma (gradient clipping) ile kararsızlığı önle
gradyanlar = [tf.clip_by_norm(g, 1.0) for g in gradyanlar]
optimizer.apply_gradients(zip(gradyanlar, model.trainable_variables))
egitim_dogruluk.update_state(etiketler, tahminler)
return toplam_kayip
@tf.function
def dogrulama_adimi(goruntuler, etiketler):
"""Tek bir doğrulama adımı."""
tahminler = model(goruntuler, training=False)
kayip = kayip_fn(etiketler, tahminler)
dogrulama_dogruluk.update_state(etiketler, tahminler)
return kayip
# Eğitim döngüsü
EPOCH_SAYISI = 30
en_iyi_dogruluk = 0.0
for epoch in range(EPOCH_SAYISI):
egitim_dogruluk.reset_state()
dogrulama_dogruluk.reset_state()
# Eğitim
for batch_goruntuler, batch_etiketler in egitim_ds:
kayip = egitim_adimi(batch_goruntuler, batch_etiketler)
# Doğrulama
for batch_goruntuler, batch_etiketler in dogrulama_ds:
dogrulama_adimi(batch_goruntuler, batch_etiketler)
print(f"Epoch {epoch+1}/{EPOCH_SAYISI} - "
f"Eğitim Doğruluk: {egitim_dogruluk.result():.4f} - "
f"Doğrulama Doğruluk: {dogrulama_dogruluk.result():.4f}")
# En iyi modeli kaydet
if dogrulama_dogruluk.result() > en_iyi_dogruluk:
en_iyi_dogruluk = dogrulama_dogruluk.result()
model.save_weights('en_iyi_agirliklar.weights.h5')Karışık Hassasiyetli Eğitim (Mixed Precision Training)
Karışık hassasiyetli eğitim, hesaplamaların bir kısmını FP16 (yarı hassasiyet) ile yaparak eğitim hızını önemli ölçüde artırır. Modern GPU'lar (NVIDIA Tensor Core destekli) FP16 işlemlerini FP32'ye göre çok daha hızlı gerçekleştirir. Bu teknik, bellek kullanımını da azaltarak daha büyük batch boyutları ile çalışmayı mümkün kılar.
Önemli nokta, gradyanların ve model ağırlıklarının hala FP32'de tutulmasıdır; yalnızca ileri ve geri geçiş hesaplamaları FP16'da yapılır. TensorFlow bu geçişleri otomatik olarak yönetir.
# Karışık hassasiyetli eğitimi etkinleştir
tf.keras.mixed_precision.set_global_policy('mixed_float16')
# Model oluştururken son katmana dikkat: softmax FP32 olmalı
girdiler = layers.Input(shape=(224, 224, 3))
x = backbone(girdiler, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(512, activation='relu')(x)
x = layers.Dropout(0.4)(x)
# Son katmanı FP32'de tut (sayısal kararlılık için)
ciktilar = layers.Dense(sinif_sayisi, activation='softmax', dtype='float32')(x)
model_mp = models.Model(inputs=girdiler, outputs=ciktilar)
# Optimizer'ı loss scaling ile kullan
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
model_mp.compile(
optimizer=optimizer,
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
print(f"Hesaplama politikası: {tf.keras.mixed_precision.global_policy()}")Değerlendirme ve Analiz
Model Performansını Görselleştirme
import matplotlib.pyplot as plt
def egitim_grafikleri(gecmis):
"""Eğitim ve doğrulama metriklerini çiz."""
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Doğruluk grafiği
axes[0].plot(gecmis.history['accuracy'], label='Eğitim')
axes[0].plot(gecmis.history['val_accuracy'], label='Doğrulama')
axes[0].set_title('Model Doğruluğu')
axes[0].set_xlabel('Epoch')
axes[0].set_ylabel('Doğruluk')
axes[0].legend()
axes[0].grid(True)
# Kayıp grafiği
axes[1].plot(gecmis.history['loss'], label='Eğitim')
axes[1].plot(gecmis.history['val_loss'], label='Doğrulama')
axes[1].set_title('Model Kaybı')
axes[1].set_xlabel('Epoch')
axes[1].set_ylabel('Kayıp')
axes[1].legend()
axes[1].grid(True)
plt.tight_layout()
plt.savefig('egitim_grafikleri.png', dpi=150)
plt.show()Hiperparametre Optimizasyonu
Başarılı bir model eğitimi için kritik hiperparametreler:
- Öğrenme Hızı (Learning Rate): En önemli hiperparametre. Çok yüksek = ıraksama, çok düşük = yavaş yakınsama
- Batch Size: Büyük batch = stabil gradyan ama daha fazla bellek. Tipik değerler: 16, 32, 64
- Epoch Sayısı: Early stopping ile otomatik belirleme önerilir
- Optimizer: Adam çoğu durumda iyi çalışır; SGD + momentum ince ayar için tercih edilir
- Weight Decay: L2 regularizasyon için 1e-4 ile 1e-2 arası denenebilir
- Dropout Oranı: Genellikle 0.2-0.5 arası
TensorBoard ile İzleme
TensorBoard, eğitim sürecini gerçek zamanlı izlemek için güçlü bir görselleştirme aracıdır:
tensorboard --logdir logs --port 6006TensorBoard ile izlenebilecekler:
- Eğitim ve doğrulama metrikleri (kayıp, doğruluk)
- Katman ağırlık dağılımları ve histogramları
- Model grafik yapısı
- Öğrenme hızı değişimleri
- Embedding görselleştirmeleri
Mobil Cihazlar için Model Kuantizasyonu (TFLite)
Eğitilmiş modelleri mobil cihazlarda veya gömülü sistemlerde çalıştırmak için model boyutunu küçültmek ve çıkarım hızını artırmak gerekir. TensorFlow Lite (TFLite), bu amaçla model kuantizasyonu sunar. Kuantizasyon, model ağırlıklarını 32-bit kayan noktadan 8-bit tam sayıya dönüştürerek model boyutunu yaklaşık 4 kat küçültür ve çıkarım hızını önemli ölçüde artırır.
Farklı kuantizasyon stratejileri farklı seviyelerde hız-doğruluk dengesi sunar. Dinamik aralık kuantizasyonu en kolay uygulanandır ve çoğu durumda iyi sonuç verir. Tam tam sayı kuantizasyonu (full integer quantization) ise en yüksek hızı sağlar, ancak kalibrasyon verisi gerektirir.
# Keras formatında kaydetme
model.save('son_model.keras')
# TensorFlow SavedModel formatında kaydetme (serving için)
model.save('saved_model/my_model')
# TFLite'a dönüştürme — dinamik aralık kuantizasyonu
converter = tf.lite.TFLiteConverter.from_saved_model('saved_model/my_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
# Tam tam sayı kuantizasyonu (full integer quantization)
def temsilci_veri_seti():
"""Kalibrasyon için temsili veri seti üret."""
for i in range(100):
veri = np.random.rand(1, 224, 224, 3).astype(np.float32)
yield [veri]
converter_int8 = tf.lite.TFLiteConverter.from_saved_model('saved_model/my_model')
converter_int8.optimizations = [tf.lite.Optimize.DEFAULT]
converter_int8.representative_dataset = temsilci_veri_seti
converter_int8.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter_int8.inference_input_type = tf.uint8
converter_int8.inference_output_type = tf.uint8
tflite_int8_model = converter_int8.convert()
with open('model_int8.tflite', 'wb') as f:
f.write(tflite_int8_model)
print(f"Orijinal model: {os.path.getsize('model.tflite') / 1024:.1f} KB")
print(f"INT8 model: {os.path.getsize('model_int8.tflite') / 1024:.1f} KB")Dağıtım Hususları
Modeli üretime almak, eğitim kadar önemli bir aşamadır. Dağıtım stratejisi, hedef platforma göre değişir:
- Web sunucu: TensorFlow Serving ile REST/gRPC API olarak sunma. Yüksek verimlilik ve otomatik model versiyonlama sağlar.
- Mobil uygulama: TFLite ile Android/iOS üzerinde çalıştırma. Model kuantizasyonu ile boyut ve hız optimizasyonu yapılmalıdır.
- Tarayıcı: TensorFlow.js ile istemci tarafında çıkarım. Kullanıcı verisinin sunucuya gönderilmesine gerek kalmaz.
- Gömülü sistem: TFLite Micro ile mikrodenetleyicilerde çalıştırma. Bellek ve işlem gücü kısıtlamaları göz önünde bulundurulmalıdır.
Her dağıtım senaryosunda model versiyonlama, A/B testi, performans izleme ve geri alma mekanizmaları planlanmalıdır. MLOps araçları (MLflow, Kubeflow, Vertex AI) bu süreçleri otomatikleştirmek için kullanılabilir.
Özet
TensorFlow ile model eğitimi; verimli veri pipeline'ı, doğru model mimarisi, akıllı callback kullanımı ve sistematik hiperparametre aramasının birleşiminden oluşur. Özel eğitim döngüleri ile GradientTape kullanarak eğitim süreci üzerinde tam kontrol sağlayabilir, karışık hassasiyetli eğitim ile GPU verimliliğini artırabilirsiniz. Transfer learning ve iki aşamalı eğitim stratejisi ile sınırlı veriyle bile yüksek performans elde edebilirsiniz. TFLite kuantizasyonu ile modellerinizi mobil cihazlara taşıyarak geniş bir kullanıcı kitlesine ulaşabilirsiniz. TensorBoard ile eğitim sürecini izlemek ve model checkpoint'leri ile en iyi ağırlıkları korumak, profesyonel ML projelerinin olmazsa olmazıdır.
İlgili Makaleler
Makine Öğrenmesi Nedir? Python ile Temel Kavramlar ve İlk Model
Makine öğrenmesine giriş. Supervised, unsupervised ve reinforcement learning kavramları. Python, NumPy ve Scikit-learn ile ilk model.
CNN ile Derin Öğrenme: Convolutional Neural Network Rehberi
Convolutional Neural Network (CNN) mimarisi ve derin öğrenme. Convolution, pooling, fully connected katmanlar ve görüntü sınıflandırma.
Flutter Projeniz mi Var?
iOS, Android ve web için yüksek performanslı Flutter uygulamaları geliştiriyorum.
İletişime Geç