Маска тензор в зависимости от другого тензор - PullRequest
0 голосов
/ 20 июня 2020

Я хотел бы отметить все совпадения с помощью Tensor t2 в t1 как True в противном случае - False. Пример таких операций показан в следующем примере:

t1 = tf.constant([0, 1, 2, 3, 4, 5, 6])
t2 = tf.constant([1, 2, 3])

mask = tf.some_ops(t1, t2)
print(mask)

<tf.Tensor: shape=(7,), dtype=bool, numpy=array([False, True, True, True, False, False, False])>

Учитывая массив констант тензора, как я могу создать булеву маску в зависимости от другого тензора? (та же размерность и размерность не превышает первый тензор)

Я пытался tf.math.equal, но оператор ожидает, что для сравнения будут использоваться те же тензорные измерения или скаляр. Есть ли такая опция для сравнения с «суб-тензорами»? Кажется довольно неэффективным l oop над срезами тензора t1.

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Вы можете добиться этого с помощью широковещательной передачи:

import tensorflow as tf

t1 = tf.constant([0, 1, 2, 3, 4, 5, 6])
t2 = tf.constant([1, 2, 3])

mask = tf.reduce_any(t1[None, :] == t2[:, None], axis=0)

print(t1)
print(t2)
print(mask)

вывод:

tf.Tensor([0 1 2 3 4 5 6], shape=(7,), dtype=int32)
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor([False  True  True  True False False False], shape=(7,), dtype=bool)
0 голосов
/ 21 июня 2020
t1 = tf.constant([0, 1, 2, 3, 4, 5, 6])
t2 = tf.constant([1, 2, 3])
mask = [val in t2 for val in t1]
print(mask)
>>> [False, True, True, True, False, False, False]

Если по какой-то причине вам нужна эта маска, преобразованная в тензор, вы можете использовать convert_to_tensor:

print(tf.convert_to_tensor(mask))
>>> tf.Tensor([False  True  True  True False False False], shape=(7,), dtype=bool)
...