Dieser Artikel ist eine leicht verständliche Ausgabe von ** Deep Learning von Grund auf neu. Kapitel 6 Fehler-Back-Propagation-Methode **. Ich konnte es selbst verstehen, also hoffe ich, dass Sie es bequem lesen können. Ich würde mich auch sehr freuen, wenn Sie sich beim Studium dieses Buches darauf beziehen könnten.
Im vorherigen Artikel konnte ich alle Teile implementieren, die für die Fehlerrückverteilungsmethode erforderlich sind. Daher möchte ich dieses Mal den Back-Propagation-Prozess im neuronalen Netzwerk implementieren, indem ich das Teil tatsächlich verwende und die Fehler-Back-Propagation-Methode durchführe.
** 1, Parameterinitialisierung / Layererstellung **
from collections import OrderedDict
class LayerNet:
def __init__(self, input_size, hiden_size, output_size, weight_init_std = 0.01):
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hiden_size)
self.params['b1'] = np.zeros(hiden_size)
self.params['W2'] = weight_init_std * np.random.randn(hiden_size, output_size)
self.params['b2'] = np.zeros(output_size)
#Schichterzeugung
self.layers = OrderedDict()#Bestelltes Wörterbuch
self.layers['Affine1'] = Affine(self.params['W1'],self.params['b1']) #Erstellen Sie alle affinen Ebenen auf der ersten Ebene der mittleren Ebene
self.layers['Relu1'] = Relu()#Erstellen Sie alle Relu-Ebenen auf der ersten Ebene der mittleren Ebene
self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2']) #Erstellen Sie alle affinen Ebenen für die zweite Ebene der mittleren Ebene
self.layers['Relu2'] = Relu() #Erstellen Sie alle Relu-Ebenen für die zweite Ebene der mittleren Ebene
self.lastLayer = SoftmaxWithLoss() #Ebenenerstellung von der Ausgabeebene zur Verlustfunktion
Bitte beachten Sie die Parameterinitialisierung, die mit der für das neuronale Netzwerk mit numerischer Differenzierung identisch ist.
Im nächsten Teil der Ebenengenerierung erstellen wir zuerst ein geordnetes Wörterbuch ** OrderDict **, um die Ebenen zu speichern und in einer Instanzvariablen zu speichern.
Fügen Sie als Nächstes die Ebenen im erstellten OrderDict in der Reihenfolge von der linken Seite des neuronalen Netzwerks aus ein. Ebenen werden der Reihe nach verwaltet, indem sie in das OrderDict eingefügt werden. Auf diese Weise können Sie die Vorwärtsausbreitungsverarbeitung einfach durchführen, indem Sie die for-Anweisung verwenden, um Ebenen einzeln zu extrahieren, und die Rückwärtsausbreitungsverarbeitung verwenden, indem Sie die for-Anweisung in umgekehrter Reihenfolge verwenden.
** 2, Vorhersagemethode, Verlustmethode, Genauigkeitsmethode, Gradientenausdruck mithilfe der Ebene implementieren **
from collections import OrderedDict
class LayerNet:
def __init__(self, input_size, hiden_size, output_size, weight_init_std = 0.01):
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hiden_size)
self.params['b1'] = np.zeros(hiden_size)
self.params['W2'] = weight_init_std * np.random.randn(hiden_size, output_size)
self.params['b2'] = np.zeros(output_size)
#Schichterzeugung
self.layers = OrderedDict()#Bestelltes Wörterbuch
self.layers['Affine1'] = Affine(self.params['W1'],self.params['b1']) #Erstellen Sie alle affinen Ebenen auf der ersten Ebene der mittleren Ebene
self.layers['Relu1'] = Relu()#Erstellen Sie alle Relu-Ebenen auf der ersten Ebene der mittleren Ebene
self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2']) #Erstellen Sie alle affinen Ebenen für die zweite Ebene der mittleren Ebene
self.layers['Relu2'] = Relu() #Erstellen Sie alle Relu-Ebenen für die zweite Ebene der mittleren Ebene
self.lastLayer = SoftmaxWithLoss() #Ebenenerstellung von der Ausgabeebene zur Verlustfunktion
def predict(self, x): #Führt eine Vorwärtsausbreitungsverarbeitung zur mittleren Schicht des neuronalen Netzwerks durch
for layer in self.layers.values():
x = layer.forward(x) #Verarbeiten Sie die geordneten Ebenen in der Reihenfolge mit der for-Anweisung
return x
def loss(self, x, t): #Führt eine Vorwärtsausbreitungsverarbeitung vom neuronalen Netzwerk zur Verlustfunktion durch
y = self.predict(x) #Prognosedaten erstellen
return self.lastLayer.forward(y,t) #Führt eine Vorwärtsausbreitungsverarbeitung von der Ausgabeschicht zur Verlustfunktion durch
def accuracy(self,x, t): #Geben Sie die richtige Antwortrate an
y = self.predict(x)
y = np.argmax(y, axis=1) #Löschen Sie das Etikett der korrekten Antwortvorhersage aus den Vorhersagedaten
if t.ndim != 1 : t = np.argmax(t, axis=1) #Richtige Antwortdaten sind eins_Wenn es heiß ist, ändern Sie es in ein eindimensionales Array
accuracy = np.sum(y == t) /float(x.shape[0]) #Geben Sie die richtige Antwortrate an
return accuracy
def gradient(self, x, t): #Verlaufsformel unter Verwendung der Rückausbreitung von Schichten
#forward
self.loss(x, t)
#backward
dout = 1
dout = self.lastLayer.backward(dout) #Rückausbreitung von Schichten von der Ausgangsschicht zur Verlustfunktion
layers = list(self.layers.values())
layers.reverse() #Kehren Sie die Reihenfolge um
for layer in layers: #Führen Sie die Backpropagation-Verarbeitung von der Ebene rechts von der Zwischenebene aus
dout = layer.backward(dout)
#Gradientenwiederherstellung
grads = {}
grads['W1'] = self.layers['Affine1'].dW
grads['b1'] = self.layers['Affine1'].db
grads['W2'] = self.layers['Affine2'].dW
grads['b2'] = self.layers['Affine2'].db
return grads
Das Vorhersageverfahren führt eine Vorwärtsausbreitungsverarbeitung des neuronalen Netzwerks durch. Wie ich etwas früher geschrieben habe, kann die Vorwärtsverbreitungsverarbeitung durchgeführt werden, indem die for-Anweisung in OrderDict verwendet wird, die Vorwärtsmethode in der richtigen Reihenfolge ausgeführt wird und der Ausgabewert mit return zurückgegeben wird.
Da die Verlustmethode die Vorhersagemethode plus die Aktivierungsfunktion und die Verlustfunktion der Ausgabeschicht ausführt, kann sie implementiert werden, indem das Ergebnis nach Durchführung der Vorhersagemethode als Weiterleitung der letzten Schicht verwendet wird.
Die Genauigkeit ist die gleiche wie bei der numerischen Differenzierung. Bitte beziehen Sie sich darauf.
Da der Gradientenausdruck unter Verwendung von Schichten durch das neuronale Netzwerk rückpropagiert werden kann, wird er implementiert, indem zuerst die Reihenfolge von OrderDict mit der umgekehrten Methode umgekehrt wird, dann mit der for-Anweisung in der Reihenfolge rückwärts ausgeführt wird und das Ergebnis mit return zurückgegeben wird. können.
Recommended Posts