как отбросить нижний треугольник (включая диаг) 2-мерного тензора в tensorflow1.x? - PullRequest
1 голос
/ 18 июня 2020

например, у меня есть тензор:

import tensorflow.compat.v1 as tf
import numpy as np
a = tf.constant(np.array([[1,2,3,4,5],
                          [2,2,4,5,6],
                          [3,4,3,6,7],
                          [4,5,6,4,8],
                          [5,6,7,8,5]))

Это симметрия c. Теперь я хочу увидеть только ту часть, где abs (ij)> s, где i, j обозначают индекс строки и col, s - параграф.

Это равно j - i> s для симмерти.

Итак, если установлено s = 2, я хочу преобразовать a в:

        tf.constant(np.array([[0,0,0,4,5],
                              [0,0,0,0,6],
                              [0,0,0,0,0],
                              [0,0,0,0,0],
                              [0,0,0,0,0]))

Есть ли какой-нибудь убедительный способ сделать это в tf1.x? TX!

1 Ответ

1 голос
/ 18 июня 2020

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

import tensorflow.compat.v1 as tf
import numpy as np

a = tf.constant(np.array([[1, 2, 3, 4, 5],
                          [2, 2, 4, 5, 6],
                          [3, 4, 3, 6, 7],
                          [4, 5, 6, 4, 8],
                          [5, 6, 7, 8, 5]]))
s = 2
shape = tf.shape(a)
i, j = tf.meshgrid(tf.range(shape[0]), tf.range(shape[1]), indexing='ij')
mask = tf.math.abs(i - j) > s
result = a * tf.dtypes.cast(mask, a.dtype)
tf.print(result)
# [[0 0 0 4 5]
#  [0 0 0 0 6]
#  [0 0 0 0 0]
#  [4 0 0 0 0]
#  [5 6 0 0 0]]

Результат отличается от того, что вы показываете, но он соответствует формуле abs(i - j) > s. Если вам нужна только верхняя часть, сделайте вместо этого:

mask = j - i > s
...