Как создать булевский тензор из тензора, основываясь на том, являются ли значения в этом другом тензоре ключом в словаре или нет без использования numpy? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть тензор формы (N, T) с целочисленными значениями и словарь, в котором ключ и значение оба являются целыми числами. Я хочу создать булевский тензор той же формы, т. Е. (N, T), где запись истинна, только если значение, соответствующее входному тензору, присутствует в словаре.

Например, ниже приведены мои входные данные,

A = [[2,3,4],
     [6,7,8]]
dictionary = {1: -1, 2: -1, 3: -1, 4: -1, 5: -1, 6: -1}

Я хочу создать булевский тензор, такой как,

B = [[True, True, True],
     [True, False, False]]

Здесь каждая запись B имеет вид True, где соответствующая запись в A является действительным ключом в словаре. Я должен сделать это без преобразования тензора в numpy, поэтому любая помощь будет принята с благодарностью.

PS: я использую Tensorflow v1, поэтому, пожалуйста, предоставьте решение, совместимое с v1 Tensorflow.

1 Ответ

0 голосов
/ 16 апреля 2020

Пока это не огромные тензоры, вы можете делать следующее:

Это предполагает, что вы знаете количество столбцов в вашем тензоре, чтобы мы могли выполнять изменение формы назад и вперед.

A = tf.constant([[2,3,4], [6,7,8]])

dictionary = {1: -1, 2: -1, 3: -1, 4: -1, 5: -1, 6: -1}
b = tf.constant(list(dictionary.keys()))

c = tf.map_fn(lambda x: tf.reduce_any(tf.equal(b,x)), tf.reshape(A,[-1]), dtype=bool)
c = tf.reshape(c, [-1,3])

tf.map_fn довольно медленный по сравнению с другими векторизованными операциями в TF. Следовательно, вы можете наблюдать медленное время, если используете это на больших тензорах.

Кроме того, если вы используете TF 2, вы можете добиться этого с меньшим количеством строк кода.

...