[PYTHON] [TensorFlow] Je souhaite traiter des fenêtres avec Ragged Tensor

introduction

Ragged Tensor qui représente des données de longueur variable introduites dans TensorFlow 2.1 ou version ultérieure, mais si vous essayez d'écrire avec de la colle Tensor ordinaire, il existe plusieurs J'en suis accro. Cette fois, l'édition de traitement de fenêtre qui semble être utilisée pour le traitement du signal. Une image avec une certaine largeur de temps est décalée petit à petit pour extraire une forme d'onde qui se situe dans la plage de l'image.

Environnement de vérification

Chose que tu veux faire

Considérez `` x '' comme un lot et découpez une courte section de forme d'onde pour chaque ligne de données. La longueur des données varie. Ici, la largeur du cadre est définie sur 2 et la position de découpe est décalée de 1. "[3, 1, 4, 1]" est comme "[[3, 1], [1, 4], [4, 1]]".

Pour le Tensor '' habituel, il existe une fonction pratique appelée [tf.signal.frame](https://www.tensorflow.org/api_docs/python/tf/signal/frame), mais malheureusement ` Il ne peut pas être utilisé pour RaggedTensor ''.

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)) #Cela fonctionne, mais beaucoup de 0 supplémentaires sortent
# 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)

Solution

Basé sur x.values '', qui représente les valeurs qui sont aplaties hors de la dimension du lot, et la longueur et le décalage de chaque ligne obtenue à partir de RaggedTensor ''.

print(x.values)        #Tenseur avec valeurs
# tf.Tensor([3 1 4 1 5 9 2 6], shape=(8,), dtype=int32)
print(x.row_starts())  #Index de départ (offset) de chaque ligne en valeurs
# tf.Tensor([0 4 4 7 8], shape=(5,), dtype=int64)
print(x.row_lengths()) #Longueur de chaque ligne
# tf.Tensor([4 0 3 1 0], shape=(5,), dtype=int64)

Pour chaque ligne de x '', considérez à partir de quel index de x.values`` les valeurs doivent être extraites (*).

--La ligne 0 est `` [0, 1], [1, 2], [2, 3] ''

Tout d'abord, si vous créez un RaggedTensor qui a le premier index de (*)

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], [], []]>

De plus, si vous combinez ceux qui ont été avancés par un index, vous pouvez voir où dans x.values vous devez amener les valeurs pour le résultat attendu après le traitement de la fenêtre. Les résultats correspondent au bulletin précédent (*).

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

Après cela, vous pouvez utiliser tf.gather () pour obtenir les valeurs de x.values en fonction de l'index entré dans ```ind``.

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

Lorsque la longueur du cadre est de 3 ou plus

La façon de faire «e» et «ind» est un peu différente, mais l'idée générale est la même. La diffusion est utilisée pour créer «ind». Pour cela, une dimension de longueur 1 est ajoutée à la fin comme `` r [:,:, tf.newaxis] ''.

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]], [], []]>

Bien sûr, il peut être utilisé même lorsque `` len_frame = 2 ''.

Lorsque le décalage d'image est de 2 ou plus

Ce n'est pas grave si vous modifiez la taille de pas de `` r ''.

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]], [], []]>

Vous pouvez également utiliser `` shift_frame = 1 ''.

Si l'échantillon est multidimensionnel

Par exemple, en audio stéréo, les valeurs L et R sont stockées sous forme de paire.

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

En fait, cela fonctionne exactement de la même manière qu'avant.

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]]], [], []]>

Le nombre de dimensions a tellement augmenté que je ne peux pas dire si ça va juste en le regardant, mais ça devrait aller ...

Recommended Posts

[TensorFlow] Je souhaite traiter des fenêtres avec Ragged Tensor
[TensorFlow] Je souhaite maîtriser l'indexation pour Ragged Tensor
Je veux faire ○○ avec les Pandas
Je veux déboguer avec Python
Je veux détecter des objets avec OpenCV
J'ai essayé d'implémenter Autoencoder avec TensorFlow
Je veux écrire un blog avec Jupyter Notebook
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux moquer datetime.datetime.now () même avec pytest!
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
Je veux être OREMO avec setParam!
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
#Unresolved Je veux compiler gobject-introspection avec Python3
Je souhaite utiliser ip vrf avec SONiC
Je veux résoudre APG4b avec Python (chapitre 2)
Je veux faire pyenv + pipenv même sous Windows
Je veux recommencer avec Migrate de Django
[Je veux classer les images à l'aide de Tensorflow] (2) Classifions les images
Je veux écrire dans un fichier avec Python
Je veux convertir une image en WebP avec sucette
Je souhaite détecter une connexion non autorisée à Facebook avec Jubatus (1)
Je veux faire la transition avec un bouton sur le ballon
Je veux utiliser self avec Backpropagation (tf.custom_gradient) (tensorflow)
Je veux escalader une montagne avec l'apprentissage par renforcement
Comment partager des dossiers avec Docker et Windows avec tensorflow
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je veux AWS Lambda avec Python sur Mac!
Je souhaite créer manuellement une légende avec matplotlib
Je suis un utilisateur Windows mais je souhaite exécuter tensorflow
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
Je veux faire fonctionner un ordinateur quantique avec Python
J'ai essayé de trouver la classe alternative avec tensorflow
Je veux lier une variable locale avec lambda
Je veux pouvoir analyser des données avec Python (partie 3)
Je souhaite spécifier une autre version de Python avec pyvenv
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
[NetworkX] Je souhaite rechercher des nœuds avec des attributs spécifiques
Je veux faire une macro de clic avec pyautogui (désir)
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux pouvoir analyser des données avec Python (partie 4)
Pour ceux qui souhaitent démarrer l'apprentissage automatique avec TensorFlow2
Je veux colorier des photos en noir et blanc de souvenirs avec GAN
Je veux pouvoir analyser des données avec Python (partie 2)
Je veux faire une macro de clic avec pyautogui (Outlook)
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Je veux installer le package de requirements.txt avec poésie
[Visualisation] Je veux dessiner un beau graphique avec Plotly
Je veux mettre fin au pool multiprocesseur de python avec ctrl + c (KeyboardInterrupt)
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je veux connaître la météo avec LINE bot avec Heroku + Python