[PYTHON] [Deep Learning von Grund auf neu] Implementieren Sie die Backpropagation-Verarbeitung in einem neuronalen Netzwerk mithilfe der Fehler-Back-Propagation-Methode

Einführung

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.

Implementierte Backpropagation-Verarbeitung im neuronalen Netzwerk

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

[Deep Learning von Grund auf neu] Implementieren Sie die Backpropagation-Verarbeitung in einem neuronalen Netzwerk mithilfe der Fehler-Back-Propagation-Methode
[Deep Learning von Grund auf neu] Informationen zu den Ebenen, die für die Implementierung der Backpropagation-Verarbeitung in einem neuronalen Netzwerk erforderlich sind
[Deep Learning von Grund auf neu] Beschleunigen des neuronalen Netzwerks Ich erklärte die Verarbeitung der Rückausbreitung
Lua-Version Deep Learning von Grund auf neu Teil 6 [Inferenzverarbeitung für neuronale Netze]
Tiefes Lernen von Grund auf neu (Vorwärtsausbreitung)
"Deep Learning von Grund auf neu" mit Haskell (unvollendet)
Deep Learning / Fehler-Backpropagation der Sigmoid-Funktion
[Python] [Verarbeitung natürlicher Sprache] Ich habe Deep Learning ausprobiert (auf Japanisch von Grund auf neu erstellt)
[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
Fehler-Back-Propagation-Methode (Back-Propagation)
Deep Learning von Grund auf neu
Implementieren Sie das neuronale Netzwerk von Grund auf neu
[Deep Learning] Führen Sie die neuronale SONY-Netzwerkkonsole über CUI aus
[Deep Learning von Grund auf neu] Anfangsgewicht des neuronalen Netzwerks bei Verwendung der Relu-Funktion
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Deep Learning von Grund auf 1-3 Kapitel
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 1
Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 3
Ein Amateur stolperte in Deep Learning von Grund auf neu. Hinweis: Kapitel 7
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 5
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 4
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 2
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Kapitel 7 [Error Back Propagation Method] P275 ~ (Mitte) [Lernen Sie, indem Sie sich mit Python bewegen! Neues Lehrbuch für maschinelles Lernen]
[Deep Learning von Grund auf neu] Methoden zur Aktualisierung der wichtigsten Parameter für neuronale Netze
Warum ModuleNotFoundError: In "Deep Learning from Grund" wird kein Modul mit dem Namen "didaset.mnist" angezeigt.
Tiefes Lernen von Grund auf neu (Kostenberechnung)
Deep Learning Memo von Grund auf neu gemacht
Deep Learning / Backpropagation von Matrixproduktfehlern
[Deep Learning von Grund auf neu] Ich habe versucht, Sigmoid Layer und Relu Layer zu implementieren
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 2 Logikschaltung von Perceptron
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
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
[Windows 10] Aufbau einer "Deep Learning from Scratch" -Umgebung
[Deep Learning von Grund auf neu] Über die Optimierung von Hyperparametern
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
Lua-Version Deep Learning von Grund auf neu Teil 5.5 [Bereitstellung von pkl-Dateien in Lua Torch]
[Für Anfänger] Was ist in Deep Learning von Grund auf neu geschrieben?
Selbststudien-Memo "Deep Learning from Grund" (unlesbares Glossar)
[Python / Maschinelles Lernen] Warum Deep Learning # 1 Perceptron Neural Network
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
GitHub des guten Buches "Deep Learning von Grund auf neu"
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Python: Tiefes Lernen in der Verarbeitung natürlicher Sprache: Grundlagen
Python vs Ruby "Deep Learning von Grund auf neu" Zusammenfassung
"Deep Learning from Grund" Memo zum Selbststudium (10) MultiLayerNet-Klasse
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 11) CNN