Ein auf Bilder spezialisiertes neuronales Netz. Während ein normales mehrschichtiges Perzeptron aus einer Eingangsschicht, einer Zwischenschicht und einer Ausgangsschicht besteht, weist das CNN auch eine Faltungsschicht, eine Poolschicht und eine lokal normalisierte Schicht (LRN-Schicht) auf.
Wenn Sie AlexNet (oben in ILSVRC2012) im Chainer-Beispiel betrachten, sieht es folgendermaßen aus:
# … (Weggelassen)
class AlexBN(chainer.Chain):
"""Single-GPU AlexNet with LRN layers replaced by BatchNormalization."""
insize = 227
def __init__(self):
super(AlexBN, self).__init__(
conv1=L.Convolution2D(3, 96, 11, stride=4),
bn1=L.BatchNormalization(96),
conv2=L.Convolution2D(96, 256, 5, pad=2),
bn2=L.BatchNormalization(256),
conv3=L.Convolution2D(256, 384, 3, pad=1),
conv4=L.Convolution2D(384, 384, 3, pad=1),
conv5=L.Convolution2D(384, 256, 3, pad=1),
fc6=L.Linear(9216, 4096),
fc7=L.Linear(4096, 4096),
fc8=L.Linear(4096, 1000),
)
self.train = True
# … (Weggelassen)
Es besteht aus 5 Faltungsschichten und 3 vollständig verbundenen Schichten. In diesem Artikel wird auch darauf hingewiesen, dass die Aktivierungsfunktionen ReLu, Multi-GPU, LRN und Pooling wichtig sind. Das obige Kettenbeispiel verwendet die Chargennormalisierung anstelle von LRN. Im Folgenden wird die Chargennormalisierung detailliert beschrieben.
L.Convolution2D(3, 96, 11, stride=4)
Die Formel zum Falten entfällt, da sie in verschiedenen Nachschlagewerken geschrieben ist. Hier wollen wir diese Funktion nutzen können. Erstens besteht die Faltung darin, ein Bild zu filtern und zu konvertieren. Wie das Bild verfügt der Filter über Variablen wie die Anzahl der Pixel und den Kanal. Unter der Annahme, dass die Anzahl der Pixel des Bildes $ N \ mal N $ und die Anzahl der Kanäle $ K $ beträgt, beträgt die Größe des Filters auch $ H \ mal H , genau wie die Größe des Bildes als $ N \ mal N \ mal K $ geschrieben wird. Schreiben Sie wie mal K $. Die Anzahl der Bild- und Filterkanäle ist gleich. Es können mehrere Arten von Filtern auf das Bild angewendet werden. Wenn Sie den Filter vom Typ $ M $ anwenden, wird die Anzahl der Kanäle im Ausgabebild in $ M $ konvertiert. Wenn Sie einen Filter anwenden, wird der Filter beim Bewegen teilweise angewendet, und die Breite der Bewegung wird als Schrittweite bezeichnet. Durch Erhöhen der Schrittweite können Bildmerkmale leichter übersehen werden, sodass eine kleinere Schrittweite wünschenswert ist. Das Bereitstellen virtueller Pixel außerhalb des Bildrandes wird als Auffüllen bezeichnet. Durch Auffüllen ist es möglich, die Verkleinerung des Bildes beim Falten zu unterdrücken. Wenn Sie möchten, dass die Größe der Eingabe entspricht, kürzen Sie die Auffüllgröße auf $ H / 2 $. Zusammenfassend ist das Argument von "pythonL.Convolution2D ()"
Wird sein. Es gibt keine Angabe bezüglich der Anzahl der Pixel im Eingabe- / Ausgabebild.
L.BatchNormalization(96)
Das Argument ist die Anzahl der Kanäle des zu normalisierenden Bildes. Dies entspricht der Anzahl der Ausgangskanäle der vorherigen Faltung ($ M $).
h = self.bn1(self.conv1(x), test=not self.train)
h = F.max_pooling_2d(F.relu(h), 3, stride=2)
Das Pooling wird durchgeführt, nachdem das Ergebnis der Faltungsschicht in ReLu eingegeben wurde. Beim Pooling wird auf einen bestimmten Bereich wie einen Filter geachtet und ein repräsentativer Wert für diesen Bereich gemäß einer bestimmten Regel ausgegeben. Infolgedessen kann eine Positionsinvarianz erhalten werden. Es gibt viele Variationen des Poolings.
AlexNet verwendet maximales Pooling.
Zusammenfassen der Argumente von F.max_pooling_2d ()
,
Auch hier ist die Anzahl der Eingabe- / Ausgabepixel nicht angegeben.
Im nächsten Artikel (schriftlich) werde ich das Ergebnis der Verwendung von AlexNet schreiben.
Recommended Posts