• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

TensorFlow'da transfer öğrenme nasıl uygulanır?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
Transfer öğrenmeyi TensorFlow’da uygulamak için önceden eğitilmiş bir modeli temel alıp önce son sınıflandırma katmanını kendi veri kümenize göre değiştirin, tabanı dondurarak modeli eğitin ve doğrulama sonucu yeterliyse üst katmanların bir bölümünü düşük öğrenme oranıyla yeniden eğitin. Böylece sıfırdan model kurmadan, örneğin kedi ve köpek görüntülerini sınıflandıran çalışır bir model elde edebilirsiniz.

Gerekli hazırlık​


Örnekte varsayımsal olarak data/ klasöründe sınıf adları alt klasörlerle ayrılmış bir görüntü veri kümesi kullanılmaktadır:

Kod:
data/
├── cats/
│   ├── cat01.jpg
│   └── cat02.jpg
└── dogs/
    ├── dog01.jpg
    └── dog02.jpg

TensorFlow ve görüntü işleme için gereken paketleri kurun:

Bash:
pip install tensorflow

Bu ağaç yalnızca klasör düzenini gösterir; yalnız dört dosyayla yüzde 20’lik doğrulama bölümü boş kalabilir. Gerçek denemede her iki bölümde de sınıfları temsil edecek yeterli sayıda görüntü kullanın. Görüntülerin sınıf klasörlerine ayrılması, dosyaların okunabilir olması ve eğitim ile doğrulama verilerinin birbirine karışmaması gerekir. Aynı veya çok benzer görüntünün hem eğitim hem doğrulama kümesinde bulunması, doğrulama başarımını gerçekte olduğundan yüksek gösterebilir.

Önceden eğitilmiş modeli kullanma​


Aşağıdaki örnek, ImageNet üzerinde önceden eğitilmiş MobileNetV2 modelini kullanır. Modelin son sınıflandırma katmanı çıkarılır; yerine veri kümenizdeki sınıf sayısına uygun yeni katmanlar eklenir.
  1. Veri kümelerini yükleyin. Klasör adlarını sınıf etiketi olarak kullanacak şekilde eğitim ve doğrulama verilerini oluşturun. image_size, modelin beklediği görüntü boyutuna dönüştürme işlemini belirler.
  2. Model tabanını oluşturun. include_top=False ile özgün sınıflandırma bölümü çıkarılır. weights="imagenet" önceden öğrenilmiş görsel özelliklerin kullanılmasını sağlar.
  3. Model tabanını dondurun. İlk aşamada trainable=False ayarıyla önceden öğrenilmiş katmanların ağırlıkları değiştirilmez. Bu, küçük veri kümelerinde aşırı öğrenme riskini azaltır.
  4. Yeni sınıflandırma katmanlarını ekleyin. Küresel ortalama havuzlama katmanı, özellik haritasını daha küçük bir vektöre dönüştürür; son Dense katmanı ise sınıf olasılıklarını üretir.
  5. Modeli derleyin. Kayıp işlevini çıkış katmanı ve etiket biçimiyle eşleştirin. Bu örnekte iki sınıf olsa bile Dense(num_classes, activation="softmax") ve tam sayı sınıf etiketleri kullanıldığı için sparse_categorical_crossentropy uygundur. binary_crossentropy ise örneğin tek sigmoid çıkışı ve ikili hedeflerle kullanılabilir.
  6. Modeli eğitin ve doğrulayın. Her dönem sonunda doğrulama kaybı ile doğrulama doğruluğunu izleyin. Eğitim doğruluğu artarken doğrulama doğruluğu düşüyorsa model eğitim verisini ezberlemeye başlıyor olabilir.
Python:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

DATA_DIR = "data"
IMAGE_SIZE = (224, 224)
BATCH_SIZE = 32
SEED = 123

train_ds = keras.utils.image_dataset_from_directory(
    DATA_DIR,
    validation_split=0.2,
    subset="training",
    seed=SEED,
    image_size=IMAGE_SIZE,
    batch_size=BATCH_SIZE,
)

val_ds = keras.utils.image_dataset_from_directory(
    DATA_DIR,
    validation_split=0.2,
    subset="validation",
    seed=SEED,
    image_size=IMAGE_SIZE,
    batch_size=BATCH_SIZE,
)

class_names = train_ds.class_names
num_classes = len(class_names)

base_model = keras.applications.MobileNetV2(
    input_shape=IMAGE_SIZE + (3,),
    include_top=False,
    weights="imagenet",
)
base_model.trainable = False

inputs = keras.Input(shape=IMAGE_SIZE + (3,))
x = keras.applications.mobilenet_v2.preprocess_input(inputs)
x = base_model(x, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.2)(x)
outputs = layers.Dense(num_classes, activation="softmax")(x)

model = keras.Model(inputs, outputs)

model.compile(
    optimizer=keras.optimizers.Adam(),
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=5,
)

val_loss, val_accuracy = model.evaluate(val_ds)
print("Sınıflar:", class_names)
print("Doğrulama doğruluğu:", val_accuracy)

model.save("transfer_model.keras")

Bu kodun sonunda sınıf adları yazdırılır, doğrulama kümesi değerlendirilir ve model dosyaya kaydedilir. Örneğin çıktıdaki doğrulama doğruluğu 0.90 ise modelin doğrulama örneklerinin yaklaşık yüzde 90’ında doğru sınıfı seçtiği anlaşılır; bu değer yeni ve temsil edici gerçek dünya görüntülerinde aynı başarımın kesinlikle elde edileceğini kanıtlamaz.

Özellik çıkarma ve ince ayar farkı​


Transfer öğrenmede iki aşamayı birbirinden ayırmak gerekir. İlk aşamada model tabanı dondurulur ve yalnızca yeni sınıflandırma başlığı eğitilir. İkinci aşama olan ince ayarda, tabanın son katmanlarının bir bölümü açılır ve çok küçük öğrenme oranıyla yeniden eğitilir.
AşamaModel tabanıNe zaman kullanılmalı?Temel risk
Özellik çıkarmaDondurulmuşVeri kümesi küçükse veya sınıflar genel görsel özelliklerle ayırt edilebiliyorsaYeni alan, önceden öğrenilen görsel özelliklerden çok farklı olabilir
İnce ayarSon katmanların bir bölümü açıkYeterli veri varsa ve ilk eğitim sonucu yetersiz kalıyorsaYüksek öğrenme oranı, önceden öğrenilmiş özellikleri bozabilir
İnce ayara yalnızca ilk aşamadaki model makul bir başlangıç sonucu verdikten sonra geçin. Önce katmanların trainable ayarlarını değiştirin, ardından düşük öğrenme oranıyla modeli yeniden derleyin. Örnekteki base_model(x, training=False) çağrısını koruyun; böylece taban açıldığında da BatchNormalization’ın hareketli ortalama ve varyans istatistikleri eğitim sırasında güncellenmez.

İnce ayar uygulama​

  1. Model tabanının son bölümünü eğitime açın. Örneğin son 20 katmanı açıp daha önceki katmanları dondurun. Erken katmanlar genel kenar ve şekil özellikleri öğrendiği için genellikle korunur.
  2. Modeli düşük öğrenme oranıyla yeniden derleyin. 1e-5 gibi küçük bir değer, ağırlıkların büyük sıçramalarla değişmesini önlemeye yardımcı olur.
  3. Kısa bir ek eğitim yapın. Doğrulama kaybı yükselirse eğitimi durdurun veya açılan katman sayısını azaltın; bu durum ince ayarın veri kümesine aşırı uyum sağlamaya başladığını gösterebilir.
  4. En iyi modeli kaydedin. Yalnızca son dönemi değil, doğrulama kaybı en düşük olan dönemi korumak için bir model kontrol noktası geri çağrımı kullanın.
Python:
base_model.trainable = True

for layer in base_model.layers[:-20]:
    layer.trainable = False

model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=1e-5),
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

checkpoint = keras.callbacks.ModelCheckpoint(
    "best_transfer_model.keras",
    monitor="val_loss",
    save_best_only=True,
)

fine_tune_history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=5,
    callbacks=[checkpoint],
)

Tahmin sonucunu kontrol etme​


Eğitimden sonra tek bir görüntüyü modelin eğitim sırasında gördüğü boyuta getirip tahmin alın. argmax en yüksek olasılığa sahip sınıfın sıra numarasını verir.

Python:
import numpy as np
from tensorflow import keras

image = keras.utils.load_img("sample.jpg", target_size=IMAGE_SIZE)
array = keras.utils.img_to_array(image)
array = tf.expand_dims(array, axis=0)

probabilities = model.predict(array, verbose=0)[0]
index = int(np.argmax(probabilities))

print("Tahmin:", class_names[index])
print("Olasılık:", float(probabilities[index]))

Tahmin edilen sınıf ile olasılık birlikte değerlendirilmelidir. Yüksek olasılık modelin o sınıfı seçtiğini gösterir; modelin kesin olarak doğru olduğunu veya görüntünün yalnızca o sınıfa ait olduğunu göstermez. Özellikle eğitim verisinde bulunmayan nesnelerde model yine de mevcut sınıflardan birini seçebilir.

Doğrulama başarımı düşükse önce sınıf klasörlerini, etiketleri, görüntü kalitesini ve eğitim-doğrulama dağılımını kontrol edin. Eğitim başarımı yüksek, doğrulama başarımı düşükse aşırı öğrenme olasılığı yüksektir; veri artırma, daha az ince ayar katmanı veya daha kısa eğitim denenebilir. Her iki başarım da düşükse görüntü ön işleme adının kullanılan taban modelle uyumlu olduğunu ve veri kümesinin sınıfları ayırt etmek için yeterli bilgi içerdiğini inceleyin.
 
Son düzenleme:

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic
Geri
Üst