Als Übung in "Von Mosaikentfernung lernen: Modernes Deep Learning" von koshian2 wurde die Faltfunktion als Beispiel genommen. Dieses Mal möchte ich zusammenfassen, was ich über diese Faltungsfunktion verstanden habe. https://qiita.com/koshian2/items/aefbe4b26a7a235b5a5e
Dieses Buch ist auch für Leute wie mich verständlich, die mit maschinellem Lernen begonnen haben. Es wird in einer leicht verständlichen Reihenfolge anhand der Grundlagen erklärt. Insbesondere war es gut, dass das neueste Papier überprüft wurde. Die neuesten Artikel, die in allgemeinen Buchhandlungen verteilt werden, sind ungefähr ein oder zwei Jahre her. Es ist ein Buch, in dem Sie sich leidenschaftlich für tiefes Lernen fühlen, und ich bin froh, dass Sie es gekauft haben.
Faltung wird im Faltungs-Neuronalen Netz verwendet, das für tiefes Lernen bekannt ist. Irgendwie ist es ein küchenähnliches Wort, und ich habe das Gefühl, dass ich es vorerst in Worten sagen möchte.
Die Berechnung der Faltung erfolgt nach der im Bild gezeigten Methode. Nehmen Sie eine 3x3-Zelle aus der Eingabematrix, multiplizieren Sie sie mit einer Matrix, die als Faltungskern bezeichnet wird, und addieren Sie die Summe als Ausgabe. Dies unterscheidet sich von dem sogenannten Forward Propagation Network, in dem die Einheiten in der benachbarten Schicht vollständig verbunden sind (siehe Abbildung unten).
X=\left(
\begin{array}{cc}
0 & 1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 & 9 \\
10 & 11 & 12 & 13 & 14 \\
15 & 16 & 17 & 18 & 19 \\
20 & 21 & 22 & 23 & 24 \\
\end{array}
\right)
\\
kernel=\left(
\begin{array}{cc}
0 & 1 & 2 \\
3 & 4 & 5 \\
6 & 7 & 8 \\
\end{array}
\right)
Dieses Mal definieren wir die Eingabe als X in 5x5 Zeilen und den Kernelkoeffizienten als Kernel in 3x3 Zeilen.
c.ipynp
import numpy as np
def conv(inputs, kernel):
outputs = np.zeros((3,3),inputs.dtype)
for i in range(3): #Berechnen Sie dreimal in Zeilenrichtung.
for j in range (3): #Berechnen Sie dreimal in Spaltenrichtung.
patch= X[i:i+3,j:j+3]
prod = patch * kernel #Multiplizieren Sie die Masse und den Kernel.
sum = np.sum(prod) #Fügen Sie die Hänge hinzu.
outputs[i,j] = sum #Fügen Sie einen Wert in die Ausgabeebene ein.
return outputs
#Definiert eine Matrix von X. Der Punkt ist, es durch Umformen in 5x5 umzuwandeln.
X = np.arange(25,dtype=np.float32).reshape(5,5)
#Fügen Sie einen Wert in die Ausgabeebene ein.
kernel = np.arange(9, dtype = np.float32).reshape(3,3)
conv(X,kernel)
Outputs=\left(
\begin{array}{cc}
312 & 348 & 384 \\
492 & 528 & 564 \\
672 & 708 & 744 \\
\end{array}
\right)
Ich konnte rechnen.
Durch die Bildverarbeitung kann das Bild ausgeblendet, schwarzweiß gemacht und die Kanten verbessert werden. Dies geschieht durch den gerade zusammengefassten Faltungsprozess.
Hier ist das Originalfoto. Dies ist ein Foto, das ich gemacht habe, als ich letztes Jahr ins Aquarium ging.
Verarbeiten Sie das Bild mit einem Kantenverbesserungsfilter. Bei Verwendung von Tensorflow ist die Reihenfolge der Tensorachsen sinnvoll. Im Bild ist die Reihenfolge im Wesentlichen Batch, vertikale Auflösung, horizontale Auflösung und Kanal. Daher ist es beim Hinzufügen von Achsen (Abmessungen) erforderlich, diese Reihenfolge zu beachten. Auch auf dem Programm wie unten
c.ipynp
float_img[ :, :, :, i:i+1]
Da es 3 Kanäle (R, G, B) für Farbbilder gibt, muss i für den 4. Kanal gedreht werden.
c.ipynp
kernel = []
kernel = np.array([0,0,0,0,10,0,0,0,0]).reshape(3,3,1,1)
kernel = 0.5* kernel.astype(np.float32)
outputs = []
float_img = tf.cast(img,tf.float32)/255.0
for i in range(3):
conv_result = tf.nn.conv2d(float_img[:,:,:,i:i+1],kernel,1,'SAME')
outputs.append(conv_result)
outputs = tf.concat(outputs, axis = -1)
fig = plt.figure(figsize=(14,14))
ax = fig.gca()
ax.imshow(outputs[0].numpy())
Der verwendete Kantenverbesserungsfilterkern ist wie folgt.
kernel=\frac{1}{2}\left(
\begin{array}{cc}
-1 & -1 & -1 \\
-1 & 10 & -1 \\
-1 & -1 & -1 \\
\end{array}
\right)
Auf diese Weise konnten wir den gleichen Effekt wie ImageFilter.EDGE_ENHANCE in PIL erzielen, einer Bibliothek, die häufig in der Bildverarbeitung verwendet wird. Auf diese Weise konnten wir bestätigen, dass das, was beim Falten und bei der Bildverarbeitung getan wird, dasselbe ist. Der Kernel kann unscharf, schwarzweiß sein oder die Ausgabe kann wie angegeben geändert werden. Sie können auch einen anderen Effekt erzielen, indem Sie diesen Wert abhängig von der Position des Eingangs ändern. Ich würde gerne mehr über diesen Kernel erfahren.
Das vollständige Programm finden Sie hier. https://github.com/Fumio-eisan/convol_20200307