Neue Objektklasse in Deep Learning Network hinzufügen

7

Angenommen, ich habe ein geschultes Deep-Learning-Netzwerk, das 10 Klassen von Objekten (Straße, Himmel, Baum usw.) in Bildern erkennen kann. Es nimmt RGB-Bilder auf und gibt eine Wahrscheinlichkeitskarte der Größe aus (img_col, img_row, n_class), und die endgültige Segmentierung ist eine argmaxOperation über die letzte Dimension.

Jetzt möchte ich dem Netzwerk eine neue Klasse hinzufügen, z. B. Fußgänger, damit das Netzwerk nach dem Training Fußgänger in Bildern erkennen kann.

Aber ich habe nicht mehr die alten Trainingsdaten. Stattdessen habe ich einen neuen Datensatz, der auch Fußgänger enthält, aber nur die Fußgänger sind beschriftet . Das Training mit dem neuen Datensatz (unter Verwendung der alten Gewichte als Initialisierung) ist der einfachste Weg, aber ich würde gerne einige andere Ansätze hören.

Könnte jemand einige Gedanken darüber teilen, wie man dies realisiert?

GoC
quelle

Antworten:

3

Sie sollten zumindest die Klassifizierungsschicht neu trainieren. Wenn Sie während des Lernens der neuen Klasse eine weitere Ausgabe hinzufügen, muss die Aktivierung der anderen Klasse entweder explizit (Sigmoid) oder implizit (Softmax) verkleinert werden. Es kann jedoch besser sein, zumindest die letzte Merkmalsebene zu lernen, da es einige nützliche Merkmale gibt, um Fußgänger zu erkennen.

Ein anderer Ansatz kann darin bestehen, die neue Klasse dem Netzwerk zuzuführen und Vertrauen aus der Ausgabe zu gewinnen. Ein geringes Vertrauen kann ein Hinweis auf eine andere Klasse sein, die keiner der zuvor erlernten Klassen angehört. Sicherlich kann diese Methode auch einer anderen Klasse als Fußgänger oder einer Klasse, in der das Netzwerk gelernt hat, ein geringes Vertrauen geben. NN ist auch eine nicht lokale Generalisierungsmethode. Es ist anfällig, ein total mülliges Bild mit hoher Sicherheit zu klassifizieren (siehe gegnerische Beispiele, wenn Sie neugierig sind).

yasin.yazici
quelle
Ich habe die Frage aktualisiert. Im neuen Datensatz ist nur die Fußgängerklasse gekennzeichnet. Denken Sie, dass es theoretisch möglich ist, dies zu tun?
GoC
Sie können Ihren Datensatz mithilfe des vorherigen Netzwerks kennzeichnen. Lernen Sie dann ein neues Netzwerk (einige Gewichte können gemeinsam genutzt werden) basierend auf einem neuen beschrifteten Datensatz. Verlassen Sie sich dann entweder auf das neue Netzwerk oder verwenden Sie beide zusammen über eine klassenbasierte Mittelwertbildung. Es ist das zweite Netzwerk, das sich für Fußgänger ohne Beitrag des ersten entscheidet.
yasin.yazici
1

Einige Jahre nachdem die Frage gestellt wurde, gibt es mehrere Versuche, dieses Problem zu lösen.

Meine beste Vermutung wäre:

  • Fügen Sie in der letzten Ebene eine Klasse hinzu

  • Trainieren Sie die Klasse, die dem Fußgänger entspricht, mit den neuen Daten

  • Versuchen Sie, die Art und Weise, wie das Netzwerk die andere Klasse vorhersagte, nicht durch Destillation zu verändern. Dies erfordert möglicherweise andere Daten als die Fußgängerdaten, in denen andere Klassen erscheinen (Autos, siehe Mikroskop, ...). Das Gute ist, wenn Sie diese probieren können (möglicherweise über das Internet), müssen Sie sie nicht beschriften, damit die Technik funktioniert. Wenn die neuen Daten mit Fußgängerbezeichnungen aus derselben Verteilung stammen wie die, mit denen das Netzwerk ursprünglich trainiert wurde, müssen Sie nicht einmal darüber nachdenken.

Ein Beispiel für diese Technik finden Sie in diesem Dokument: https://arxiv.org/abs/1708.06977

Sie können andere relevante Artikel finden, indem Sie die folgenden Themen durchsuchen: "Kontinuierliches Lernen", "Lebenslanges Lernen", "Katastrophales Vergessen".

[EDITS]

Ich habe kürzlich diese verwandten Artikel gelesen und geliebt: Lernen ohne zu vergessen , iCaRL und inkrementelles End-to-End-Lernen

Kratzen
quelle
0

Um eine Klasse hinzuzufügen, benötigen Sie mit ziemlicher Sicherheit ein anders strukturiertes Netzwerk (dh +1 Ausgabe). Abhängig von Ihrem Problem benötigen Sie möglicherweise auch mehr versteckte Knoten oder Eingaben. Wie Sie bereits erwähnt haben, können Sie die Parameter natürlich basierend auf allen neuen Daten einfach neu trainieren. Sie verlieren jedoch den gesamten Nutzen des ursprünglichen Datensatzes.

Es besteht die Möglichkeit, Ihr neues Netzwerk (oder mindestens die gleiche Anzahl von Eingabe- / versteckten / Ausgabeparametern) mit den Gewichten zu initialisieren, die Sie aus dem ursprünglichen Datensatz haben, und dann die neuen Daten zu trainieren. Dies wird mit ziemlicher Sicherheit den Prozess beschleunigen und die ursprünglichen Informationen aus dem ersten Datensatz bis zu einem gewissen Grad beibehalten, sofern sie gut genug verallgemeinert sind.

CatsLoveJazz
quelle
Danke für die Antwort! Ja, die Struktur des Netzwerks wird sich ändern. Für das Netzwerk, das ich aufgebaut habe, muss ich der Ausgabewahrscheinlichkeitskarte nur einen zusätzlichen Klassenkanal hinzufügen, und das ist einfach. Die Sache ist, es ist besser, nichts anderes als dies zu ändern. Wie Sie bereits erwähnt haben, ist das Training des neuen Datensatzes mit den alten Gewichten als Initialisierung ein offensichtlicher Ansatz. Das meine ich am einfachsten. Hast du andere Gedanken?
GoC
0

Ich weiß nicht, ob es funktionieren würde, aber ein Ansatz wäre, ein neues Neuron in die Ausgabe-Softmax-Ebene einzufügen und mit Gradientenabstieg zu trainieren, aber nur die Gewichte zu aktualisieren, die zu dieser neuen Klasse gehen.

Es ist wahrscheinlich eine sehr suboptimale Methode, aber es könnte sich lohnen, es zu versuchen.

Steve3nto
quelle