Wenn Sie den Code von Keras lesen, werden Sie auf verschiedene Matrixoperationen stoßen. Es ist sehr schwierig zu lesen, ohne den Inhalt dieser Operationen zu kennen. Dieses Mal werde ich den Code, den ich gelesen habe, freigeben, da ich die Matrixoperationen, die häufig in Keras angezeigt werden, anhand tatsächlicher Beispiele bestätigt habe.
Obwohl es Keras ist, bestätigte die Umgebung, dass diesmal eine alte Version der Ära ist, als es Teil des Tensorflusses war. Ich denke jedoch nicht, dass Matrixoperationen viel anders sind als jetzt.
Der Quellcode für diesen Artikel setzt die folgenden Importe voraus: Bitte kopieren Sie es und fügen Sie es ein, wenn es funktionieren soll.
import numpy as np
import warnings
import os
warnings.simplefilter('ignore')
import tensorflow as tf
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Input, Dropout, BatchNormalization
Die Bestätigungsmethode lautet wie folgt, vorausgesetzt, die Verarbeitung in Keras ist vorstellbar.
Erstellen Sie ein Keras-Modell, um eine Arithmetik durchzuführen
Bestätigen Sie den Berechnungsinhalt, indem Sie die Vorhersagemethode des Modells eingeben und das Ergebnis ausgeben.
concat Verketten Sie die Liste der Tensoren entlang der angegebenen Achse.
input1 = Input(shape=(2,))
input2 = Input(shape=(2,))
output = tf.concat(axis=1, values=[input1, input2])
model = Model(inputs=[input1, input2], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[10, 20], [20, 30]]), np.array([[20, 5], [30, 2]])]))
[[10. 20. 20. 5.]
[20. 30. 30. 2.]]
stack Stapeln Sie die Liste der Rang-R-Tensoren in Rang-R + 1-Tensoren. Der große Unterschied zu concat besteht darin, dass es nicht so wie es ist verbunden ist, sondern nach dem Hinzufügen einer Achse verbunden ist und es möglich ist, die Informationen vor der Verbindung auch nach der Verbindung abzurufen.
# stack
input1 = Input(shape=(2,))
input2 = Input(shape=(2,))
output = tf.stack(axis=1, values=[input1, input2])
model = Model(inputs=[input1, input2], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[10, 20], [20, 30]]), np.array([[20, 5], [30, 2]])]))
[[[10. 20.]
[20. 5.]]
[[20. 30.]
[30. 2.]]]
expand_dims Fügen Sie eine Dimension der Größe 1 mit dem Index "Achse" hinzu.
input1 = Input(shape=(1,))
output = tf.expand_dims(input1, axis=1)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[10], [20], [30]])]))
[[[10.]]
[[20.]]
[[30.]]]
squeeze Das Gegenteil von expand_dims, wobei eine Dimension mit dem Index "Achse" vom Tensor ausgeschlossen wird.
input1 = Input(shape=(1,1,))
output = tf.squeeze(input1, axis=1)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10]], [[20]], [[30]]])]))
[[10.]
[20.]
[30.]]
reduce_max Berechnen Sie den Maximalwert eines Elements über die Abmessungen des Tensors.
Das Folgende ist eine 3x2-Matrix, die in den Dimensionen 0, 1 und 2 berechnet wird. Es ist interessant, dass in der 0. Dimension das Ergebnis gesendet wird, ohne die Dimension zu ändern, in der 1. Dimension ist das Ergebnis genau das gleiche und in der 2. Dimension wird die Reihenfolge reduziert.
input1 = Input(shape=(1,2))
output = tf.reduce_max(input1, axis=0)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))
input1 = Input(shape=(1,2))
output = tf.reduce_max(input1, axis=1)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))
input1 = Input(shape=(1,2))
output = tf.reduce_max(input1, axis=2)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))
[[30. 20.]
[30. 20.]
[30. 20.]]
[[10. 20.]
[20. 5.]
[30. 4.]]
[[20.]
[20.]
[30.]]
reduce_sum Berechnen Sie die Summe der Elemente der gesamten Tensordimension. In ähnlicher Weise habe ich versucht, die Quelle in 0 Dimensionen, 1 Dimensionen und 2 Dimensionen für eine 3x2-Matrix zu berechnen. Die Idee ist die gleiche wie bei redu_max.
input1 = Input(shape=(1,2))
output = tf.reduce_sum(input1, axis=0)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))
input1 = Input(shape=(1,2))
output = tf.reduce_sum(input1, axis=1)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))
input1 = Input(shape=(1,2))
output = tf.reduce_sum(input1, axis=2)
model = Model(inputs=[input1], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))
[[60. 29.]
[60. 29.]
[60. 29.]]
[[10. 20.]
[20. 5.]
[30. 4.]]
[[30.]
[25.]
[34.]]
matmul Abkürzung für "Multipliziert die Matrix", Multiplizieren der Matrix a mit der Matrix b, um a * b zu erzeugen. Es wird häufig für vollständig verbundene Schichten verwendet.
Das Folgende ist ein Beispiel, in dem eine 1x1-Matrix als Ergebnis der Berechnung einer 1x2- und 2x1-Matrix erzeugt wird.
input1 = Input(shape=(2,))
input2 = Input(shape=(2,1))
output = tf.matmul(input1, input2)
model = Model(inputs=[input1, input2], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[10, 20]]), np.array([[[1], [2]]])]))
[[[50.]]]
slice Geben Sie für den Tensor die Startposition und die Extraktionsgröße an und extrahieren Sie einen Teil des Tensors.
input1 = Input(shape=(4,))
input1_reshape = tf.reshape(input1, [4])
input2 = Input(shape=(1), dtype=tf.int32)
input2_reshape = tf.reshape(input2, [1])
input3 = Input(shape=(1), dtype=tf.int32)
input3_reshape = tf.reshape(input3, [1])
output = tf.slice(input1_reshape, input2_reshape, input3_reshape)
model = Model(inputs=[input1, input2, input3], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[1, 8, 3, 4]]), np.array([[1]]), np.array([[1]])]))
[8.]
gather Geben Sie den Index für den Tensor an und erhalten Sie das Element des Index.
Für die Liste [1,8,3,4] werden die Liste mit dem herausgenommenen 0. und 3. Element und die Liste mit dem herausgenommenen 1. und 2. Element als Elemente zurückgegeben. Wenn die Eingabeform nicht festgelegt ist, tritt ein Fehler auf, sodass die Umformung zwangsweise durchgeführt wird.
input1 = Input(shape=(4,))
input1_reshape = tf.reshape(input1, [4])
input2 = Input(shape=(2,2), dtype=tf.int32)
output = tf.gather(input1_reshape, input2)
model = Model(inputs=[input1, input2], outputs=[output])
print(model.summary())
print(model.predict(x=[np.array([[1, 8, 3, 4]]), np.array([[[0, 3],[1, 2]]])]))
[[[1. 4.]
[8. 3.]]]
――Dieses Mal werden nur einige der Berechnungen veröffentlicht, aber ich hoffe, dass sich Ihre Lesefähigkeit ein wenig verbessert hat. ――Selbst wenn Sie es der Eingabe von Keras 'Modell geben und es berechnen lassen, war es nicht glatt und aufgrund von Fehlern wie der Anzahl der nicht übereinstimmenden Dimensionen der Matrix ziemlich schwierig, aber es war sehr nützlich, um die Matrix zu verstehen. ――Es ist besonders wichtig, den Wert des Formarguments von Input mit der Form der Matrix abzugleichen, die für predcit angegeben wurde. ――Dieses Beispiel ist auch der Mindestcode zum Erstellen und Vorhersagen von Modellen, die mehrere Eingaben in Keras vornehmen. Daher denke ich, dass es in Zukunft nützlich sein wird, wenn komplexe Modelle erstellt werden.
Recommended Posts