[PYTHON] [Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~

Hintergrund

Kürzlich Deep Learning "[Deep Learning from Zero](https://www.amazon.co.jp/ Deep Learning from Zero - Theorie und Implementierung von Deep Learning, gelernt aus Python-Saito-Yasutake / dp / 4873117585)" Ich fange an zu studieren. Die Implementierung von Dropout ist ebenfalls aufgeführt, aber ich habe ein wenig mehr gegraben, um zu sehen, wie der Inhalt funktioniert.

Was ist ein Schulabbrecher?

Maschinelles Lernen hat das Problem des Überlernens, das sich auf Trainingsdaten spezialisiert hat. In Bezug auf Überlernen nehmen wir ein Beispiel für den Versuch, die Bedeutung anderer Sätze zu verstehen, indem wir Sätze und ihre Bedeutung auswendig lernen. Selbst wenn das Wort "Hashi" in gespeicherten Sätzen häufig "Brücke" bedeutet, wird "Hashi" in anderen Sätzen als "Ende" verstanden, auch wenn "Hashi" in anderen Sätzen als "Ende" verwendet wird. Bezieht sich auf eine Situation. (Ich verstehe nur die aktuelle Situation. Bitte kommentieren Sie, wenn Sie einen Fehler machen.) Dropout ist eine Technik, um dies zu verhindern. Eine ausführlichere Erklärung finden Sie unter hier.

Implementierung von Dropout

Hier, ・ Python3 ・ Numpy Ich benutze. Schauen wir uns nun die Implementierung der Dropout-Ebene an.

import numpy as np

class Dropout:
    """
    http://arxiv.org/abs/1207.0580
    """
    def __init__(self, dropout_ratio=0.5):
        self.dropout_ratio = dropout_ratio
        self.mask = None

    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
        else:
            return x * (1.0 - self.dropout_ratio)

    def backward(self, dout):
        return dout * self.mask

Überprüfen Sie die Verarbeitung des Inhalts während des Verschiebens

Zunächst der Initialisierungsteil.

    def __init__(self, dropout_ratio=0.5):
        self.dropout_ratio = dropout_ratio
        self.mask = None

Füllen Sie hier einfach das Argument dropout_ratio in eine interne Variable und initialisieren Sie die Dropout-Maske.

Als nächstes kommt der vordere Teil.

    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
        else:
            return x * (1.0 - self.dropout_ratio)

train_flg sollte für das Training True und für Inferenz False sein. Weitere Informationen zu diesem Bereich finden Sie unter "[Deep Learning from Zero](https://www.amazon.co.jp/ Deep Learning from Zero --- Theorie und Implementierung von Deep Learning, gelernt aus Python-Saito-Yasutake / dp / Bitte lesen Sie 4873117585) ". Lassen Sie uns jeden Prozess aufschlüsseln und den Prozessinhalt in Shell anzeigen (die Werte hier sind Beispiele).

#
>>> import numpy as np
>>> x = np.array([0,1,2,3,4])
>>> x
array([0, 1, 2, 3, 4])

#np.random(rand(*x.shape)Ausgabe von
>>> rand = np.random.rand(*x.shape)
>>> rand
array([0.15816005, 0.03610269, 0.86484777, 0.2235985 , 0.64981875])

#np.random.rand(*x.shape) > self.dropout_Verhältnis (0 hier.Ausgabe von 5)
>>> dropout_ratio = 0.5
>>> mask = rand > dropout_ratio
>>> mask
array([False, False,  True, False,  True])

#return x * self.Ausgabe der Maske
#Der Teil, der in der Maske falsch ist, wird 0, wenn er mit x multipliziert wird
>>> x * mask
array([0, 0, 2, 0, 4])

#return x * (1.0 - self.dropout_ratio)Ausgabe von
>>> x * (1.0 - dropout_ratio)
array([0. , 0.5, 1. , 1.5, 2. ])

Als nächstes kommt der rückwärtige Teil.

    def backward(self, dout):
        return dout * self.mask

Versuchen Sie, es in Shell wie für die Weiterleitung auszuführen. mask verwendet die von forward generierte und dout generiert eine geeignete. Tatsächlich wird die durch Vorwärts erzeugte Maske von Rückwärts geerbt.

#Dout generieren
>>> dout = [0.0, 0.1, 0.2, 0.3, 0.4]

#return dout * self.Ausgabe der Maske
>>> dout * mask
array([0. , 0. , 0.2, 0. , 0.4])

Lassen Sie uns abschließend sehen, wie Dropout implementiert wird. Diesmal nur vorwärts. Ich habe diesen Dropout einmal in einer Datei namens sample.py beschrieben.

>>> import numpy as np
>>> from sample import Dropout
>>> 
>>> dropout = Dropout()
>>> 
>>> x = np.array([0,1,2,3,4])

#Da Zufallszahlen generiert werden, ändert sich die Vorwärtsausgabe bei jeder Ausführung.
>>> dropout.forward(x)
array([0, 0, 2, 3, 0])
>>> dropout.forward(x)
array([0, 0, 0, 0, 4])
>>> dropout.forward(x)
array([0, 0, 2, 0, 4])

Ich konnte die Ausgabe von forward bestätigen. Versuchen Sie auch train_flg = Falsche und Rückwärtsbewegungen.

Recommended Posts

[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Deep Learning von Grund auf neu
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
Deep Learning / Deep Learning von Grund auf neu Kapitel 6 Memo
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 5]
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 6]
Deep Learning / Deep Learning von Grund auf neu Kapitel 7 Memo
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 10-2) Anfangswert des Gewichts
Selbststudien-Memo "Deep Learning from Grund" (unlesbares Glossar)
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
"Deep Learning from Grund" Memo zum Selbststudium (10) MultiLayerNet-Klasse
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 11) CNN
Deep Learning von Grund auf 1-3 Kapitel
Tiefes Lernen der Verstärkung 2 Implementierung des Lernens der Verstärkung
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 4 Implementierung der Verlustfunktion
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 19) Datenerweiterung
Anwendung von Deep Learning 2 von Grund auf neu Spam-Filter
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
Ich habe versucht, Dropout zu erklären
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Implementierung eines dreischichtigen neuronalen Netzwerks
Deep Learning / Deep Learning von Grund auf neu Kapitel 3 Memo
Deep Learning / Deep Learning von Null 2 Kapitel 5 Memo
Tiefes Lernen von Grund auf neu (Kostenberechnung)
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
Deep Learning / Deep Learning von Null 2 Kapitel 7 Memo
Deep Learning / Deep Learning von Null 2 Kapitel 8 Memo
Deep Learning / Deep Learning von Grund auf neu Kapitel 5 Memo
Deep Learning / Deep Learning von Grund auf neu Kapitel 4 Memo
Deep Learning / Deep Learning von Grund auf neu 2 Kapitel 3 Memo
Deep Learning Memo von Grund auf neu gemacht
Deep Learning / Deep Learning von Null 2 Kapitel 6 Memo
Selbststudien-Memo "Deep Learning from Grund" (Nr. 18) Eins! Miau! Grad-CAM!
Selbststudien-Memo "Deep Learning from Grund" (Nr. 15) TensorFlow-Anfänger-Tutorial
Tiefes Lernen von Grund auf neu (Vorwärtsausbreitung)
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
"Deep Learning von Grund auf neu" mit Haskell (unvollendet)
[Windows 10] Aufbau einer "Deep Learning from Scratch" -Umgebung
[Deep Learning von Grund auf neu] Über die Optimierung von Hyperparametern
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)
Schreiben Sie Ihre Eindrücke von der Deep Learning 3 Framework Edition, die von Grund auf neu erstellt wurde
Selbststudien-Memo "Deep Learning from Grund" (Nr. 13) Verwenden Sie Google Colaboratory
Kapitel 2 Implementierung von Perceptron Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
Deep Learning 1 Übung des Deep Learning
Python vs Ruby "Deep Learning von Grund auf neu" Zusammenfassung
Implementierung eines Deep Learning-Modells zur Bilderkennung
[Deep Learning von Grund auf neu] Layer-Implementierung von der Softmax-Funktion zum Überkreuzen von Entropiefehlern
Tiefes Lernen durch Implementierung (Segmentierung) ~ Implementierung von SegNet ~
[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
Deep Running 2 Tuning von Deep Learning
Deep Learning / LSTM Scratch Code
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Diagramm der Schrittfunktion, Sigmoidfunktion, ReLU-Funktion
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 17) Ich habe versucht, DeepConvNet mit Keras zu erstellen