Autoencoder bestehen aus zwei Hauptkomponenten: einem Encoder und einem Decoder . Der Encoder nimmt eine Eingabeprobe (das linke Katzenbild) und wandelt die Informationen in einen Vektor (den grünen Block) um, der im Wesentlichen eine Reihe von Zahlen ist. Wir nennen diesen Vektor latenten Vektor .
Dann haben wir den Decoder, der diesen latenten Zahlenvektor nimmt und ihn erweitert, um die Eingabeprobe zu rekonstruieren.
Nun fragen Sie sich vielleicht, warum wir das tun. Welchen Sinn hat es, eine Ausgabe zu erzeugen, die mit der Eingabe identisch ist?
Und die Antwort darauf ist: Es hat keinen Sinn.
Wenn wir Autoencoder verwenden, ist uns die Ausgabe selbst eigentlich egal, sondern vielmehr der in der Mitte konstruierte Vektor (der latente Vektor).
Dieser Vektor ist wichtig, da es sich um eine Darstellung des Eingabebildes handelt und wir mit dieser Darstellung möglicherweise mehrere Aufgaben erledigen könnten, beispielsweise das Rekonstruieren des Originalbildes.
Wir können uns den latenten Vektor als einen Code für ein Bild vorstellen, daher kommen die Begriffe „Kodieren“/„Dekodieren“.
Die Struktur eines Computer Vision Autoencoders
Wir zeigen nun die allgemeine Struktur eines Autoencoders und beschreiben anschließend die einzelnen Teile.
Die Architektur als Ganzes sieht ungefähr so aus:
Autoencoder bestehen aus 3 Teilen:
1. Encoder : Ein Modul, das die Eingabedaten in eine codierte Darstellung komprimiert, die normalerweise mehrere Größenordnungen kleiner ist als die Eingabedaten. Der Encoder besteht aus einer Reihe von Faltungsblöcken, gefolgt von Pooling-Modulen oder einfachen linearen Schichten, die die Eingabe in das Modell in einen kompakten Abschnitt komprimieren, der als „Engpass“ oder „Code“ bezeichnet wird.
2. Code : Wie Sie wahrscheinlich bereits verstanden haben, ist der Code der wichtigste und ironischerweise kleinste Teil des neuronalen Netzwerks. Der Code dient dazu, den Informationsfluss vom Encoder zum Decoder einzuschränken und so nur die wichtigsten Informationen durchzulassen. Der Code hilft uns dabei, eine Wissensdarstellung der Eingabe zu erstellen.
Der Code als komprimierte Darstellung der Eingabe verhindert, dass sich das neuronale Netzwerk die Eingabe merkt und die Daten überanpasst. Je kleiner der Code, desto geringer ist das Risiko einer Überanpassung. Diese Schicht wird im Allgemeinen als lineare Schicht oder als Tensor implementiert, wenn wir Faltungen verwenden.
3. Decoder : Die Decoderkomponente des Netzwerks fungiert als Interpreter für den Code.
Der Decoder hilft dem Netzwerk, die Wissensdarstellungen zu „dekomprimieren“ und rekonstruiert die Daten aus ihrer codierten Form. Die Ausgabe wird dann mit der Grundwahrheit verglichen. Dies wird normalerweise mit transponierten Faltungen implementiert, wenn wir mit Bildern oder linearen Schichten arbeiten.
6 Arten von Autoencodern für Computer Vision
Die Struktur, die wir zuvor hervorgehoben haben, ist ein allgemeiner Überblick. Tatsächlich gibt es mehrere Arten von Autoencodern. Hier sind die wichtigsten Autoencoder-Typen, die Sie kennen sollten:
Unvollständige Autoencoder
Ein nicht vollständiger Autoencoder verwendet ein Bild als Eingabe und versucht, dasselbe Bild als Ausgabe vorherzusagen, wodurch das Bild aus dem komprimierten Codebereich rekonstruiert wird. Nicht vollständiger Autoencoder sind unbeaufsichtigt , da sie keine Beschriftung als Eingabe verwenden, da das Ziel dasselbe ist wie die Eingabe. Die Hauptanwendung dieses Autoencodertyps besteht in der Dimensionsreduzierung .
Warum sollte man zur Dimensionsreduzierung Autoecoder anstelle anderer Methoden wie der Hauptkomponentenanalyse (PCA) einsetzen ? Weil PCA nur lineare Beziehungen aufbauen kann. Unvollständige Autoencoder können nichtlineare Beziehungen erlernen und sind daher bei der Dimensionsreduzierung leistungsfähiger.
Wenn wir effektiv alle nichtlinearen Aktivierungen aus einem nicht vollständig vollständigen Autoencoder entfernen und nur lineare Ebenen verwenden, reduzieren wir den Autoencoder auf etwas, das auf gleicher Augenhöhe mit PCA funktioniert.
Rauschunterdrückung bei Autoencodern
Das Ziel von Denoising Autoencodern besteht darin, Rauschen aus einem Bild zu entfernen.
Wie erreicht dieser Encodertyp das? Anstatt das Originalbild wie üblich in das Netzwerk einzuspeisen, erstellen wir eine Kopie des Eingabebilds, fügen künstliches Rauschen hinzu und speisen diese neue verrauschte Version des Bilds in das Netzwerk ein. Anschließend wird die Ausgabe mit dem tatsächlichen Bild verglichen.
Auf diese Weise beseitigt der Autoencoder das Rauschen, indem er eine Darstellung der Eingabe lernt, bei der das Rauschen leicht herausgefiltert werden kann. Im Folgenden zeigen wir, wie die Architektur eines Denoising Autoencoders aufgebaut ist.
Ein weiteres Beispiel, bei dem Denoising Autoencoder verwendet werden könnten, ist das Entfernen von Wasserzeichen aus einem Bild. Wir zeigen unten ein Beispiel.
Sparse AutoEncoder
Dieser Autoencodertyp bestraft ausdrücklich die Verwendung von versteckten Knotenverbindungen, um Überanpassung zu verhindern. Wie wird das erreicht? Wir konstruieren eine Verlustfunktion, um Aktivierungen innerhalb einer Schicht zu bestrafen.
Für jede beliebige Beobachtung regen wir unser Netzwerk an, eine Kodierung und Dekodierung zu lernen, die nur auf der Aktivierung einer kleinen Anzahl von Neuronen beruht. Dies ähnelt Dropout.
Dadurch kann das Netzwerk auf bestimmte Attribute der Eingabedaten reagieren. Während ein Undercomplete Autoencoder das gesamte Netzwerk für jede Beobachtung nutzt, muss ein Sparse Autoencoder je nach Eingabedaten selektiv Bereiche des Netzwerks aktivieren.
Daher haben wir die Kapazität des Netzwerks zum Speichern der Eingabedaten eingeschränkt, ohne die Fähigkeit des Netzwerks zum Extrahieren von Merkmalen aus den Daten einzuschränken.
Kontrastive AutoEncoder
Man würde erwarten, dass bei sehr ähnlichen Eingaben auch die gelernte Kodierung sehr ähnlich ist. Dies ist jedoch nicht immer der Fall.
Wie können wir also feststellen, ob sich die Kodierung eines Nachbarn stark von der Kodierung einer Eingabe unterscheidet? Wir können uns die Ableitungen der Aktivierungsfunktionen der verborgenen Schicht ansehen und verlangen, dass diese Ableitungen im Verhältnis zur Eingabe klein sind.
Damit versuchen wir sicherzustellen, dass wir bei kleinen Änderungen an der Eingabe immer noch einen sehr ähnlichen codierten Zustand beibehalten. Dies wird erreicht, indem wir innerhalb der Verlustfunktion einen Term hinzufügen, der diese Einschränkung hinzufügt.
Variationale AutoEncoder (VAE)
Mit klassischen Autoencodern ist es uns nicht möglich, Daten zu generieren. Warum ist das so?
Während der Trainingszeit füttern wir das Eingabebild und lassen das Modell die Encoder- und Decoderparameter lernen, die erforderlich sind, um das Bild erneut zu rekonstruieren.
Während der Testzeit benötigen wir nur den Decoder-Teil, da dieser das Bild generiert. Und um ein Bild zu generieren, müssen wir einen Vektor eingeben. Wir haben jedoch keine Ahnung, was dieser Vektor ist.
Wenn wir als Eingabe einfach ein paar zufällige Werte angeben, erhalten wir höchstwahrscheinlich ein Bild, das überhaupt nicht stimmig aussieht.
Was also tun wir, um dieses Problem zu lösen? Wir fügen dem Kodierungsteil des Netzwerks eine Einschränkung hinzu, die es zwingt, latente Vektoren zu generieren, die ungefähr einer Einheits-Gauß-Verteilung folgen. Auf diese Weise können wir aussagekräftige Werte abtasten und einen gültigen latenten Vektor erstellen.
Vektorquantisierter Variations-AutoEncoder (VQ-VAE)
Normale VAEs lernen eine kontinuierliche latente Darstellung, jeder Wert kann als Bild dekodiert werden. Angesichts der enormen Anzahl an Möglichkeiten fällt es dem Modell schwer, eine effektive Darstellung zu lernen.
Stattdessen möchten wir die mögliche Anzahl latenter Vektoren beschränken, damit sich das Modell auf diese konzentrieren kann. Mit anderen Worten möchten wir eine diskrete latente Darstellung.
Dazu verwenden wir die Vektorquantisierung. Die Idee besteht darin, ein Codebuch zu verwenden, eine gelernte Sammlung von Vektoren, die zur Erstellung der latenten Vektoren verwendet wird. In der Praxis kodieren wir zunächst ein Bild mit dem Encoder und erhalten so mehrere latente Vektoren.
Dann ersetzen wir alle latenten Elemente durch den entsprechenden, nächstgelegenen Vektor im Codebuch. Wir mussten mehr als ein latentes Element pro Bild ausgeben, um eine Kombination von Vektoren aus dem Codebuch zu erhalten. Dadurch können wir in einem größeren, aber dennoch diskreten Raum suchen.
Anwendungen für Autoencoder in der Computer Vision
Nachdem wir nun die Arten von Autoencodern kennen, schauen wir uns an, wie sie in konkreten Anwendungsfällen eingesetzt werden können. Bekannte Anwendungen von Autoencodern sind Bildglättung, Bildretuschierung, Bildkomprimierung und Dimensionsreduzierung. Im Folgenden gehen wir näher auf andere Anwendungsfälle der Computervision ein.
Autoencoder in der Anomalieerkennung
Autoencoder sind ein sehr leistungsfähiges Werkzeug zum Erkennen von Anomalien. Durch den Prozess des Kodierens und Dekodierens erfahren Sie, wie gut Sie Ihre Daten normalerweise rekonstruieren können. Wenn einem Autoencoder dann ungewöhnliche Daten präsentiert werden, die etwas zeigen, was das Modell noch nie zuvor gesehen hat, ist der Fehler bei der Rekonstruktion der Eingabe nach dem Code viel höher.
Ein Modell, das Katzenbilder ganz passabel verkleinern und neu erstellen kann, würde beispielsweise bei einem Giraffenbild sehr schlecht abschneiden. Rekonstruktionsfehler sind ein sehr guter Indikator für Anomalien, selbst bei sehr komplexen und hochdimensionalen Datensätzen.
Autoencoder in Segmentierungsaufgaben
Bei Autoencodern haben wir normalerweise ein Eingabebild und rekonstruieren dasselbe Eingabebild, indem wir die Autoencoder-Architektur durchlaufen. Was wäre, wenn wir statt derselben Eingabe wie unsere erwartete Ausgabe eine Segmentierungsmaske als erwartete Ausgabe bereitstellen würden? Auf diese Weise könnten wir Aufgaben wie die semantische Segmentierung durchführen. Tatsächlich wird dies von U-Net erledigt, einer Autoencoder-Architektur, die normalerweise für die semantische Segmentierung biomedizinischer Bilder verwendet wird .
Anwendung der Superauflösung
Superauflösung bedeutet im Wesentlichen, die Auflösung eines Bildes mit niedriger Auflösung zu erhöhen. Im Prinzip kann dies auch erreicht werden, indem man das Bild einfach hochskaliert und die neuen Pixelwerte mithilfe bilinearer Interpolation einfügt. Das generierte Bild wird dann jedoch unscharf, da wir die Informationsmenge im Bild nicht erhöhen können. Um dieses Problem zu lösen, können wir einem Autoencoder beibringen, die Pixelwerte für das hochauflösende Bild vorherzusagen.
Neue Daten generieren
Variational Autoencoder können sowohl zum Generieren von Bild- als auch von Zeitreihendaten verwendet werden. Die parametrisierte Verteilung im Code des Autoencoders kann zufällig abgetastet werden, um diskrete Werte für latente Vektoren zu generieren, die dann an den Decoder weitergeleitet werden können, was zur Generierung von Bilddaten führt. Variational Autoencoder können auch zum Modellieren von Zeitreihendaten wie Musik verwendet werden.
Abschluss
Nachdem Sie nun über Hintergrundwissen zu Autoencodern verfügen, sind Sie möglicherweise daran interessiert, mehr über andere wichtige Themen der künstlichen Intelligenz und des maschinellen Lernens zu erfahren, z. B. Liquid Neural Networks , oder Ihr erstes Computer Vision-Projekt mit Roboflow zu starten . Setzen Sie Ihr neues Wissen ein!
Zitieren Sie diesen Beitrag
Verwenden Sie den folgenden Eintrag, um diesen Beitrag bei Ihrer Recherche zu zitieren:
Petru Potrimba . (21. Oktober 2022). Was ist ein Autoencoder? Roboflow-Blog: https://blog.roboflow.com/what-is-an-autoencoder-computer-vision/
Besprechen Sie diesen Beitrag
Wenn Sie Fragen zu diesem Blogbeitrag haben, starten Sie eine Diskussion im Roboflow-Forum .