Autoencoder können keine sinnvollen Funktionen lernen


24

Ich habe 50.000 Bilder wie diese beiden:

Datenbeispiel Daten example2

Sie zeigen Diagramme von Daten. Ich wollte Funktionen aus diesen Bildern extrahieren, also verwendete ich den von Theano (deeplearning.net) bereitgestellten Autoencoder-Code.

Das Problem ist, dass diese Autoencoder anscheinend keine Funktionen kennen. Ich habe RBM ausprobiert und es ist das gleiche.

MNIST-Dataset bietet nette Funktionen, aber meine Daten scheinen keine zu liefern. Ich füge folgende Beispiele bei:

Auf MNIST erstellte Filter:

nist filter

Filter erstellt durch Training auf meine Daten:

filtert aus meinen Daten

Ich habe viele verschiedene Permutationen für ausgeblendete Ebenengrößen und Trainingsepochen verwendet, aber die Ergebnisse sind immer gleich.

Warum funktioniert es nicht? Warum können Autoencoder keine Funktionen aus diesen Bildern extrahieren?

BEARBEITEN:

Für alle, die ein ähnliches Problem haben. Die Lösung war wirklich einfach und die Ursache wirklich dumm. Ich habe nur vergessen, die Pixelwerte von der RGB-Codierung neu zu skalieren, um im Bereich von 0 bis 1 zu schweben.

Das erneute Skalieren von Werten löste das Problem.

Antworten:


15

Das Debuggen von neuronalen Netzwerken umfasst normalerweise das Optimieren von Hyperparametern, das Visualisieren der erlernten Filter und das Zeichnen wichtiger Metriken. Können Sie uns mitteilen, welche Hyperparameter Sie verwendet haben?

  • Was ist Ihre Losgröße?
  • Wie hoch ist Ihre Lernrate?
  • Welche Art von Autoencoder verwenden Sie?
  • Haben Sie versucht, einen Denoising-Autoencoder zu verwenden? (Welche Korruptionswerte haben Sie versucht?)
  • Wie viele versteckte Ebenen und von welcher Größe?
  • Was sind die Abmessungen Ihrer Eingabebilder?

Das Analysieren der Trainingsprotokolle ist ebenfalls hilfreich. Zeichnen Sie ein Diagramm Ihres Rekonstruktionsverlusts (Y-Achse) als Funktion der Epoche (X-Achse). Konvergiert oder divergiert Ihr Rekonstruktionsverlust?

Hier ist ein Beispiel für einen Autoencoder für die Klassifizierung des menschlichen Geschlechts, der divergiert, nach 1500 Epochen gestoppt, Hyperparameter eingestellt (in diesem Fall eine Verringerung der Lernrate) und mit denselben Gewichten neu gestartet wurde, die divergierten und schließlich konvergierten.

Hier ist eine, die konvergiert: (Wir wollen dies)

Vanille "ungezwungen" kann auf ein Problem stoßen, bei dem sie einfach die Identitätszuordnung lernt. Dies ist einer der Gründe, warum die Community die Geschmacksrichtungen Denoising, Sparse und Contractive entwickelt hat.

Könnten Sie hier einen kleinen Teil Ihrer Daten posten? Ich würde Ihnen gerne die Ergebnisse eines meiner Autoencoder zeigen.

Nebenbei bemerkt: Vielleicht möchten Sie sich fragen, warum Sie überhaupt Grafiken verwenden, wenn diese Grafiken leicht als Datenvektor dargestellt werden können. Dh

[0, 13, 15, 11, 2, 9, 6, 5]

Wenn Sie das Problem wie oben beschrieben umformulieren können, wird die Lebensdauer Ihres Auto-Encoders wesentlich erleichtert. Es muss nicht erst lernen, wie man Bilder sieht, bevor es versuchen kann, die erzeugende Verteilung zu lernen.

Follow-up-Antwort (angesichts der Daten.)

Hier sind die Filter eines einschichtigen Denoising Autoencoders mit 1000 versteckten Einheiten. Beachten Sie, dass einige der Filter scheinbar zufällig sind. Das liegt daran, dass ich so früh mit dem Training aufgehört habe und das Netzwerk keine Zeit hatte, diese Filter zu lernen.

Hier sind die Hyperparameter, mit denen ich es trainiert habe:

batch_size = 4
epochs = 100
pretrain_learning_rate = 0.01
finetune_learning_rate = 0.01
corruption_level = 0.2

Nach der 58. Epoche hörte ich mit dem Vortraining auf, weil die Filter gut genug waren, um hier zu posten. Wenn ich Sie wäre, würde ich einen vollwertigen 3-Schichten-Denoising-Autoencoder mit einer 1000x1000x1000-Architektur trainieren, um anzufangen.

Hier sind die Ergebnisse des Feineinstellungsschritts:

validation error 24.15 percent
test error 24.15 percent

Auf den ersten Blick scheint es jedoch besser zu sein als der Zufall, wenn wir uns die Datenaufteilung zwischen den beiden Etiketten ansehen, sehen wir, dass sie genau den gleichen Prozentsatz hat (75,85% rentabel und 24,15% unrentabel). Das heißt, das Netzwerk hat gelernt, einfach "profitabel" zu reagieren, unabhängig vom Signal. Ich würde das wahrscheinlich für eine längere Zeit mit einem größeren Netz trainieren, um zu sehen, was passiert. Es sieht auch so aus, als würden diese Daten aus einem zugrunde liegenden Finanzdatensatz generiert. Ich würde empfehlen, dass Sie sich mit rekurrenten neuronalen Netzen befassen, nachdem Sie Ihr Problem wie oben beschrieben in Vektoren umformuliert haben. RNNs können dabei helfen, einige der zeitlichen Abhängigkeiten zu erfassen, die in solchen Zeitreihendaten zu finden sind. Hoffe das hilft.


Meine Batchgröße ist 20. Die Lernrate ist auf 0,1 eingestellt. Ich habe vergeblich versucht, Autoencoder zu kontrahieren und zu entrauschen. Ich benutze eine versteckte Ebene. Ich habe alles von 50 bis 1000 Neuronen ausprobiert. Ich skaliere die Bilder auf 25x25 neu - sie sind also noch kleiner als mnist. Für das, was es wert ist, lege ich alle meine Daten in dieses Archiv: Können Sie mir die Ergebnisse Ihrer Autoencoder und diese Daten zeigen?
b93dh44

Das Archiv: mega.co.nz/…
b93dh44

OK, ich habe ein Netzwerk mit diesen Daten trainiert. Siehe die Bearbeitung in der Antwort.
Sabalaba

Das sieht echt interessant aus. Könnten Sie Ihren Code posten? Ich würde es wirklich zu schätzen wissen. Ich glaube, ich habe möglicherweise einen Fehler in meinem Code, der verhindert, dass das Netzwerk trainiert. Mir ist aufgefallen, dass Sie eine Phase der Feinabstimmung haben? Ich denke mein Autoencoder trainiert nur ohne Feinabstimmung. Könnten Sie mir Ihre Lösung zeigen, wenn es Ihnen nichts ausmacht?
b93dh44

Ich kann meinen Code nicht veröffentlichen, da es sich um den meines Unternehmens handelt, aber ich kann Sie auf dieses Tutorial verweisen, das Beispielcode zum Erstellen eines Denoising-Autoencoders enthält: deeplearning.net/tutorial/dA.html . Alle Hyperparameter-Hinweise gelten für diesen Code.
Sabalaba

3

Ich habe nicht genug Repräsentanten, um einen Kommentar abzugeben, daher werde ich dies in die Antwort einfließen lassen. Ich kenne jedoch keinen genauen Grund:

  1. Das Muster im linken unteren Bereich ähnelt Ihrem zweiten Beispiel, und das Muster in der rechten unteren Ecke ähnelt Ihrem ersten Beispiel, wenn es genau untersucht wird. Die Frage ist, wie vielfältig Ihre Quelldaten sind. Wenn alle 50.000 Bilder Variationen desselben Musters sind, können diese 3 aussagekräftigen Funktionskarten ausreichen, damit der Autoencoder alle Ihre Daten erklärt und rekonstruiert.

  2. Zweitens möchten Sie möglicherweise einen Blick auf den Rekonstruktionsfehler und die tatsächlich rekonstruierten Bilder werfen. Wie gut sind die Ergebnisse? Wenn der Rekonstruktionsfehler gering ist, liegt möglicherweise eine Überanpassung vor, möglicherweise aufgrund der unten beschriebenen Gründe (oder die Kombination dieser drei Muster reicht gerade aus, um alle Daten zu beschreiben, an denen Sie interessiert sind). Andernfalls kann Autoencoder einfach nicht lernen, wie Sie Ihre Daten rekonstruieren, und Sie benötigen einen größeren Autoencoder oder einen besseren Trainingsalgorithmus.


1. Ich denke, dass diese Daten sehr unterschiedlich sind. Jedes dieser 50.000 Diagramme unterscheidet sich geringfügig. Ich denke, es ist unmöglich, dass der Autoencoder sie alle basierend auf nur 3 Filtern rekonstruieren kann. 2. Irgendwelche Tipps zur Schätzung des Rekonstruktionsfehlers? Der Code, den ich verwende, liefert den Fehler, aber es ist eine wirklich große Zahl, die mir nicht viel sagt. Soll ich den Rekonstruktionsfehler mit der Größe der Eingabe oder der Anzahl der ausgeblendeten Ebenen vergleichen?
b93dh44
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.