Soustrait les « mises à jour » éparses d'un tenseur existant en fonction des « indices ».
Cette opération crée un nouveau tenseur en soustrayant les « mises à jour » éparses du « tenseur » transmis. Cette opération est très similaire à `tf.scatter_nd_sub`, sauf que les mises à jour sont soustraites d'un tenseur existant (par opposition à une variable). Si la mémoire du tenseur existant ne peut pas être réutilisée, une copie est réalisée et mise à jour.
`indices` est un tenseur entier contenant des indices dans un nouveau tenseur de forme `shape`. La dernière dimension des « indices » peut être au plus le rang de « forme » :
indices.shape[-1] <= shape.rank
La dernière dimension des `indices` correspond aux indices en éléments (si `indices.shape[-1] = shape.rank`) ou en tranches (si `indices.shape[-1] < shape.rank`) le long de la dimension `indices .shape[-1]` de `forme`. `updates` est un tenseur avec une forme
indices.shape[:-1] + shape[indices.shape[-1]:]
La forme la plus simple de tensor_scatter_sub consiste à soustraire des éléments individuels d'un tenseur par index. Par exemple, disons que nous voulons insérer 4 éléments dispersés dans un tenseur de rang 1 avec 8 éléments.
En Python, cette opération de soustraction par dispersion ressemblerait à ceci :
indices = tf.constant([[4], [3], [1], [7]])
updates = tf.constant([9, 10, 11, 12])
tensor = tf.ones([8], dtype=tf.int32)
updated = tf.tensor_scatter_nd_sub(tensor, indices, updates)
print(updated)
[1, -10, 1, -9, -8, 1, 1, -11]
Nous pouvons également insérer des tranches entières d’un tenseur de rang supérieur d’un seul coup. Par exemple, si l'on voulait insérer deux tranches dans la première dimension d'un tenseur de rang 3 avec deux matrices de nouvelles valeurs.
En Python, cette opération d'ajout dispersé ressemblerait à ceci :
indices = tf.constant([[0], [2]])
updates = tf.constant([[[5, 5, 5, 5], [6, 6, 6, 6],
[7, 7, 7, 7], [8, 8, 8, 8]],
[[5, 5, 5, 5], [6, 6, 6, 6],
[7, 7, 7, 7], [8, 8, 8, 8]]])
tensor = tf.ones([4, 4, 4],dtype=tf.int32)
updated = tf.tensor_scatter_nd_sub(tensor, indices, updates)
print(updated)
[[[-4, -4, -4, -4], [-5, -5, -5, -5], [-6, -6, -6, -6], [-7, -7 , -7, -7]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]] , [[-4, -4, -4, -4], [-5, -5, -5, -5], [-6, -6, -6, -6], [-7, -7 , -7, -7]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]] ]
Notez que sur le CPU, si un index hors limite est trouvé, une erreur est renvoyée. Sur GPU, si un index hors limite est trouvé, l'index est ignoré.
Méthodes publiques
Sortie <T> | comme Sortie () Renvoie le handle symbolique d'un tenseur. |
statique <T, U étend le nombre> TensorScatterSub <T> | créer (portée de portée , tenseur d'opérande <T>, indices d'opérande <U>, mises à jour d'opérande <T>) Méthode d'usine pour créer une classe encapsulant une nouvelle opération TensorScatterSub. |
Sortie <T> | sortir () Un nouveau tenseur copié du tenseur et des mises à jour soustraites en fonction des indices. |
Méthodes héritées
Méthodes publiques
sortie publique <T> asOutput ()
Renvoie le handle symbolique d'un tenseur.
Les entrées des opérations TensorFlow sont les sorties d'une autre opération TensorFlow. Cette méthode est utilisée pour obtenir un handle symbolique qui représente le calcul de l’entrée.
public static TensorScatterSub <T> créer (portée de portée , tenseur d'opérande <T>, indices d'opérande <U>, mises à jour d'opérande <T>)
Méthode d'usine pour créer une classe encapsulant une nouvelle opération TensorScatterSub.
Paramètres
portée | portée actuelle |
---|---|
tenseur | Tenseur à copier/mettre à jour. |
indices | Tenseur d'indice. |
mises à jour | Mises à jour à disperser dans la sortie. |
Retours
- une nouvelle instance de TensorScatterSub
sortie publique <T> sortie ()
Un nouveau tenseur copié du tenseur et des mises à jour soustraites en fonction des indices.