Jak dodać nową kategorię do modelu głębokiego uczenia się?

15

Powiedzmy, że wykonałem naukę transferu w sieci wstępnie przeszkolonej, aby rozpoznać 10 obiektów. Jak dodać jedenasty element, który sieć może sklasyfikować, nie tracąc wszystkich 10 kategorii, które już trenowałem, ani informacji z oryginalnego wstępnie wyszkolonego modelu? Znajomy powiedział mi, że trwają aktywne badania w tej dziedzinie, ale nie mogę znaleźć żadnych odpowiednich dokumentów ani nazwy, według której można by szukać?

Dziękuję Ci.

nnrales
źródło
Jeśli trenujesz ze znacznie większą liczbą klas, to jest? czy to może pomóc? Załóżmy na przykład, że wiesz, że nie będzie więcej niż 1000 zajęć. Trenujesz od początku swojego klasyfikatora z 1000 klas na 10 klasach, które obecnie posiadasz, a kiedy masz więcej klas, po prostu trzymaj pociąg na nich ... Czy to może być dobre rozwiązanie? Czy jest papier dotyczący tego podejścia?
Michael

Odpowiedzi:

13

Jeśli jest to jednorazowy przypadek, możesz po prostu ponownie przeszkolić sieć neuronową. Jeśli często musisz dodawać nowe klasy, to zły pomysł. To, co chcesz zrobić w takich przypadkach, to pobieranie obrazów oparte na treści (CBIR) lub po prostu pobieranie obrazów lub wyszukiwanie wizualne. Oba przypadki wyjaśnię w mojej odpowiedzi poniżej.

Przypadek jednorazowy

Jeśli zdarzy się to tylko raz - zapomnisz 11 klasy lub klient zmienił zdanie - ale to się nie powtórzy , to możesz po prostu 11 węzła wyjściowego do ostatniej warstwy. Inicjuj wagi dla tego węzła losowo, ale używaj wag, które już masz dla innych danych wyjściowych. Następnie po prostu trenuj jak zwykle. Pomocne może być ustalenie niektórych ciężarów, tj. Nie trenuj ich.

Skrajnym przypadkiem byłoby trenowanie tylko nowych obciążników i pozostawienie wszystkich pozostałych na stałym poziomie. Ale nie jestem pewien, czy to zadziała tak dobrze - może warto spróbować.

Pobieranie obrazu na podstawie zawartości

Rozważ następujący przykład: pracujesz dla sklepu z płytami CD, który chce, aby ich klienci mogli zrobić zdjęcie okładki albumu, a aplikacja pokazuje im płytę CD, którą zeskanowali w swoim sklepie internetowym. W takim przypadku konieczne będzie ponowne przeszkolenie sieci dla każdej nowej płyty CD, którą mają w sklepie. Może to być 5 nowych płyt CD każdego dnia, więc ponowne szkolenie sieci w ten sposób nie jest odpowiednie.

Rozwiązaniem jest wyszkolenie sieci, która odwzorowuje obraz na przestrzeń funkcji. Każdy obraz będzie reprezentowany przez deskryptor, który jest np. 256-wymiarowym wektorem. Możesz „sklasyfikować” obraz, obliczając ten deskryptor i porównując go z bazą danych deskryptorów (tj. Deskryptorów wszystkich płyt CD, które masz w sklepie). Wygrywa najbliższy deskryptor w bazie danych.

Jak trenujesz sieć neuronową, aby nauczyć się takiego wektora deskryptora? To jest aktywny obszar badań. Najnowsze prace można znaleźć, wyszukując słowa kluczowe takie jak „wyszukiwanie obrazów” lub „uczenie się metryk”.

W tej chwili ludzie zwykle biorą wstępnie przeszkoloną sieć, np. VGG-16, odcinają warstwy FC i używają ostatecznej splotowej jako wektora deskryptora. Możesz dalej trenować tę sieć, np. Używając sieci syjamskiej z utratą trojaczki.

hbaderts
źródło
Patrzyłem na naukę za jednym zamachem. Myślisz, że to może mi pomóc?
nnrales
Tak naprawdę nie wiem o jednorazowym uczeniu się. Ale jednorazowe dokumenty do głębokiego uczenia się, które znalazłem, wyglądają dość podobnie do podejścia CBIR, więc na pewno mogą się przydać
hbaderts
2

Twoja topologia sieci może wyglądać inaczej, ale w końcu twoja wstępnie wyszkolona sieć ma warstwę, która obsługuje rozpoznawanie 10 oryginalnych klas. Najłatwiejszym (i działającym) sposobem na wprowadzenie 11., 12. .. n-tej klasy jest użycie wszystkich warstw przed ostatnią przyznaną i dodanie dodatkowej warstwy (w nowym modelu lub równolegle), która również będzie siedzieć na wierzchu wszystkich oprócz ostatnich warstw będzie wyglądał podobnie do warstwy 10 klasy (która najprawdopodobniej jest matmulem gęstej warstwy i matrycy kształtu [len(dense layer), 10]z opcjonalnym odchyleniem).

Twoja nowa warstwa byłaby matmulową warstwą o kształcie [len(dense layer), len(new classes)].

Bez dostępu do oryginalnych danych treningowych masz dwie opcje:

  1. Zatrzymaj wszystkie ciężary na oryginalnych warstwach, umożliwiając „nowemu” modelowi optymalizację tylko nowych ciężarów. To da ci dokładnie taką samą moc predykcyjną dla oryginalnych 10 klas i może dać OK wydajność dla nowych.
  2. Trenuj całą sieć naraz (propagując błąd nowych klas), co może działać dla nowych klas, ale skończy się to nieskutecznym oryginalnym rozwiązaniem dla 10 klas (ponieważ wagi zostaną zmienione dla klas niższych i ostatniej warstwy nie będą aktualizowane w celu dopasowania tych zmian).

Chociaż mając dostęp do oryginalnych danych treningowych, możesz łatwo dodać nową klasę do oryginalnej sieci i ponownie ją przeszkolić, aby obsługiwać 11 klas po wyjęciu z pudełka.

chewpakabra
źródło
2

Można to łatwo zrobić.

Najpierw zbuduj model z tymi 10 klasami i zapisz model jako model_podstawowy.

Załaduj model base_model, a także zdefiniuj nowy model o nazwie new_model jako-

new_model = Sequential()

Następnie dodaj warstwy modelu base_model do modelu 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)

Teraz uczyń warstwy nowego modelu niemożliwymi do trenowania, ponieważ nie chcesz, aby Twój model był ponownie trenowany.

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

Teraz, kiedy przenosisz naukę, kiedy usuwasz ostatnie warstwy, model zapomina o 10 klasach, więc musimy zachować wagi modelu base_model do modelu new_model -

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

Teraz dodaj gęstą warstwę na końcu, a my będziemy trenować tę gęstą warstwę tylko w tym przykładzie.

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

Teraz trenuj model i mam nadzieję, że daje on odpowiednią wydajność dla wszystkich 11 klas.

Happy Learning.

Subham Tiwari
źródło