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.
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.
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
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