Bagaimana cara menambahkan kategori baru ke model pembelajaran yang mendalam?

15

Katakanlah saya telah melakukan transfer pembelajaran pada jaringan pra-terlatih untuk mengenali 10 objek. Bagaimana cara menambahkan item ke-11 yang dapat diklasifikasi jaringan tanpa kehilangan semua 10 kategori yang sudah saya latih atau informasi dari model pra-latih yang asli? Seorang teman memberi tahu saya bahwa penelitian aktif sedang berlangsung di bidang ini, tetapi saya tidak dapat menemukan makalah yang relevan atau nama yang dapat digunakan untuk mencari?

Terima kasih.

nnrales
sumber
Jika Anda berlatih dengan kelas lebih banyak maka ada? Apakah itu bisa membantu? Sebagai contoh, katakanlah Anda tahu tidak akan ada lebih dari 1000 kelas. Anda melatih dari awal classifier Anda dengan 1000 kelas pada 10 kelas yang Anda miliki saat ini, dan ketika Anda memiliki lebih banyak kelas, teruskan melatihnya ... Apakah itu bisa menjadi solusi yang baik? Apakah ada tulisan mengenai pendekatan ini?
Michael

Jawaban:

13

Jika ini hanya kasus satu kali, Anda bisa melatih kembali jaringan saraf. Jika Anda sering harus menambahkan kelas baru, maka ini adalah ide yang buruk. Apa yang ingin Anda lakukan dalam kasus seperti itu disebut pengambilan gambar berbasis konten (CBIR), atau hanya pencarian gambar atau pencarian visual. Saya akan menjelaskan kedua kasus dalam jawaban saya di bawah ini.

Kasing satu kali

Jika ini hanya terjadi sekali - Anda lupa kelas 11, atau pelanggan Anda berubah pikiran - tetapi itu tidak akan terjadi lagi , maka Anda dapat dengan mudah simpul output ke 11 ke lapisan terakhir. Inisialisasi bobot ke node ini secara acak, tetapi gunakan bobot yang sudah Anda miliki untuk output lainnya. Lalu, latih saja seperti biasa. Mungkin bermanfaat untuk memperbaiki beberapa bobot, yaitu jangan melatih ini.

Kasus ekstrem adalah hanya melatih bobot baru, dan membiarkan semua yang lain tetap. Tetapi saya tidak yakin apakah ini akan bekerja dengan baik - mungkin patut dicoba.

Pengambilan gambar berbasis konten

Pertimbangkan contoh berikut: Anda bekerja untuk toko CD, yang ingin pelanggan mereka dapat mengambil gambar sampul album, dan aplikasi menunjukkan kepada mereka CD yang mereka pindai di toko online mereka. Dalam hal ini, Anda harus melatih kembali jaringan untuk setiap CD baru yang mereka miliki di toko. Itu mungkin 5 CD baru setiap hari, jadi latih ulang jaringan dengan cara itu tidak cocok.

Solusinya adalah melatih jaringan, yang memetakan gambar ke dalam ruang fitur. Setiap gambar akan diwakili oleh deskriptor, yaitu vektor 256 dimensi. Anda dapat "mengklasifikasikan" gambar dengan menghitung deskriptor ini, dan membandingkannya dengan database deskriptor Anda (yaitu deskriptor semua CD yang Anda miliki di toko Anda). Deskriptor terdekat dalam basis data menang.

Bagaimana Anda melatih jaringan saraf untuk mempelajari vektor deskripsi seperti itu? Itu adalah bidang penelitian aktif. Anda dapat menemukan karya terbaru dengan mencari kata kunci seperti "pengambilan gambar" atau "pembelajaran metrik".

Saat ini, orang biasanya mengambil jaringan pra-terlatih, misalnya VGG-16, memotong lapisan FC, dan menggunakan konvolusional akhir sebagai vektor deskriptor Anda. Anda dapat lebih lanjut melatih jaringan ini misalnya dengan menggunakan jaringan siam dengan kehilangan triplet.

hbaderts
sumber
Saya telah mempelajari pembelajaran satu kali. Apakah Anda pikir itu bisa membantu saya?
nnrales
Saya tidak benar-benar tahu tentang pembelajaran sekali pakai. Tetapi makalah pembelajaran satu langkah yang saya temukan terlihat sangat mirip dengan pendekatan CBIR, jadi itu pasti bisa berguna bagi Anda
hbaderts
2

Topologi jaringan Anda mungkin terlihat berbeda, tetapi pada akhirnya, jaringan pra-terlatih Anda memiliki lapisan, yang menangani pengenalan 10 kelas asli. Trik termudah (dan berfungsi) untuk memperkenalkan kelas 11, 12 .. nth, adalah menggunakan semua layer sebelum yang terakhir diberikan dan menambahkan layer tambahan (dalam model baru, atau sebagai paralel) yang juga akan duduk di atas semua kecuali lapisan terakhir, akan terlihat sama dengan lapisan 10class (yang paling mungkin matmul lapisan padat dan matriks bentuk [len(dense layer), 10]dengan bias opsional).

Lapisan baru Anda akan menjadi lapisan matmul dengan bentuk [len(dense layer), len(new classes)].

Tanpa akses ke data pelatihan asli, Anda akan memiliki dua opsi:

  1. Bekukan semua bobot dalam lapisan asli dengan memungkinkan model "baru" untuk hanya mengoptimalkan bobot baru. Itu akan memberi Anda kekuatan prediksi yang sama persis untuk 10 kelas asli dan mungkin memberikan kinerja OK untuk yang baru.
  2. Latih seluruh jaringan sekaligus (dengan menyebarkan kesalahan kelas baru), yang mungkin bekerja untuk kelas baru, tetapi Anda akan berakhir dengan solusi asli yang tidak efektif untuk 10 kelas (karena bobot akan diubah untuk kelas bawah dan lapisan akhir) tidak akan diperbarui untuk mencocokkan perubahan tersebut).

Meskipun, mengingat Anda memiliki akses ke data pelatihan asli, Anda dapat dengan mudah menambahkan kelas baru ke jaringan asli dan melatihnya kembali untuk mendukung 11 kelas di luar kotak.

chewpakabra
sumber
2

Ini bisa dilakukan dengan mudah.

Pertama membangun model dengan 10 kelas tersebut dan menyimpan model sebagai base_model.

Memuat base_model dan juga mendefinisikan model baru bernama new_model as-

new_model = Sequential()

Kemudian tambahkan layer dari base_model ke new_model -

# 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)

Sekarang buat lapisan-lapisan model baru tidak dapat dilatih karena Anda tidak ingin model Anda dilatih lagi.

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

Sekarang saat Anda mentransfer pembelajaran, ketika Anda menghapus lapisan terakhir, model semacam lupa tentang 10 kelas sehingga kita harus mempertahankan bobot base_model ke new_model -

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

Sekarang tambahkan layer padat di akhir dan kami hanya akan melatih layer padat ini dalam contoh ini.

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

Sekarang latih modelnya dan saya harap ini memberikan hasil yang tepat untuk semua 11 kelas.

Selamat Belajar.

Subham Tiwari
sumber