Derin öğrenme modeline yeni bir kategori nasıl eklenir?


15

Diyelim ki 10 nesneyi tanımak için önceden eğitilmiş bir ağda transfer öğrenimi yaptım. Daha önce eğitmiş olduğum 10 kategoriyi veya önceden eğitilmiş orijinal modeldeki bilgileri kaybetmeden ağın sınıflandırabileceği 11. bir öğeyi nasıl ekleyebilirim? Bir arkadaşım bana bu alanda aktif araştırmaların sürdüğünü söyledi, ancak aranacak herhangi bir makale veya isim bulamadım?

Teşekkür ederim.


Eğer çok daha fazla sınıfla antrenman yaparsan? bu yardımcı olabilir mi? Örneğin, 1000'den fazla sınıf olmayacağını bildiğinizi varsayalım. Sınıflandırıcıyı en başından beri sahip olduğunuz 10 sınıfta 1000 sınıfla eğitiyorsunuz ve daha fazla sınıfınız olduğunda, treni üzerlerinde tuttunuz ... Bu iyi bir çözüm olabilir mi? Bu yaklaşımla ilgili makale var mı?
Michael

Yanıtlar:


13

Bu sadece bir kerelik bir durumsa, sinir ağını yeniden eğitebilirsiniz. Sık sık yeni sınıflar eklemeniz gerekiyorsa, bu kötü bir fikirdir. Bu gibi durumlarda yapmak istediğiniz içeriğe dayalı görüntü alma (CBIR) veya basitçe görüntü alma veya görsel arama olarak adlandırılır. Her iki durumu da aşağıdaki cevabımda açıklayacağım.

Bir defalık dava

Bu sadece bir kez gerçekleşirse - 11. sınıfı unutursanız veya müşteriniz fikrini değiştirirse - ancak tekrar olmaz , o zaman son katmana 11. çıkış düğümü yapabilirsiniz. Bu düğüme ağırlıkları rastgele başlatın, ancak diğer çıktılar için zaten sahip olduğunuz ağırlıkları kullanın. Sonra, her zamanki gibi eğitin. Bazı ağırlıkları düzeltmek faydalı olabilir, yani bunları eğitmeyin.

Aşırı bir durum, sadece yeni ağırlıkları eğitmek ve diğerlerini sabit bırakmak olacaktır. Ama bunun işe yarayıp yaramayacağından emin değilim - denemeye değer olabilir.

İçeriğe dayalı görüntü alma

Aşağıdaki örneği düşünün: Müşterilerinin bir albüm kapağının fotoğrafını çekmesini isteyen bir CD mağazasında çalışıyorsunuz ve uygulama onlara çevrimiçi mağazalarında taradıkları CD'yi gösteriyor. Bu durumda, mağazadaki her yeni CD için ağı yeniden eğitmeniz gerekir. Bu her gün 5 yeni CD olabilir, bu nedenle ağı yeniden eğitmek uygun değildir.

Çözüm, görüntüyü bir özellik alanına eşleyen bir ağı eğitmektir. Her görüntü, örneğin 256 boyutlu bir vektör olan bir tanımlayıcı ile temsil edilecektir. Bir görüntüyü bu tanımlayıcıyı hesaplayarak ve tanımlayıcı veritabanınızla (yani mağazanızdaki tüm CD'lerin tanımlayıcıları) karşılaştırarak "sınıflandırabilirsiniz". Veritabanındaki en yakın tanımlayıcı kazanır.

Böyle bir tanımlayıcı vektörü öğrenmek için bir sinir ağını nasıl eğitirsiniz? Bu aktif bir araştırma alanıdır. "Resim alma" veya "metrik öğrenme" gibi anahtar kelimeleri arayarak son işleri bulabilirsiniz.

Şu anda, insanlar genellikle önceden eğitilmiş bir ağ alırlar, örneğin VGG-16, FC katmanlarını keser ve son kıvrımı, tanımlayıcı vektörünüz olarak kullanırlar. Bu ağı, örneğin üçlü kayıplı bir siyam ağı kullanarak daha fazla eğitebilirsiniz.


Tek adımda öğrenmeye bakıyorum. Bunun bana yardımcı olabileceğini düşünüyor musun?
nnrales

Tek adımda öğrenmeyi gerçekten bilmiyorum. Ancak bulduğum tek adımlık derin öğrenme kağıtları CBIR yaklaşımına oldukça benziyor, bu yüzden sizin için kesinlikle yararlı olabilir
hbaderts

2

Ağ topolojiniz farklı görünebilir, ancak en sonunda, önceden eğitilmiş ağınızın 10 orijinal sınıfın tanınmasını sağlayan bir katmanı vardır. 11., 12. .. n. Sınıfı tanıtmak için en kolay (ve çalışan) hile , sondan önce tüm katmanları verildiği gibi kullanmak ve aynı zamanda oturacak ek bir katman (yeni bir modelde veya paralel bir katman olarak) eklemektir. Son katmanlar hariç tümünün üstünde, 10 sınıf katmanına benzeyecektir (muhtemelen yoğun katman matmülü ve [len(dense layer), 10]isteğe bağlı önyargıya sahip bir şekil matrisi ).

Yeni katmanınız şekilli matmul bir katman olacaktır [len(dense layer), len(new classes)].

Orijinal egzersiz verilerine erişmeden iki seçeneğiniz olur:

  1. "Yeni" modelin yalnızca yeni ağırlıkları optimize etmesine izin vererek orijinal katmanlardaki tüm ağırlıkları dondurun. Bu, orijinal 10 sınıf için tam olarak aynı öngörücü gücü verecektir ve yenileri için OK performansı verebilir.
  2. Tüm ağı bir kerede eğitin (yeni sınıflar için çalışıyor olabilir), yeni sınıflar için çalışıyor olabilir, ancak 10 sınıf için etkisiz orijinal çözüm elde edeceksiniz (alt sınıflar ve son katman için ağırlıklar değişeceğinden) bu değişikliklerle eşleşecek şekilde güncellenmez).

Orijinal eğitim verilerine erişiminiz olduğu halde, orijinal ağa kolayca yeni bir sınıf ekleyebilir ve kutudan çıkan 11 sınıfı desteklemek için yeniden eğitebilirsiniz.


2

Bu kolayca yapılabilir.

Önce bu 10 sınıfla bir model oluşturun ve modeli base_model olarak kaydedin.

Base_model'i yükleyin ve ayrıca new_model as- adlı yeni bir model tanımlayın.

new_model = Sequential()

Sonra base_model katmanlarını new_model'e ekleyin -

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

Şimdi, modelinizin tekrar eğitilmesini istemediğiniz için yeni modelin katmanlarını eğitilemez hale getirin.

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

Şimdi öğrenmeyi aktarırken, son katmanları kaldırdığınızda, model türü 10 sınıfı unutur, bu nedenle base_model'in ağırlıklarını new_model'e tutmamız gerekir -

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

Şimdi sonuna yoğun bir katman ekleyin ve bu örnekte sadece bu yoğun katmanı eğiteceğiz.

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

Şimdi modeli eğitin ve umarım 11 sınıfın tamamı için doğru çıktıyı verir.

Mutlu Öğrenme.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.