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.
neural-network
deep-learning
nnrales
źródło
źródło
Odpowiedzi:
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.
źródło
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:
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.
źródło
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-
Następnie dodaj warstwy modelu base_model do modelu new_model -
Teraz uczyń warstwy nowego modelu niemożliwymi do trenowania, ponieważ nie chcesz, aby Twój model był ponownie trenowany.
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 -
Teraz dodaj gęstą warstwę na końcu, a my będziemy trenować tę gęstą warstwę tylko w tym przykładzie.
Teraz trenuj model i mam nadzieję, że daje on odpowiednią wydajność dla wszystkich 11 klas.
Happy Learning.
źródło