So extrahieren Sie Informationen aus Scikits.Learn -Klassifikator für den C -Code, der dann in C -Code verwendet wird

StackOverflow https://stackoverflow.com/questions/8360253

Frage

Ich habe ein paar RBF -SVMs mit Scikits geschult.Learn in Python und dann die Ergebnisse eingelegt. Diese sind für Bildverarbeitungsaufgaben gedacht, und eine Sache, die ich zum Testen tun möchte, ist, jeden Klassifikator auf jedem Pixel einiger Testbilder auszuführen. Das heißt, extrahieren Sie den Merkmalsvektor aus einem Fenster, das auf Pixel (I, J) zentriert ist, jeden Klassifizierer auf diesem Funktionsvektor ausführen und dann mit dem nächsten Pixel fortfahren und wiederholt. Dies hat viel zu langsam mit Python zu tun.

Klärung: Wenn ich "das ist viel zu langsam ..." sage, meine ich, dass selbst der Libsvm unter dem Haube Code, den Scikits.Learn verwendet, zu langsam ist. Ich schreibe tatsächlich eine manuelle Entscheidungsfunktion für die GPU, sodass die Klassifizierung bei jedem Pixel parallel stattfindet.

Ist es mir möglich, die Klassifizierer mit Gurke zu laden und dann eine Art Attribut zu holen, das beschreibt, wie die Entscheidung aus dem Feature -Vektor berechnet wird, und dann diese Informationen an meinen eigenen C -Code weitergeben? Bei linearen SVMs konnte ich einfach den Gewichtsvektor und den Vorspannungsvektor extrahieren und diese als Eingänge zu einer C -Funktion hinzufügen. Aber was ist das Äquivalent für RBF -Klassifizierer und wie bekomme ich diese Informationen aus dem Scikits.Learn -Objekt?

Hinzugefügt: Erste Versuche einer Lösung.

Es sieht so aus, als hätte das Klassifikatorobjekt das Attribut support_vectors_ Dies enthält die Unterstützungsvektoren als jede Zeile eines Arrays. Es gibt auch das Attribut dual_coef_ Welches ist ein 1 von len(support_vectors_) Array von Koeffizienten. Aus den Standard-Tutorials für nichtlineare SVMs scheint es, dass man Folgendes tun sollte:

  • Berechnen Sie den Feature -Vektor v Aus Ihrem zu testenden Datenpunkt. Dies wird ein Vektor sein, der die gleiche Länge wie die Reihen von ist support_vectors_.
  • Für jede Reihe i in support_vectors_, berechnen Sie die quadratische euklidische Entfernung d[i] zwischen diesem Unterstützungsvektor und v.
  • Berechnen t[i] wie gamma * exp{-d[i]} wo gamma ist der RBF -Parameter.
  • Zusammenfassen dual_coef_[i] * t[i] gesamt i. Fügen Sie den Wert der hinzu intercept_ Attribut des Scikits.Learn -Klassifikators für diese Summe.
  • Wenn die Summe positiv ist, klassifizieren Sie als 1. Ansonsten klassifizieren Sie als 0.

Hinzugefügt: Auf nummerierten Seite 9 dazu Dokumentationslink es erwähnt, dass tatsächlich die intercept_ Das Attribut des Klassifikators hält den Vorspannungsbegriff. Ich habe die obigen Schritte aktualisiert, um dies widerzuspiegeln.

War es hilfreich?

Lösung

Ja, Ihre Lösung sieht gut aus. Um den rohen Speicher eines Numpy -Arrays direkt an ein C -Programm zu übergeben, können Sie die verwenden Ctypes -Helfer von Numpy oder wickeln Sie Ihr C -Programm mit Cython ein und rufen Sie es direkt an, indem Sie das Numpy -Array übergeben (siehe DOC AT http://cython.org für mehr Details).

Ich bin mir jedoch nicht sicher, ob der Versuch, die Vorhersage einer GPU zu beschleunigen -Lineare (multimodale) Probleme.

Alternative Ansätze, die zur Vorhersagezeit schneller sind maximales Pooling über Bildbereichen (nur zur Bildklassifizierung).

Schließlich können Sie auch versuchen, NUSVC -Modelle zu verwenden, deren Regularisierungsparameter nu Hat einen direkten Einfluss auf die Anzahl der Unterstützungsvektoren im angepassten Modell: Weniger Unterstützungsvektoren bedeuten schnellere Vorhersageszeiten (überprüfen Sie die Genauigkeit jedoch, dies wird am Ende ein Kompromiss zwischen Vorhersagegeschwindigkeit und Genauigkeit sein).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top