[PYTHON] Verstehen Sie die Bilder verschiedener Matrixoperationen, die in Keras (Tensorflow) verwendet werden, anhand von Beispielen

Einführung

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.

Umgebung

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.

Vorsichtsmaßnahmen beim Betrieb der Probe

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

Bestätigungsmethode

Die Bestätigungsmethode lautet wie folgt, vorausgesetzt, die Verarbeitung in Keras ist vorstellbar.

  1. Erstellen Sie ein Keras-Modell, um eine Arithmetik durchzuführen

  2. Bestätigen Sie den Berechnungsinhalt, indem Sie die Vorhersagemethode des Modells eingeben und das Ergebnis ausgeben.

Lass es uns versuchen

concat Verketten Sie die Liste der Tensoren entlang der angegebenen Achse.

Quelle

    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]])]))

Ergebnis

[[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.

Quelle

    # 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]])]))

Ergebnis

[[[10. 20.]
  [20.  5.]]
 [[20. 30.]
  [30.  2.]]]

expand_dims Fügen Sie eine Dimension der Größe 1 mit dem Index "Achse" hinzu.

Quelle

    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]])]))

Ergebnis

[[[10.]]
 [[20.]]
 [[30.]]]

squeeze Das Gegenteil von expand_dims, wobei eine Dimension mit dem Index "Achse" vom Tensor ausgeschlossen wird.

Quelle

    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]]])]))

Ergebnis

[[10.]
 [20.]
 [30.]]

reduce_max Berechnen Sie den Maximalwert eines Elements über die Abmessungen des Tensors.

Quelle

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]]])]))

Ergebnis

[[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.

Quelle

    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]]])]))

Ergebnis

[[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.

Quelle

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]]])]))

Ergebnis

[[[50.]]]

slice Geben Sie für den Tensor die Startposition und die Extraktionsgröße an und extrahieren Sie einen Teil des Tensors.

Quelle

    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]])]))

Ergebnis

[8.]

gather Geben Sie den Index für den Tensor an und erhalten Sie das Element des Index.

Quelle

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]]])]))

Ergebnis

[[[1. 4.]
  [8. 3.]]]

abschließend

――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.

Referenz

Recommended Posts

Verstehen Sie die Bilder verschiedener Matrixoperationen, die in Keras (Tensorflow) verwendet werden, anhand von Beispielen
Zusammenfassung verschiedener Operationen in Tensorflow
[Python3] Grundlegendes zu Dateivorgängen
Mischen Sie Hunderttausende von Bildern gleichmäßig mit Tensorflow.
Korrigieren Sie die Argumente der in map verwendeten Funktion
Numerische Darstellung von Tagen in verschiedenen Sprachen
Untersuchen Sie die Beziehung zwischen TensorFlow und Keras in der Übergangszeit
Wird ab der Einführung von Node.js in der WSL-Umgebung verwendet
Identifizieren Sie den Namen aus dem Blumenbild mit Keras (Tensorfluss)
Aufzeichnung der ersten Herausforderung des maschinellen Lernens mit Keras
Verstehen Sie die Metropolitan Hasting-Methode (eine der Methoden in der Markov-Ketten-Monte-Carlo-Methode) mit der Implementierung
Lassen Sie uns die Bibliothek vorstellen, die derzeit von Ingenieuren mit ca. 3 Jahren Erfahrung in Django verwendet wird
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
[TensorFlow 2 / Keras] Ausführen des Lernens mit CTC Loss in Keras
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Verstärkungslernen in kürzester Zeit mit Keras mit OpenAI Gym
Einführung in das Potenzial von Plotlys Streudiagramm anhand praktischer Beispiele
Die Geschichte der Anzeige von Bildern mit OpenCV oder PIL (nur)
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Finden Sie die Eigenwerte einer reellen symmetrischen Matrix in Python
Ruft den Index jedes Elements der Verwirrungsmatrix in Python ab
Die Geschichte der Herabstufung der Version von Tensorflow in der Demo von Mask R-CNN.