[PYTHON] Die Geschichte eines Mel-Icon-Generators

Einführung

Kennst du dieses Symbol?

Ja, es ist das Symbol des berühmten Melville . Es ist bekannt, dass es viele Menschen gibt, die Melville ihre Lieblingsfiguren zeichnen und als Twitter-Samune verwenden lassen und große Unterstützung erhalten haben. Das von dieser Person gezeichnete Symbol wird aufgrund seines einzigartigen Stils oft als "Mel-Symbol" bezeichnet. Beispiel eines typischen Mel-Symbols

(Jeweils von Yukatayu und Shun (Stand 19. Februar 2020))

Ich möchte auch eine Ikone wie diese! !! !! !! !! !! Also habe ich durch maschinelles Lernen einen Mel-Icon-Generator erstellt. In diesem Artikel möchte ich kurz die dafür verwendete Methode vorstellen.

Was ist GAN?

Für die Generierung verwenden wir eine Methode namens GAN (Generative Adversarial Networks).

is20tech001zu004-1.jpg Abbildung Zitat Original

Diese Technik kombiniert zwei Dinge: ein neuronales Netzwerk (Generator), das Bilder erzeugt, und ein neuronales Netzwerk (Discriminator), das identifiziert, ob die Eingabedaten ein Mel-Symbol sind oder nicht. Der Generator versucht, ein Bild zu erzeugen, das einem Mel-Symbol so weit wie möglich ähnelt, um den Diskriminator zu täuschen, und der Diskriminator lernt, das Bild genauer zu identifizieren. Während sich die beiden neuronalen Netze gegenseitig trainieren, kann der Generator Bilder erzeugen, die sich in der Nähe des Mel-Symbols befinden.

Datensatzerfassung

Damit der Generator Bilder erzeugen kann, die wie Mel-Symbole aussehen, und der Diskriminator erkennen kann, ob das Eingabebild ein Mel-Symbol ist, bringen Sie dem Lehrer so viele echte Mel-Symbole wie möglich. Sie müssen ein Dataset erstellen, das die Daten enthält, und es für das Training verwenden. Also ging ich auf Twitter herum, fand das Mel-Symbol Samune, speicherte es wiederholt und bekam mehr als 100 Blätter. Verwenden Sie dies zum Lernen.

Generator erstellen

Lassen Sie den Generator auf das zuvor vorbereitete Mel-Symbol schauen und lernen Sie, ein Bild zu generieren, das so aussieht. Das zu erzeugende Bild ist 64 x 64 Pixel groß und die Farbe beträgt RGB 3 Kanäle. Wenn der Generator jedes Mal ähnliche Daten generiert, läuft das Lernen nicht gut ab. Daher ist es erforderlich, so viele Arten von Bildern wie möglich zu generieren. Geben Sie daher eine Zahlenfolge aus Zufallszahlen zur Bilderzeugung in den Generator ein. Für diese Zahlenfolge wird ein später beschriebener Prozess, der als "Translokationsfaltung" bezeichnet wird, auf jede Faltungsschicht angewendet, um sie allmählich einem Bild mit 3 Kanälen mit 64 × 64 Pixeln und RGB näher zu bringen.

Was ist Translokationsfaltung?

Für eine normale Faltung, wie unten gezeigt, wird das Summenprodukt genommen und ausgegeben, während der Kernel verschoben wird. In pytorch kann es beispielsweise mit torch.nn.Conv2d implementiert werden.

Quelle Quelle

Andererseits wird bei der diesmal verwendeten Translokationsfaltung das Produkt mit dem Kern für jedes Element berechnet und die Summe der erhaltenen Ergebnisse genommen. Als Bild fühlt es sich an, als würde man das Zielelement erweitern. In pytorch kann es beispielsweise mit torch.nn.ConvTranspose2d implementiert werden.

Quelle

Diese Translokationsfaltungsschicht und die Selbstaufmerksamkeitsschicht (später beschrieben) überlappen sich, und die Anzahl der Ausgangskanäle in der letzten Schicht beträgt 3. (Entspricht jeweils rgb) Aus dem obigen Inhalt ergibt sich der Umriss des Generators, den Sie erstellen möchten, wie in der folgenden Abbildung dargestellt.

generator_structure.png

Dieser Generator verfügt über insgesamt 5 Translokationsfaltungsschichten, wobei eine Schicht namens Selbstaufmerksamkeit zwischen der 3. und 4. Schicht sowie zwischen der 4. und 5. Schicht liegt. Durch gleichzeitiges Betrachten von Pixeln mit ähnlichen Werten ist es möglich, das gesamte Bild mit relativ geringem Rechenaufwand auszuwerten.

Der auf diese Weise konfigurierte Generator gibt beispielsweise ein solches Bild aus, wenn es sich in einem verlernten Zustand befindet. (Das Ergebnis hängt von der Anzahl der eingegebenen Zufallszahlen ab.) Da es noch nicht gelernt wurde, kann nur so etwas wie Rauschen ausgegeben werden. Indem Sie sich jedoch gegenseitig mit dem neuronalen Netzwerk (Discriminator) trainieren, das identifiziert, ob die Eingabedaten ein Mel-Symbol sind oder nicht, was als nächstes erläutert wird, ist es möglich, ein solches Bild auszugeben.

Diskriminator erstellen

Bitten Sie den Diskriminator, sich das vom Generator oben erzeugte Bild anzusehen, um festzustellen, ob es sich um ein Mel-Symbol handelt. Der Punkt ist, eine Bilderkennung zu machen. Das Eingabebild ist 64 x 64 Pixel groß, die Farbe ist RGB 3 Kanäle und die Ausgabe ist ein Wert (Bereich 0 bis 1), der angibt, wie sehr es wie ein Mel-Symbol aussieht. Als Zusammensetzung werden fünf gewöhnliche Faltschichten gestapelt, und eine Selbstaufmerksamkeitsschicht ist zwischen der dritten und vierten Schicht und zwischen der vierten und fünften Schicht angeordnet. Die Figur ist wie folgt.

discriminator_structure.png

Lernmethode / Fehlerfunktion

Die Lernmethoden für Diskriminator und Generator sind wie unten beschrieben.

Diskriminator lernen

Wenn ein Bild eingegeben wird, gibt Discriminator eine Zahl von 0 bis 1 zurück, die angibt, wie sehr es wie ein Mel-Symbol aussieht. Geben Sie zuerst das tatsächliche Mel-Symbol ein und setzen Sie die Ausgabe (Wert von 0 bis 1) zu diesem Zeitpunkt auf $ d_ {real} $. Geben Sie als nächstes eine Zufallszahl in den Generator ein und lassen Sie ihn ein Bild erzeugen. Wenn dieses Bild in Discriminator eingegeben wird, wird auch ein Wert von 0 bis 1 zurückgegeben. Nennen wir das $ d_ {fake} $. Geben Sie die $ d_ {real} $ und $ d_ {fake} $, die auf diese Weise ausgegeben werden, in die unten beschriebene Verlustfunktion ein, um den für die Fehlerausbreitung verwendeten Wert zu erhalten.

Verlustfunktion

Eine der Methoden von GAN, SAGANs "Scharnierversion des gegnerischen Verlusts", verwendet die unten beschriebene Verlustfunktion. Einfach ausgedrückt, setzt diese Funktion $ l_ {i} $ und $ l_ {i} ^ {\ prime} $ in die richtige Bezeichnung, $ y_ {i} $ und $ y_ {i} ^ {\ prime} $ vom Diskriminator. Wenn der Ausgabewert $ M $ die Anzahl der Daten pro Mini-Batch ist

-\frac{1}{M}\sum_{i=1}^{M}(l_{i}min(0,-1+y_{i})+(1-l_{i}^{\prime})min(0,-1-y_{i}^{\prime}))

Wird ausgedrückt als. [^ 1] Diesmal $ y_ {i} = d_ {real} $, $ y_ {i} ^ {\ prime} = d_ {fake} $, $ l_ {i} = 1 $ (entspricht 100% Mel-Symbol) , $ L_ {i} ^ {\ prime} = 0 $ (zeigt an, dass es sich nicht um ein absolutes Mel-Symbol handelt)

-\frac{1}{M}\sum_{i=1}^{M}(min(0,-1+d_{real})+min(0,-1-d_{fake}))

Wird besorgt. Dies ist die Verlustfunktion des diesmal verwendeten Diskriminators. Adam wurde als Optimierungsmethode für die Fehlerausbreitung verwendet, und die Lernrate wurde auf 0,0004 eingestellt, und Adams primäres Moment und sekundäres Moment (exponentielle Dämpfungsrate, die für die Momentschätzung verwendet wurde) wurden auf 0,0 bzw. 0,9 eingestellt.

Generator lernen

Wenn eine Folge von Zahlen aus Zufallszahlen eingegeben wird, generiert der Generator ein Bild, während versucht wird, es so weit wie möglich wie ein Mel-Symbol aussehen zu lassen. Geben Sie zunächst die aus Zufallszahlen bestehende Zahlenfolge $ z_ {i} $ in den Generator ein, um ein Bild zu erhalten. Geben Sie es in Discriminator ein und geben Sie einen Wert aus, der angibt, wie sehr es wie ein Mel-Symbol aussieht. Nennen wir das $ r_ {i} $.

Verlustfunktion

In SAGANs "Scharnierversion des gegnerischen Verlusts" ist die Verlustfunktion des Generators wie folgt definiert:

-\frac{1}{M}\sum_{i=1}^{M}r_{i}

Es scheint, dass SAGAN empirisch funktioniert, wenn es wie folgt definiert wird. [^ 1] In Anbetracht der Tatsache, dass $ M $ die Anzahl der Daten pro Mini-Batch ist, wird das Beurteilungsergebnis von Discriminator so verwendet, wie es ist. Ich war ein wenig überrascht, aber wie wäre es damit? Adam wurde als Optimierungsmethode für die Fehlerausbreitung verwendet, und die Lernrate wurde auf 0,0001 eingestellt, und Adams primäres und sekundäres Moment wurden auf 0,0 bzw. 0,9 eingestellt. (Wie Diskriminator, außer Lernrate)

Gesamtbild

Das oben eingeführte Bild wird erneut gedruckt, aber der zuvor erstellte Generator und der Diskriminator werden auf diese Weise zu einem GAN kombiniert. is20tech001zu004-1.jpg

Generieren

Lernen Sie die Verwendung der gesammelten echten Mel-Symbole und lassen Sie den Generator Mel-Symbole generieren. Stellen Sie die Anzahl der Daten $ M $ pro Mini-Batch auf 5 ein. Das Ergebnis ist wie folgt. generated_img64_remastered.png __groß! !! !! !! !! !! !! !! !! !! !! __ __ __ Beeindruckt! !! !! !! !! !! !! !! !! !! !! __ __ Zum Vergleich wird oben ein Beispiel für Eingabedaten und unten das tatsächlich erzeugte Bild angezeigt. Außerdem ändert sich das generierte Ergebnis bei jeder Ausführung. Persönlich war ich ziemlich überrascht, dies mit Quellcode tun zu können, der nicht so lang ist. GAN ist wirklich toll! !! !! !! !! !! !! !!

Aufgabe

Ich habe etwas gemacht, das so etwas Großartiges kann, aber es gibt noch einige Punkte, die noch nicht gelöst wurden.

Quellcode

Der Code, den ich geschrieben habe, befindet sich in diesem Repository. https://github.com/zassou65535/image_generator

Zusammenfassung

GAN ist eine wahnsinnig gute Technik. Trotz des Moduseinbruchs konnten wir mit nur fast 100 Datensätzen etwas ganz in der Nähe des Mel-Symbols erstellen. Lassen Sie uns auch mit GAN ein beeindruckendes Bild erzeugen.

Bonus

Wenn Sie einfach alle von Ihnen gesammelten Mel-Symbole mitteln, sehen Sie das folgende Bild.

Verweise

[^ 1]: Lernen Sie während der Entwicklung von PyTorch Tiefes Lernen

Recommended Posts

Die Geschichte eines Mel-Icon-Generators
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Die Geschichte des Exportierens eines Programms
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Die Geschichte einer unveränderlichen Form
Die Geschichte der Verarbeitung A von Blackjack (Python)
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
Die Geschichte von sys.path.append ()
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Die Geschichte des Starts eines Minecraft-Servers von Discord
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Die Geschichte des Baus von Zabbix 4.4
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Die Geschichte von Python und die Geschichte von NaN
Die Geschichte der Teilnahme an AtCoder
Die Geschichte des "Lochs" in der Akte
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
Die Geschichte des Versuchs, den Client wieder zu verbinden
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Messen Sie die Assoziationsstärke in einer Kreuztabelle
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Die Geschichte der Manipulation globaler Python-Variablen
[Python] [Meta] Ist der Python-Typ ein Typ?
Die Geschichte, einen Slackbot zu erstellen, der beim Senden des Verarbeitungscodes ein GIF oder PNG ausgibt
Die Geschichte, deep3d auszuprobieren und zu verlieren
Dekodierung von Keras 'LSTM model.predict
Sprechen Sie über die Fluchtwahrscheinlichkeit eines zufälligen Gehens auf einem ganzzahligen Gitter
Holen Sie sich den Dateinamen des Verzeichnisses (glob)
Die Geschichte von pep8 wechselt zu pycodestyle
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
Beachten Sie den Abschluss eines zeitaufwändigen Befehls
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Die Geschichte von Django, wie er eine Bibliothek erstellt, die vielleicht etwas nützlicher ist
Die Geschichte von soracom_exporter (Ich habe versucht, SORACOM Air mit Prometheus zu überwachen)
Die Geschichte eines hochrangigen Technikers, der versucht, das Überleben der Titanic vorherzusagen
So berechnen Sie die Volatilität einer Marke
Die Geschichte des tiefen Lernens mit TPU
Visualisieren Sie die innere Schicht des neuronalen Netzwerks
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat