[PYTHON] [TensorFlow] Ich möchte Fenster mit Ragged Tensor verarbeiten

Einführung

Ragged Tensor, der Daten variabler Länge darstellt, die in TensorFlow 2.1 oder höher eingeführt wurden. Wenn Sie jedoch versuchen, mit normalem Tensor-Kleber zu schreiben, gibt es verschiedene Ich bin süchtig danach. Diesmal die Fensterverarbeitungsversion, die wahrscheinlich für die Signalverarbeitung verwendet wird. Ein Rahmen mit einer bestimmten Zeitbreite wird nach und nach verschoben, um eine Wellenform zu extrahieren, die in den Bereich des Rahmens fällt.

Überprüfungsumgebung

Was du machen willst

Wenn wir uns "x" als Stapel vorstellen, werden wir für jede Datenzeile einen kurzen Abschnitt der Wellenform ausschneiden. Die Länge der Daten variiert. Hier wird die Rahmenbreite auf 2 gesetzt und die Ausschnittposition um 1 verschoben. [3, 1, 4, 1] ist wie [[3, 1], [1, 4], [4, 1]].

Für den üblichen "Tensor" gibt es eine praktische Funktion namens tf.signal.frame, aber leider " Es kann nicht für "RaggedTensor" verwendet werden.

x = tf.ragged.constant([[3, 1, 4, 1], [], [5, 9, 2], [6], []])
print(tf.signal.frame(x, 2, 1)) # NG
# ValueError: TypeError: object of type 'RaggedTensor' has no len()
print(tf.signal.frame(x.to_tensor(), 2, 1)) #Es funktioniert, aber es kommen viele zusätzliche Nullen heraus
# tf.Tensor(
# [[[3 1]
#   [1 4]
#   [4 1]]
# 
#  [[0 0]
#   [0 0]
#   [0 0]]
# 
#  [[5 9]
#   [9 2]
#   [2 0]]
# 
#  [[6 0]
#   [0 0]
#   [0 0]]
# 
#  [[0 0]
#   [0 0]
#   [0 0]]], shape=(5, 3, 2), dtype=int32)

Lösung

Basierend auf "x.values", das die Werte darstellt, die aus der Chargendimension abgeflacht sind, sowie die Länge und den Versatz jeder Zeile, die von "RaggedTensor" erhalten wurden.

print(x.values)        #Tensor mit Werten
# tf.Tensor([3 1 4 1 5 9 2 6], shape=(8,), dtype=int32)
print(x.row_starts())  #Startindex (Offset) jeder Zeile in Werten
# tf.Tensor([0 4 4 7 8], shape=(5,), dtype=int64)
print(x.row_lengths()) #Länge jeder Zeile
# tf.Tensor([4 0 3 1 0], shape=(5,), dtype=int64)

Überlegen Sie für jede Zeile von "x", aus welchem Index von "x.values" die Werte entnommen werden sollen (*).

Zunächst einmal, wenn Sie einen RaggedTensor erstellen, der den ersten Index von (*) hat.

s = x.row_starts()
e = s + x.row_lengths() - 1
r = tf.ragged.range(s, e)
print(r)
# <tf.RaggedTensor [[0, 1, 2], [], [4, 5], [], []]>

Wenn Sie diejenigen kombinieren, die um einen Index erweitert wurden, können Sie außerdem sehen, wo Sie in "x.values" die Werte für das erwartete Ergebnis nach der Fensterverarbeitung bringen sollten. Die Ergebnisse entsprechen dem vorherigen Bulletin (*).

ind = tf.stack([r, r+1], axis=2)
print(ind)
# <tf.RaggedTensor [[[0, 1], [1, 2], [2, 3]], [], [[4, 5], [5, 6]], [], []]>

Danach können Sie tf.gather () verwenden, um die Werte von x.values basierend auf dem in ind eingegebenen Index abzurufen.

ret = tf.gather(x.values, ind)
print(ret)
# <tf.RaggedTensor [[[3, 1], [1, 4], [4, 1]], [], [[5, 9], [9, 2]], [], []]>

Wenn die Rahmenlänge 3 oder mehr beträgt

Die Art und Weise, "e" und "ind" zu machen, ist etwas anders, aber die allgemeine Idee ist dieselbe. Broadcast wird verwendet, um "ind" zu erstellen. Zu diesem Zweck wird am Ende eine Dimension der Länge 1 als "r [:,:, tf.newaxis]" hinzugefügt.

len_frame = 3
s = x.row_starts()
e = s + x.row_lengths() + 1 - len_frame
r = tf.ragged.range(s, e)
ind = r[:, :, tf.newaxis] + tf.range(0, len_frame, dtype="int64")
ret = tf.gather(x.values, ind)
print(ret)
# <tf.RaggedTensor [[[3, 1, 4], [1, 4, 1]], [], [[5, 9, 2]], [], []]>

Natürlich kann es auch verwendet werden, wenn len_frame = 2.

Wenn die Frame-Verschiebung 2 oder mehr beträgt

Es ist in Ordnung, wenn Sie die Schrittgröße von r ändern.

len_frame = 2
shift_frame = 2
s = x.row_starts()
e = s + x.row_lengths() + 1 - len_frame
r = tf.ragged.range(s, e, shift_frame)
ind = r[:, :, tf.newaxis] + tf.range(0, len_frame, dtype="int64")
ret = tf.gather(x.values, ind)
print(ret)
# <tf.RaggedTensor [[[3, 1], [4, 1]], [], [[5, 9]], [], []]>

Sie können auch shift_frame = 1 verwenden.

Wenn die Probe mehrdimensional ist

Beispielsweise werden in Stereo-Audio die L- und R-Werte als Paar gespeichert.

x = tf.ragged.constant([[[3, 2], [1, 7], [4, 1], [1, 8]], [], [[5, 2], [9, 8], [2, 1]], [[6, 8]], []])

Tatsächlich funktioniert es genauso wie zuvor.

len_frame = 2
shift_frame = 1
s = x.row_starts()
e = s + x.row_lengths() + 1 - len_frame
r = tf.ragged.range(s, e, shift_frame)
ind = r[:, :, tf.newaxis] + tf.range(0, len_frame, dtype="int64")
ret = tf.gather(x.values, ind)
print(ret)
# <tf.RaggedTensor [[[[3, 2], [1, 7]], [[1, 7], [4, 1]], [[4, 1], [1, 8]]], [], [[[5, 2], [9, 8]], [[9, 8], [2, 1]]], [], []]>

Die Anzahl der Dimensionen hat so stark zugenommen, dass ich nicht sagen kann, ob es passt, wenn ich es mir nur ansehe, aber es sollte in Ordnung sein ...

Recommended Posts

[TensorFlow] Ich möchte Fenster mit Ragged Tensor verarbeiten
[TensorFlow] Ich möchte die Indizierung für Ragged Tensor beherrschen
Ich möchte ○○ mit Pandas machen
Ich möchte mit Python debuggen
Ich möchte Objekte mit OpenCV erkennen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich möchte einen Blog mit Jupyter Notebook schreiben
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte datetime.datetime.now () auch mit pytest verspotten!
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Ich möchte ein Spiel mit Python machen
Ich möchte OREMO mit setParam sein!
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte ip vrf mit SONiC verwenden
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte pyenv + pipenv auch unter Windows machen
Ich möchte mit Djangos Migrate von vorne beginnen
[Ich möchte Bilder mit Tensorflow klassifizieren] (2) Lassen Sie uns Bilder klassifizieren
Ich möchte mit Python in eine Datei schreiben
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Ich möchte mit Jubatus (1) eine nicht autorisierte Anmeldung bei Facebook erkennen.
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte mich mit Backpropagation (tf.custom_gradient) (Tensorflow) selbst verwenden.
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Freigeben von Ordnern für Docker und Windows mit Tensorflow
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine Zeichenkette mit Hiragana teilen
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte manuell eine Legende mit matplotlib erstellen
Ich bin ein Windows-Benutzer, möchte aber Tensorflow ausführen
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich möchte einen Quantencomputer mit Python betreiben
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich möchte eine lokale Variable mit Lambda binden
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
[NetworkX] Ich möchte nach Knoten mit bestimmten Attributen suchen
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Daten mit Python analysieren können (Teil 4)
Für diejenigen, die mit TensorFlow2 maschinelles Lernen beginnen möchten
Ich möchte mit GAN Schwarzweißfotos von Erinnerungen ausmalen
Ich möchte Daten mit Python analysieren können (Teil 2)
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
Ich möchte den Multiprozessor-Pool von Python mit Strg + C (KeyboardInterrupt) beenden.
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen