2016-10-07 1 views
0

У меня есть три тензора, a, b и mask, все одинаковы. Я хотел бы создать новый тензор c, так что каждая запись c берется из соответствующей записи a, если соответствующая запись mask имеет значение True; иначе он берется из соответствующей записи b.TensorFlow Выбор записей (из одного из двух тензоров) на основе булевой маски

Пример:

a = [0, 1, 2] 
b = [10, 20, 30] 
mask = [True, False, True] 
c = [0, 20, 2] 

Как я могу это сделать?

ответ

3

Почему бы не использовать tf.select(condition, t, e, name=None)

для примера:

c = tf.select(mask, a, b) 

для получения более подробной информации о tf.select, посетите Tensorflow Control Flow Documentation

+0

Отлично! Кажется, что это сделано именно для того, чего я хочу. – SRobertJames

+0

Обратите внимание, что 'tf.select' был переименован в' tf.where' с версии 1.0 или так – MohamedEzz

1

Вы можете сделать это следующим образом:

1) convert mask to ints (0 for false, 1 for true) 
2) do element wise multiplication of int_mask with tensor 'a' 
    (elements that should not be included are going to be 0) 
3) do logical_not on mask 
4) convert logical_not_int_mask to ints 
    (again 0 for false, 1 for true values) 
5) now just do element wise multiplication of logical_not_int_mask with tensor 'b' 
    (elements that should not be included are going to be 0) 
6) Add tensors 'a' and 'b' together and there you have it. 

В коде это должно выглядеть примерно так:

# tensor 'a' is [0, 1, 2] 
# tensor 'b' is [10, 20, 30] 
# tensor 'mask' is [True, False, True] 

int_mask = tf.cast(mask, tf.int32) 
# Leave only important elements in 'a' 
a = tf.mul(a, int_mask) 
mask = tf.logical_not(mask) 
int_mask = tf.cast(mask, tf.int32) 
b = tf.mul(b, int_mask) 
result = tf.add(a, b) 

Или просто использовать tf.select() функцию так же, как кто-то уже упоминалось.

Смежные вопросы