Rückvermehrung in CNN

14

Ich habe folgende CNN:

Netzwerkaufbau

  1. Ich beginne mit einem Eingabebild der Größe 5x5
  2. Dann wende ich die Faltung mit 2x2 Kernel und stride = 1 an, wodurch eine Feature-Map der Größe 4x4 erzeugt wird.
  3. Dann wende ich 2x2 Max-Pooling mit Stride = 2 an, wodurch die Feature-Map auf 2x2 verkleinert wird.
  4. Dann wende ich logistische Sigmoid.
  5. Dann eine vollständig verbundene Schicht mit 2 Neuronen.
  6. Und eine Ausgabeebene.

Nehmen wir der Einfachheit halber an, dass ich den Vorwärtsdurchlauf bereits abgeschlossen und δH1 = 0,25 und δH2 = -0,15 berechnet habe

Nach dem vollständigen Vorwärtsdurchlauf und dem teilweise abgeschlossenen Rückwärtsdurchlauf sieht mein Netzwerk folgendermaßen aus:

Netzwerk nach Forward Pass

Dann berechne ich Deltas für die nichtlineare Schicht (logistisches Sigma):

δ11=(0.250.61+0.150.02)0.58(10.58)=0.0364182δ12=(0.250.82+0.150.50)0.57(10.57)=0.068628δ21=(0.250.96+0,150,23)0,65(1-0,65)=0,04675125δ22=(0,25-1.00+-0,150,17)0,55(1-0,55)=-0,06818625

Dann propagiere ich Deltas zur 4x4-Ebene und setze alle Werte, die durch Max-Pooling herausgefiltert wurden, auf 0 und die Verlaufskarte sieht folgendermaßen aus:

Bildbeschreibung hier eingeben

Wie aktualisiere ich die Kernel-Gewichte von dort aus? Und wenn mein Netzwerk vor 5x5 eine andere Faltungsschicht hatte, welche Werte sollte ich verwenden, um die Kernelgewichtungen zu aktualisieren? Und ist meine Berechnung insgesamt korrekt?

koryakinp
quelle
Bitte klären Sie, was Sie verwirrt. Sie wissen bereits, wie die Ableitung des Maximums durchgeführt wird (alles ist null, außer wenn der Wert maximal ist). Vergessen wir also das Max-Pooling. Liegt Ihr Problem in der Faltung? Jeder Faltungs-Patch hat seine eigenen Ableitungen. Dies ist ein langsamer Berechnungsprozess.
Ricardo Cruz
Die beste Quelle ist das Deep-Learning-Buch - zugegebenermaßen keine einfache Lektüre :). Die erste Faltung ist das Gleiche wie das Teilen des Bildes in Patches und das Anwenden eines normalen neuronalen Netzwerks, wobei jedes Pixel mit der Anzahl der "Filter" verbunden ist, die Sie unter Verwendung einer Gewichtung haben.
Ricardo Cruz
1
Stellt sich im Wesentlichen die Frage, wie die Kernel-Gewichte mithilfe der Backpropagation angepasst werden?
JahKnows
@JahKnows ..und wie Gradienten für die Faltungsschicht berechnet werden, wenn das fragliche Beispiel gegeben ist.
Koryakinp
Gibt es eine Aktivierungsfunktion für Ihre Faltungsschichten?
JahKnows

Antworten:

8

Eine Faltung verwendet ein Prinzip der Gewichtsverteilung, das die Mathematik erheblich verkompliziert. Versuchen wir jedoch, durch das Unkraut zu kommen. Ich beziehe den größten Teil meiner Erklärung aus dieser Quelle .


Vorwärtspass

Wie Sie gesehen haben, kann der Vorwärtsdurchgang der Faltungsschicht ausgedrückt werden als

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

Rückausbreitung

Angenommen, Sie verwenden den als definierten mittleren quadratischen Fehler (MSE)

E=12p(tpyp)2

wir wollen bestimmen

Ewm,nlmnw0,01=0.13HK

(Hk1+1)(Wk2+1)

44w0,01=0.13x0,01=0.25

Ewm,nl=i=0Hk1j=0Wk2Exi,jlxi,jlwm,nl

Dies durchläuft den gesamten Ausgaberaum, bestimmt den Fehler, den die Ausgabe verursacht, und bestimmt dann den Beitragsfaktor des Kernelgewichts in Bezug auf diese Ausgabe.

Nennen wir den Fehlerbeitrag aus dem Ausgaberaum-Delta der Einfachheit halber und um den zurückpropagierten Fehler zu verfolgen,

Exi,jl=δi,jl

Der Beitrag der Gewichte

Die Faltung ist definiert als

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

somit,

xi,jlwm,nl=wm,nl(mnwm,nloi+m,j+nl1+bi,jl)

Wenn wir die Summe erweitern, stellen wir fest, dass die Ableitung nur dann ungleich Null ist m=mn=n

xi,jlwm,nl=oi+m,j+nl1

Dann zurück in unsere Fehlerbedingung

Ewm,nl=i=0Hk1j=0Wk2δi,jloi+m,j+nl1

Stochastische Gefälleabfahrt

w(t+1)=w(t)ηEwm,nl

Lassen Sie uns einige davon berechnen

import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05), 
              (0.4, 0.62, 0.22, 0.59, 0.1), 
              (0.11, 0.2, 0.74, 0.33, 0.14), 
              (0.47, 0.01, 0.85, 0.7, 0.09),
              (0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0), 
              (0, 0.0364, 0, 0), 
              (0, 0.0467, 0, 0), 
              (0, 0, 0, -0.0681)])

gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')

Array ([[0.044606, 0.094061], [0.011262, 0.068288]])

Ew


Bitte lassen Sie mich wissen, wenn es Fehler in der Ableitung gibt.


Update: Code korrigiert

JahKnows
quelle
Wie Ewm,nlwird aussehen, wenn mein Filter mehrere Kanäle hat?
Koryakinp
1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
Sun Bee
Ich möchte vorschlagen, diese Antwort zu überprüfen. Insbesondere könnte der in Python bereitgestellte Code überprüft werden
Duloren