[PYTHON] Abnormalitätserkennung mit MNIST durch Autoencoder (PyTorch)

Überblick

Hallo zusammen. Die Notstandserklärung wurde aufgehoben, aber die Situation ist immer noch unvorhersehbar. .. Es scheint, dass ich weiterhin zu Hause bleiben werde.

Dieses Mal möchte ich ein Anomalieerkennungsprogramm für MNIST mithilfe eines einfachen Autoencoders implementieren und überprüfen. Insbesondere ist das Modell wie folgt.

(Was Sie in diesem Artikel verstehen können, ist der grundlegende Ablauf der Autoencoder- und Anomalieerkennung, der Ablauf der MNIST-Anomalieerkennung mit PyTorch und die Überprüfungsergebnisse.)

Qiita hat bereits mehrere Artikel zur Erkennung von Anomalien mit MNIST veröffentlicht. Wo ist also die Nachfrage nach diesem Artikel? Eigentlich denke ich, dass der von *** PyTorch implementierte Punkt sich von den anderen *** unterscheidet.

Wenn ich google, ist dies ein Implementierungsbeispiel mit Keras. Da ich jedoch kürzlich zu PyTorch gewechselt bin, habe ich mich gefragt, ob ich PyTorch implementieren könnte, aber ich konnte es nicht finden, also habe ich es selbst implementiert. .. Dann werde ich zur Erklärung kommen.

*** Der gesamte diesmal implementierte Code ist unter [hier] verfügbar (https://github.com/satolab12/anomaly-detection-using-autoencoder-PyTorch). *** ***

Autoencoder und Anomalieerkennung

Lassen Sie uns einen kurzen Blick darauf werfen, wie Autoencoder auf Aufgaben zur Erkennung von Anomalien angewendet wird. (Wenn Sie wissen, lesen Sie das Kapitel nach der Implementierung)

Über Autoencoder

Die Struktur des Modells ist unten dargestellt.

Die Idee des Autoencoders ist sehr einfach. Es handelt sich um ein Modell, das hochdimensionale Daten mit Bildern usw. mithilfe eines Encoders in latente Variablen codiert und das Bild mithilfe eines Decoders decodiert. Was sind die Vorteile der Zuordnung zu einem latenten Raum? Dies basiert auf der Diversitätshypothese. Siehe die Verteilung unten.

Quelle: [hier](https://blog.albert2005.co.jp/2014/12/11/%E9%AB%98%E6%AC%A1%E5%85%83%E3%83%87% E3% 83% BC% E3% 82% BF% E3% 81% AE% E5% 8F% AF% E8% A6% 96% E5% 8C% 96% E3% 81% AE% E6% 89% 8B% E6% B3% 95% E3% 82% 92swiss-roll% E3% 82% 92% E4% BE% 8B% E3% 81% AB% E8% A6% 8B% E3% 81% A6% E3% 81% BF% E3% 82% 88 /)

Das Obige wird als Schweizer Rollenverteilung bezeichnet. Das Bild ist dreidimensional, aber betrachten Sie es als Beispiel für hochdimensionale Daten. Wenn Sie genau hinschauen, können Sie feststellen, dass es einige Teile gibt, in denen die Daten recht spärlich sind. Wenn dies in zwei Dimensionen abgebildet werden kann (ein Bild, das sich bis zu einer Ebene erstreckt), kann gefolgert werden, dass die ursprüngliche Verteilung in einem niedrigdimensionalen Raum ausgedrückt werden kann. Allgemeiner werden die Daten, die im höherdimensionalen Raum existieren, als niedrigdimensionale mehrdimensionale Hypothese angesehen, die als mehrdimensionale Hypothese bezeichnet wird.

Zurück zur Geschichte des Autoencoders: Der Encoder wurde von einem hochdimensionalen Raum auf einen niedrigdimensionalen latenten Raum abgebildet. Mit anderen Worten, die "Merkmale" hochdimensionaler Daten wie Bilder werden extrahiert und als latente Variablen behandelt. Die Originaldaten werden aus diesem niedrigdimensionalen "Merkmal" decodiert.

Anwendung zur Erkennung von Anomalien

Dieses Autoencoder-Framework wird häufig bei der Erkennung von Anomalien angewendet [1]. Der Zweck der Anomalieerkennung besteht darin, zu erkennen, ob das Modell für die Eingabedaten "normal" oder "abnormal" ist. Diese Problemstellung ist ein Rahmen für die Mustererkennung beim überwachten Lernen, der häufig verwendet wird. Leider werden in vielen Fabriken, in denen die Erkennung von Anomalien tatsächlich angewendet wird (visuelle Inspektion), Anomaliedaten normalerweise nicht erfasst. Daher kann ein überwachter Ansatz wie die Mustererkennung nicht angewendet werden. Im Allgemeinen kann jedoch eine große Menge "normaler" Daten an Standorten wie Fabriken abgerufen werden. Autoencoder wird eingeführt, um dies zu nutzen und in die "Erkennung von Anomalien" einzubeziehen. Wie oben erläutert, kann Autoencoder Merkmale aus der Verteilung hochdimensionaler Daten extrahieren und sie einem niedrigdimensionalen latenten Raum zuordnen.

Mit anderen Worten: *** Sie können die Eigenschaften normaler Daten erfassen, indem Sie das Modell mit einer großen Menge normaler Daten trainieren. *** Wenn Sie "normale" Daten in das Modell eingeben, kann der Decoder natürlich die ursprüngliche Eingabe decodieren. Wenn jedoch "abnormale" Daten eingegeben werden, können sie nicht gut decodiert werden, da sie nicht die Funktion erfassen, die die abnormalen Daten ausdrücken kann. Mit diesem Trick wird eine Erkennung von Anomalien durchgeführt. Insbesondere können Anomalien erkannt werden, indem eine Differenz zwischen Eingabe und Ausgabe genommen und als Grad der Anomalie berechnet wird. *** *** Darüber hinaus sind die meisten Anwendungsbeispiele für die tatsächliche Erkennung von Anomalien "ohne Lehrer" oder "mit Semi-Lehrer", bei denen eine kleine Menge von Anomaliedaten verwendet wird.

Als nächstes hoffe ich, dass Sie Ihr Verständnis vertiefen, indem Sie die Implementierung und Experimente von MNIST überprüfen.

Implementierung / MNIST-Lastteil

Die Erkennung von Abnormalitäten erfolgt mit MNIST (Datensatz handgeschriebener Zahlen). Dieses Mal werden von 0 bis 9, die MNIST besitzt, diejenigen, die mit *** "1" gekennzeichnet sind, als normale Daten gelernt. *** *** Anschließend überprüfen wir, ob es erkannt werden kann, indem wir die mit "9" gekennzeichneten Daten als abnormale Daten verwenden.

Erstens können Sie MNIST-Daten einfach mithilfe des MNIST-Moduls der PyTorch-Dataset-Klasse laden. Da jedoch alle Daten von 0 bis 9 vorhanden sind, muss dies auf diejenigen mit beliebigen Bezeichnungen eingegrenzt werden. Ich habe die folgenden Klassen definiert.

main.py


class Mnisttox(Dataset):
    def __init__(self, datasets ,labels:list):
        self.dataset = [datasets[i][0] for i in range(len(datasets))
                        if datasets[i][1] in labels ]
        self.labels = labels
        self.len_oneclass = int(len(self.dataset)/10)

    def __len__(self):
        return int(len(self.dataset))

    def __getitem__(self, index):
        img = self.dataset[index]
        return img,[]

Bei der Initialisierungsmethode werden nur die Daten, die der Liste einer als Argument angegebenen Bezeichnung entsprechen, als Variable in der Klasse übergeben. Der Rest entspricht dem Verhalten der normalen Dataset-Klasse.

Der wesentliche Autoencoder ist wie folgt definiert.

main.py


class Autoencoder(nn.Module):
    def __init__(self,z_dim):
        super(Autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(28 * 28, 256),
            nn.ReLU(True),
            nn.Linear(256, 128),
            nn.ReLU(True),
            nn.Linear(128, z_dim))

        self.decoder = nn.Sequential(
            nn.Linear(z_dim, 128),
            nn.ReLU(True),
            nn.Linear(128, 256),
            nn.ReLU(True),
            nn.Linear(256, 28 * 28),
            nn.Tanh()
        )

    def forward(self, x):
        z = self.encoder(x)
        xhat = self.decoder(z)
        return xhat

Jedes ist ein einfaches dreischichtiges. Beim Lernen wird eine MSE zwischen Eingabe und Ausgabe benötigt, und durch Minimieren dieser wird gelernt, die Eingabe zu rekonstruieren. Beginnen wir nun mit dem Experiment.

Experiment / Diskussion

Wie oben erwähnt, sind die Trainingsdaten nur das Bild von "1", und ungefähr 6.000 Bilddaten werden trainiert. Mischen Sie für die Testdaten die Daten von "1" und "9" und prüfen Sie, ob "9" korrekt als Anomalie identifiziert werden kann. Der Absolutwert der Differenz zwischen Eingabe und Ausgabe wird verwendet, um den Grad der Anomalie zu definieren.

Der Verlustübergang ist unten dargestellt.

Die Modelleingabe (oben), ihre Ausgabe (Mitte) und ihr Differenzbild (unten) sind unten dargestellt.

result.png

Wie erwartet können Sie sehen, dass das gelernte Bild von "1" erfolgreich rekonstruiert wurde, aber die als abnormale Daten gemischten Daten von "9" nicht gut rekonstruiert wurden. Diesmal war es ein Modell mit nur einer einfachen, vollständig verbundenen Schicht, aber es scheint funktioniert zu haben.

Wenn Sie auf die Punktzahl in der unteren Reihe achten, können Sie auch sehen, dass der Wert groß wird, wenn abnormale Daten eingegeben werden. Tatsächlich wird eine Anomalieerkennung durchgeführt, indem ein Schwellenwert für den Grad der Anomalie festgelegt wird. In den meisten Fällen basiert die Festlegung des Schwellenwerts auf den von einem Experten erstellten Nachrichten.

Zusammenfassung

Dieses Mal haben wir die unbeaufsichtigte Anomalieerkennung durch MNIST mithilfe von PyTorch implementiert und überprüft. Wir haben auch den grundlegenden Ablauf der Erkennung von Anomalien mit dem Autoencoder erläutert. Dieser Artikel ist in Bezug auf technische Neuheiten subtil geworden, aber ich denke, es gibt Nachfrage in Bezug auf die Erkennung von MNIST-Anomalien durch PyTorch (ich bin möglicherweise der einzige, der dies glaubt). (Lacht) Ich habe die quantitative Bewertung der Anomalieerkennungsleistung (AUROC usw.) nicht angesprochen, weil ich befürchtet hatte, dass der Artikel überflüssig wird, aber ich möchte ihn in naher Zukunft zusammenfassen. Gleichzeitig möchte ich den Rahmen für die Erkennung von Anomalien durch GAN überprüfen. Kürzlich wurde eine Weiterentwicklung von Autoencoder, Anomalieerkennungs-Frameworks, die verschiedene GANs wie AnoGAN, EfficientGAN und AnoVAEGAN verwenden, veröffentlicht, und SOTA wurde nacheinander erworben. Von den zukünftigen Trends können Sie mehr erwarten.

Verweise

http://cedro3.com/ai/keras-autoencoder-anomaly/

Recommended Posts

Abnormalitätserkennung mit MNIST durch Autoencoder (PyTorch)
Abnormalitätserkennung durch Auto-Encoder mit Keras [Implementierungsbeispiel für Anfänger]
Erkennung von EKG-Datenanomalien durch Matrix Profile
Rekonstruktion von bewegten Bildern mit dem Autoencoder unter Verwendung von 3D-CNN
[Hinweis] Marktanomalieerkennung mit Minimum Covariance Determinant
Abnormalitätserkennung von Zeitreihendaten durch LSTM (Keras)
[Erkennung von Abnormalitäten] Erkennen Sie Bildverzerrungen durch Fernunterricht
Einführung in die Anomalieerkennung 2 Ausreißererkennung
Abnormalitätserkennung unter der Annahme einer multivariaten Normalverteilung nach der T ^ 2-Hotelmethode
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).