Garfield
YZF Admin
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.
Örnekte varsayımsal olarak
TensorFlow ve görüntü işleme için gereken paketleri kurun:
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.
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.
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
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.
İnce ayara yalnızca ilk aşamadaki model makul bir başlangıç sonucu verdikten sonra geçin. Önce katmanların
Eğitimden sonra tek bir görüntüyü modelin eğitim sırasında gördüğü boyuta getirip tahmin alın.
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.
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.
- 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. - Model tabanını oluşturun.
include_top=Falseile özgün sınıflandırma bölümü çıkarılır.weights="imagenet"önceden öğrenilmiş görsel özelliklerin kullanılmasını sağlar. - Model tabanını dondurun. İlk aşamada
trainable=Falseayarıyla önceden öğrenilmiş katmanların ağırlıkları değiştirilmez. Bu, küçük veri kümelerinde aşırı öğrenme riskini azaltır. - 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
Densekatmanı ise sınıf olasılıklarını üretir. - 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çinsparse_categorical_crossentropyuygundur.binary_crossentropyise örneğin tek sigmoid çıkışı ve ikili hedeflerle kullanılabilir. - 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şama | Model tabanı | Ne zaman kullanılmalı? | Temel risk |
|---|---|---|---|
| Özellik çıkarma | Dondurulmuş | Veri kümesi küçükse veya sınıflar genel görsel özelliklerle ayırt edilebiliyorsa | Yeni alan, önceden öğrenilen görsel özelliklerden çok farklı olabilir |
| İnce ayar | Son katmanların bir bölümü açık | Yeterli veri varsa ve ilk eğitim sonucu yetersiz kalıyorsa | Yüksek öğrenme oranı, önceden öğrenilmiş özellikleri bozabilir |
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
- 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.
- Modeli düşük öğrenme oranıyla yeniden derleyin.
1e-5gibi küçük bir değer, ağırlıkların büyük sıçramalarla değişmesini önlemeye yardımcı olur. - 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.
- 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: