Zuvor habe ich einen Artikel mit dem Titel Textklassifizierung mit wiederkehrendem Faltungs-NN erstellt und den Code zum Klassifizieren von Text mit R-CNN geschrieben, bei dem es sich nicht um ein Bild handelt.
Zu diesem Zeitpunkt schrieb ich, dass "covolution_2d nicht für eine feste x-Achsen-Faltung verwendet werden kann", aber in Wirklichkeit handelt es sich um eine Faltungsmethode, die der Verarbeitung von Bildern ähnelt (Anwenden eines Filters während der Bewegung in x- und y-Richtung). Aber die Leistung scheint herauszukommen. Es gab eine Person, die Chainer tatsächlich nach dieser Methode implementiert hat.
Sie können einen großen zweidimensionalen Vektor erstellen, indem Sie die Worteinbettungsvektoren in Wortreihenfolge verbinden und damit den Klassifikator lernen. Aufgrund der Art des Textes hängt seine Größe jedoch von der Länge des Satzes ab. Daher wird in der vorherigen Implementierung die maximale Länge aller Sätze einmal gemessen, auf diese Größe festgelegt (0 Auffüllen, falls erforderlich) und verarbeitet.
Dies ist eine Möglichkeit, dies zu tun. Wenn Sie jedoch Spatial Pyramid Pooling für die Pooling-Ebene verwenden, können Sie jede Längeneingabe in einen Vektor fester Länge umwandeln. Auf diese Weise können Sie ein Modell erstellen, das Eingaben mit variabler Länge akzeptiert. Da es als räumliche_Pyramide_Pooling_2d-Funktion in Chainer implementiert ist, ersetzen Sie max_pooling_2d durch diese und kombinieren Sie die Anzahl der Einheiten in der FC-Zwischenschicht mit der Ausgabe von SPP, um den Vorgang abzuschließen.
def __call__(self, x):
h1 = F.spatial_pyramid_pooling_2d(F.relu(self.conv1(x)), 2, F.MaxPooling2D) # max_pooling_Durch 2d ersetzen
h2 = F.dropout(F.relu(self.l1(h1)))
y = self.l2(h2)
return y
Die Testgenauigkeit entspricht in etwa der des Originals (ca. 75%).
Recommended Posts