Verwenden von PCA für einen Bilddatensatz vor der Klassifizierung mit einem neuronalen Netzwerk

7

Ich habe eine Bilddatenmatrix XN x p wo N=50000 ist die Anzahl der Bildbeispiele und p=3072 ist die Anzahl der Bildpixel: p=3072=32×32×3, weil jedes Bild ein 3-Kanal ist 32×32Bild. Darüber hinaus gehört jedes der 50000 Bilder zu einer von 10 möglichen Klassen. Das heißt, es gibt 5000 Bilder der Klasse ' car', 5000 Bilder der Klasse ' bird' usw. und es gibt insgesamt 10 Klassen. Dies ist ein Teil des CIFAR-10-Datensatzes.

Das ultimative Ziel hierbei ist die Klassifizierung dieses Datensatzes. Zu diesem Zweck erwähnte der Professor, PCA zu testen und diese Merkmale dann in einen Klassifikator zu setzen. Als Klassifikator verwende ich ein vollständig verbundenes neuronales Netzwerk mit einer verborgenen Schicht und einem Softmax-Ausgang.

Mein Problem ist , dass ich glaube , dass ich getan PCA in der richtigen habe Art und Weise , aber ich denke , dass meine Art und Weise möglicherweise sein könnte falsch angewandt .

Das habe ich getan:

Um die PCA meiner Daten zu berechnen, habe ich Folgendes getan:

Zuerst berechne ich das mittlere Bild μ1xp. Lassenxn sei der n'th Reihe von X. Dann,

μ=1Nn=1Nxn

Berechnen Sie die Kovarianzmatrix Cpxp meiner Bilddaten:

C=1N1(Xμ)T(Xμ)

Führen Sie eine Eigenvektorzerlegung von durch Cnachgiebig U, S, und V, wo die Matrix Ucodiert die Hauptrichtungen (Eigenvektoren) als Spalten. (Nehmen Sie außerdem an, dass die Eigenwerte bereits in absteigender Reihenfolge sortiert sind.) Somit:

[U,S,V]=eig(C)

Führen Sie abschließend eine PCA durch: Berechnen Sie eine neue Datenmatrix PNxk, wo kist die Anzahl der Hauptkomponenten, die wir haben möchten. LassenUkpxk - das heißt, eine Matrix mit nur der ersten kSäulen. Somit:

P=XUk

Die Frage:

Ich denke, meine Methode zur Durchführung von PCA für diese Daten ist falsch angewendet, da ich so meine Pixel im Grunde genommen voneinander dekorreliere. (Angenommen, ich hätte gesetztk=p). Das heißt, die resultierenden Zeilen vonPsehen mehr oder weniger wie Lärm aus. In diesem Fall lauten meine Fragen wie folgt:

  • Habe ich die Pixel wirklich dekorreliert? Das heißt, habe ich tatsächlich jegliche Kopplung zwischen Pixeln entfernt, die ein potenzieller Klassifikator möglicherweise verwenden wollte?
  • Wenn die Antwort auf das oben Gesagte zutrifft, warum sollten wir dann jemals PCA auf diese Weise durchführen?
  • Was den letzten Punkt betrifft, wie würden wir die Dimensionalität über PCA an Bildern reduzieren, wenn tatsächlich die Methode, die ich verwendet habe, falsch ist?

BEARBEITEN:

Nach weiteren Studien und vielen Rückmeldungen habe ich meine Frage wie folgt verfeinert: Wenn man PCA als Vorverarbeitungsschritt für die Bildklassifizierung verwenden sollte, ist es besser:

  • Klassifizierung der k Hauptkomponenten der Bilder durchführen? (MatrixXnew=XUk oben ist also jetzt jedes Bild von Länge k anstelle des Originals p)
  • ODER ist es besser, die rekonstruierten Bilder von k-Eigenvektoren zu klassifizieren (was dann sein wird)?Xnew=XUkUkT, also obwohl jedes Bild NOCH das Original ist p in der Länge wurde es tatsächlich aus rekonstruiert k Eigenvektoren).

Empirisch habe ich festgestellt, dass Validierungsgenauigkeit ohne PCA> Validierungsgenauigkeit mit PCA-Rekonstruktion> Validierungsgenauigkeit mit PCA-PCs.

Die Bilder unten zeigen das in der gleichen Reihenfolge. 0,5> 0,41> 0,31 Validierungsgenauigkeiten.

Training auf Rohpixelbildern mit Länge p::

Geben Sie hier die Bildbeschreibung ein

Training auf Längenbildern paber rekonstruiert mit k = 20 Eigenvektoren:

Geben Sie hier die Bildbeschreibung ein

Und schließlich das Training der $ k = 20 Hauptkomponenten selbst *:

Geben Sie hier die Bildbeschreibung ein

Das alles war sehr aufschlussreich. Wie ich herausgefunden habe, übernimmt PCA keine Garantie dafür, dass die Hauptkomponenten die Abgrenzung zwischen verschiedenen Klassen erleichtern. Dies liegt daran, dass die berechneten Hauptachsen Achsen sind, die lediglich versuchen, die Projektionsenergie über alle Bilder hinweg zu maximieren , unabhängig von der Bildklasse. Im Gegensatz dazu behalten tatsächliche Bilder - ob originalgetreu rekonstruiert oder nicht - immer noch einige Aspekte räumlicher Unterschiede bei, die dazu beitragen können oder sollten, eine Klassifizierung zu ermöglichen.

Spacey
quelle
1
@amoeba Ja, ich habe einen vollständig verbundenen NN als Klassifikator verwendet. Die Eingabe war entweder der ursprüngliche NxP-Datensatz oder der NxK-Datensatz. Wenn alle Dinge gleich sind, hat das erstere großartig geklappt, das letztere hat überhaupt nichts gelernt.
Spacey
1
@amoeba Entschuldigung, lassen Sie mich klarstellen: Im ursprünglichen Experiment trainiere ich alle Bilder im ursprünglichen Raum. Das heißt, X = NxP-Matrix, N ist die Anzahl der Bilder und P ist die Anzahl der Pixel pro Bild. Im zweiten Experiment, Zug I auf X_new die eine NxK - Matrix ist, wobei jede Zeile der K hat Hauptkomponenten - dh die k Basis Koeffizienten , für jedes Bild. (X_neu = X * U [0: k]). In diesem Fall findet kein Lernen statt.
Spacey
1
@amoeba In meinem Experiment habe ich also K = 10, 50 und sogar 100 verwendet. Zu Ihrer Information: Im CIFAR-10-Datensatz war der größte Teil der Energie in den oberen 50 Eigenvektoren enthalten. (Ich bin sogar bis k = 3072 = P gegangen, und es wurde immer noch nichts gelernt). (Bitte beachten Sie, dass dies auf der Basis der Koeffizienten selbst geschehen ist. Wenn ich andererseits die Bilder aus K = 50 Eigenvektoren rekonstruiert habe , dh X_neu = X * U [0: k = 50] * U [0 : k = 50] .T, dann bekomme ich sehr vernünftige Ergebnisse).
Spacey
1
@amoeba Ja, ich habe einen unberührten Testsatz, der am Ende auf dem erlernten NN ausgeführt wird. Die Vorverarbeitung der Bilder ist eine einfache Entbedeutung jedes Merkmals. (Pixel). Ich habe sichergestellt, dass ich nach und vor PCs die gleiche Vorverarbeitung und die gleichen Statistiken habe. Lassen Sie mich Folgendes tun: Ich gehe zurück zum Code und führe meine Ergebnisse erneut aus und poste sie erneut. Ich werde dich anrufen, wenn ich das tue.
Spacey
2
Ich bestehe darauf, dass dies nicht durch die von mir bereitgestellten Links bestätigt wird. Die Links besagen, dass 50 PCs nicht unbedingt die Klassen sowie alle 3072-Dimensionen trennen. das ist richtig. 50 PCs und 3072 Dimensionen, die aus den 50 PCs rekonstruiert wurden, trennen die Klassen jedoch in genau gleichem Maße . Es ist eine einfache mathematische Tatsache. Sie können NN, das für Rekonstruktionen geschult ist, manuell in NN umwandeln, das auf PCs funktioniert, und es funktioniert identisch. Ich kann nicht erklären, warum Ihr Netzwerk bei den Rekonstruktionen besser abschneidet.
Amöbe

Antworten:

1

Ich stimme allen Kommentaren von @amoeba zu. Würde aber ein paar Dinge hinzufügen.

Der Grund, warum PCA für Bilder verwendet wird, liegt darin, dass es als "Merkmalsauswahl" fungiert: Objekte erstrecken sich über mehrere Pixel, sodass korrelierte Änderungen über mehrere Pixel hinweg auf Objekte hinweisen. Wenn Sie nicht korrelierte Pixeländerungen wegwerfen, wird das "Rauschen" beseitigt, was zu einer schlechten Verallgemeinerung führen kann.

Im Allgemeinen schneiden nns (unter Verwendung des Gradientenabfalls) mit sphärischen Eingaben (dh nicht korrelierten normalisierten Eingaben) besser ab. Dies liegt daran, dass Ihre Fehleroberfläche dann symmetrischer ist und die einzelne Lernrate besser funktioniert (Sie benötigen eine kleine Lernrate bei stark gekrümmten Eingaben) Richtungen und eine große Lernrate in flachen Richtungen).

Haben Sie auch Ihre Eingaben (gut) normalisiert oder nur dekorreliert?

Haben Sie die l2-Regularisierung verwendet? Dies hat einen ähnlichen Effekt wie die PCA-Regularisierung. Bei korrelierten Eingaben werden kleine ähnliche Gewichte hervorgehoben (dh das Rauschen gemittelt, große Gewichte bestraft, damit einzelne Pixel keinen unverhältnismäßigen Einfluss auf die Klassifizierung haben können) (siehe z. B. Elemente des statistischen Lernbuchs), sodass Sie möglicherweise keinen Nutzen für PCA gesehen haben, weil das l2 Die Regularisierung war bereits wirksam. Oder vielleicht war das nn zu klein, um zu überpassen.

Zuletzt haben Sie die Parameter neu optimiert ... Ich würde erwarten, dass Sie nach dem Wechsel zu den ersten k Hauptkomponenten eine andere Lernrate und andere Parameter benötigen würden.

seanv507
quelle
0

Per Definition entfernt PCA die Korrelation zwischen Variablen. Es wird vor der Klassifizierung verwendet, da nicht alle Klassifizierer gut mit hochdimensionalen Daten umgehen können (neuronale Netze jedoch) und nicht alle Klassifizierer gut mit korrelierten Variablen umgehen können (neuronale Netze jedoch). Insbesondere bei Bildern möchten Sie normalerweise keine Korrelation entfernen, und Sie möchten auch mehrere Ebenen, sodass benachbarte Pixel zu Bildmerkmalen zusammengefasst werden können. Ihre experimentellen Ergebnisse spiegeln die schlechte Wahl dieser Technik für diese spezielle Aufgabe wider.

David Ernst
quelle
0

Wenn Ihre Bilder (die Bilder, die Sie so vektorisiert haben, dass jedes Bild jetzt eine einzelne Zeile mit M Spalten ist, wobei M die Anzahl der Gesamtpixel x 32 x 32 x 3 ist) wenig bis keine Korrelation enthalten, ist die Anzahl der Hauptkomponenten erforderlich Erklären Sie die meisten Abweichungen (z. B.> 95%) in Ihren Datenerhöhungen. Um festzustellen, wie "machbar" PCA ist, ist es eine gute Idee, die erklärte Varianz zu überprüfen. In Ihrem Fall ist die maximale Anzahl von Komponenten N, da Ihre Datenmatrix eine Größe von NxM hat, wobei M> N ist. Wenn die Anzahl der erforderlichen PCs nahe 50000 liegt, ist die Verwendung von PCA nicht sinnvoll. Sie können die erklärte Varianz berechnen durch:

explained variance = 
sum of the eigenvalues that correspond to the PCs you use / 
sum of ALL eigenvalues

Ich würde die Anzahl der Hauptkomponenten wählen, was eine Varianz von mindestens mehr als 90% erklärt. Eine andere Methode zur Auswahl der richtigen Anzahl von PCs ist das Zeichnen der Anzahl von PCs gegenüber dem erläuterten kumulativen Varianzdiagramm. Im Diagramm können Sie die Zahl wählen, bei der die erklärte Varianz nicht mehr signifikant zunimmt.

Daher denke ich, dass Ihr Problem darin besteht, eine gute Anzahl von PCs auszuwählen.

Ein weiteres Problem könnte mit der Projektion der Testproben zusammenhängen. Wenn Sie Ihre Stichproben zum Erstellen des NN und zum Testen des NN geteilt haben, müssen Sie den Testdatensatz unter Verwendung der aus dem Trainingsdatensatz erhaltenen Eigenvektoren projizieren.

theGD
quelle