Technische Artikel

Mehr als nur Bildklassifikation: einige Einsatzmöglichkeiten für Deep Learning

Von Johanna Pingel, MathWorks


Deep-Learning-Netze erweisen sich als vielseitige Werkzeuge. Sie waren ursprünglich für die Bildklassifikation gedacht, werden jedoch zunehmend auch für viele andere Aufgaben eingesetzt. Sie bieten Genauigkeit und hohe Verarbeitungsgeschwindigkeit – und sie ermöglichen auch Anwendern, die keine Fachexperten sind, komplexe Analysen großer Datenmengen. Hier sind einige Beispiele für Aufgaben, für die Sie die Verwendung eines Deep-Learning-Netzes in Betracht ziehen können.

Textanalysen

In diesem Beispiel analysieren wir Daten von Twitter, um festzustellen, ob die Stimmung in Bezug auf einen bestimmten Begriff oder Ausdruck positiv oder negativ ist. Stimmungsanalysen haben viele praktische Anwendungen, wie z. B. Branding, politische Kampagnen und Werbung.

Für Stimmungsanalysen wurde (und wird) häufig Machine Learning eingesetzt. Ein Machine-Learning-Modell kann einzelne Wörter analysieren, aber ein Deep-Learning-Netz kann auf ganze Sätze angewendet werden und ist daher deutlich genauer.

Der Trainingsdatensatz besteht aus Tausenden von Beispiel-Tweets, die als positiv oder negativ klassifiziert sind. Hier einige Beispiele für Trainings-Tweets:

Tweet
Stimmung
„ICH LIEBE @MenschTierGesundheit ihr seid genial Leute!!“ Positiv
„@nicolerichie: was seid ihr schnuckelig auf dem Foto“ Positiv
„Zurück an die Arbeit!“ Negativ
„Hatte gerade die schlechteste Präsentation aller Zeiten!“ Negativ

Wir bereinigen die Daten, indem wir „Stoppwörter“ wie „das“ und „und“ entfernen, die dem Algorithmus nicht beim Lernen helfen. Dann laden wir ein LSTM-Netz (Long Short-Term Memory) hoch, ein rekurrentes neuronales Netz (RNN), das Abhängigkeiten im Zeitverlauf lernen kann.

LSTMs sind gut geeignet, um Sequenz- und Zeitreihendaten zu klassifizieren. Bei der Textanalyse berücksichtigt ein LSTM nicht nur einzelne Wörter, sondern auch Satzstrukturen und Wortkombinationen.

Der MATLAB®-Code für das Netz ist einfach:

    layers = [ sequenceInputLayer(inputSize)
    lstmLayer(outputSize,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer ] 

Auf einer GPU wird es sehr schnell trainiert: 30 Perioden (komplette Durchläufe durch die Daten) dauern nur 6 Minuten.

Sobald wir das Modell trainiert haben, kann es für neue Daten verwendet werden. Beispielsweise können wir mit ihm ermitteln, ob es eine Korrelation zwischen Stimmungswerten und Aktienkursen gibt.

Spracherkennung

In diesem Beispiel möchten wir Audiodateien mit gesprochener Sprache in Kategorien von Wörtern klassifizieren. Auf den ersten Blick sieht dieses Problem völlig anders aus als die Bildklassifikation, aber tatsächlich ist es ihr sehr ähnlich. Ein Spektrogramm ist eine 2D-Visualisierung der Signale in einer 1D-Audiodatei (Abbildung 1). Wir können es als Eingabe für ein neuronales Faltungsnetzwerk (CNN) verwenden, genau wie ein „richtiges“ Bild.

Abbildung 1: Ursprüngliche Audiosignale und entsprechende Spektrogramme.

Abbildung 1: Oben: ursprüngliche Audiosignale. Unten: entsprechende Spektrogramme.

Die spectrogram()-Funktion bietet eine einfache Möglichkeit, eine Audiodatei in die entsprechenden Frequenzen im Zeitverlauf zu konvertieren. Gesprochene Sprache verlangt eine besondere Form der Audioverarbeitung, da wichtige Merkmale in bestimmten Frequenzen verortet sind. Da wir erreichen möchten, dass sich das CNN auf diese Orte konzentriert, verwenden wir Mel-Frequenz-Cepstral-Koeffizienten, die auf die Bereiche der Frequenzen abzielen, in denen die relevantesten Aspekte des Gesprochenen liegen.

Wir verwenden Trainingsdaten, die gleichmäßig auf die Kategorien von Wörtern verteilt sind, in die wir Daten klassifizieren möchten.

Um weniger falsch positive Ergebnisse zu erhalten, nehmen wir eine Kategorie für Wörter auf, die mit den beabsichtigten Kategorien verwechselt werden können. Wenn das beabsichtigte Wort zum Beispiel „an“ ist, werden Wörter wie „am“, „Kahn“ und „Jan“ in die Kategorie „unbekannt“ aufgenommen. Das Netz muss diese Wörter nicht kennen, sondern nur berücksichtigen, dass sie nicht die zu erkennenden Wörter sind.

Dann definieren wir ein CNN. Da wir das Spektrogramm als Eingabe verwenden, kann die Struktur unseres CNN ähnlich sein wie für Bilder.

Nach dem Training klassifiziert das Modell das eingegebene Bild (Spektrogramm) in die entsprechenden Kategorien (Abbildung 2). Die Genauigkeit des Validierungssatzes liegt bei etwa 96 %.

Abbildung 2: Klassifikationsergebnis für das Wort „yes“.

Abbildung 2: Klassifikationsergebnis für das Wort „yes“.

Entrauschen von Bildern

Wavelets und Filter waren (und sind) gängige Methoden für das Entrauschen. In diesem Beispiel sehen wir, wie ein vortrainiertes Bildentrauschungs-CNN (Denoising CNN, DnCNN) auf eine Reihe von Bildern angewendet werden kann, die Gaußsches Rauschen enthalten (Abbildung 3).

Abbildung 3: Ursprüngliches Bild mit zugefügtem Gaußschem Rauschen.

Abbildung 3: Ursprüngliches Bild mit zugefügtem Gaußschem Rauschen.

Wir laden zunächst ein Bild mit Gaußschem Rauschen herunter.

imshow(noisyRGB);

Da es sich um ein Farbbild handelt und das Netz an Graustufenbildern trainiert wurde, besteht der einzige halbwegs schwierige Teil dieses Prozesses darin, das Bild in drei separate Kanäle zu unterteilen: Rot (R), Grün (G) und Blau (B).

noisyR = noisyRGB(:,:,1);
noisyG = noisyRGB(:,:,2);
noisyB = noisyRGB(:,:,3);

Wir laden das vortrainierte DnCNN-Netz.

net = denoisingNetwork('dncnn');

Wir können es nun verwenden, um Rauschen aus den einzelnen Farbkanälen zu entfernen.

denoisedR = denoiseImage(noisyR,net);
denoisedG = denoiseImage(noisyG,net);
denoisedB = denoiseImage(noisyB,net);

Wir kombinieren die entrauschten Farbkanäle zum entrauschten RGB-Bild.

denoisedRGB = cat(3,denoisedR,denoisedG,denoisedB);
imshow(denoisedRGB)
title('Denoised Image')

Ein kurzer visueller Vergleich des ursprünglichen (nicht verrauschten) Bilds mit dem entrauschten Bild zeigt, dass das Ergebnis durchaus in Ordnung ist (Abbildung 4).

Abbildung 4: Ursprüngliches (nicht verrauschtes) Bild und entrauschtes Bild.

Abbildung 4: Links: ursprüngliches (nicht verrauschtes) Bild. Rechts: entrauschtes Bild.

Vergrößern wir einige Details:

rect = [120 440  130  130];
cropped_orig = imcrop(RGB,rect);
cropped_denoise = imcrop(denoisedRGB,rect);
imshowpair(cropped_orig,cropped_denoise,'montage');

Die vergrößerte Ansicht in Abbildung 5 zeigt, dass das Entrauschen einige Seiteneffekte erzeugt hat – das ursprüngliche (nicht verrauschte) Bild ist sichtlich schärfer, insbesondere die Dachfläche und das Gras. Dieses Ergebnis kann akzeptabel sein oder das Bild muss je nach Verwendungszweck weiter bearbeitet werden.

Abbildung 5: Vergrößerte Ansicht.

Abbildung 5: Vergrößerte Ansicht.

Wenn Sie überlegen, ein DnCNN für das Entrauschen von Bildern zu verwenden, beachten Sie, dass es nur die Art von Rauschen erkennen kann, für die es trainiert wurde – in diesem Fall Gaußsches Rauschen. Um mehr Flexibilität zu erhalten, können Sie MATLAB und die Deep Learning Toolbox™ verwenden, um Ihr eigenes Netz aus vordefinierten Schichten zu trainieren oder um ein vollständig benutzerdefiniertes neuronales Entrauschungsnetz zu trainieren.

Veröffentlicht 2018

Artikel für ähnliche Einsatzgebiete anzeigen