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 argmax
Operation ü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?
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
quelle
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.
quelle
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.
quelle