как умножить каждую строку тензора на остальные строки поэлементно в тензорном потоке - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть такой тензор:

tf_docs = tf.constant([[0, 2, 1],
                       [1, 2, 2],
                       [2, 1, 3],
                       [5, 2, 2]], dtype=tf.int32)

Мне нужно умножить каждую строку на оставшиеся строки по элементам, а затем суммировать результат.

Когда закончим с первой строкой, мы будем делать со второй строкой и остальными строками и ...

Таким образом, результат будет таким: Это будет 4*4, потому что мы имеем 4 строки

result_tf =[[0,  6,  5, 6 ],
            [6,  0, 10, 13],
            [5, 10,  3, 18],
            [6,  13, 18, 0]]

Позвольте мне объяснить каждый элемент в result_tf (матрица симметрична.

первая строка:

0*1 + 2*2 + 1*2 = 6
0*2 + 2*1 + 1*3 = 5
0*5 + 2*2 + 1*2 = 6

Вторая строка:

1*2 + 2*1 + 2*3 = 10
1*5 + 2*2 + 2*2 = 13

третий ряд:

2*5 + 1*2 + 3*2 = 18

Вот как я сформировал верхнюю часть матрицы.

тогда значения в диагонали:

(0,0) не имеет co-occurred ни в одном столбце, поэтому 0

(1,1) не имеет co-occurred ни в одном столбце, поэтому 0

(2,2) имеет co-occurred 2 время во втором столбце и 1 time в третьем столбце, поэтому 3

(3,3) не произошло ни в одном столбце, поэтому 0

Мне кажется, что для решения этой проблемы требуется больше творчества, чем для знания методы. (Буквально здесь я вычисляю совместное вхождение по той же матрице, если вам известна концепция совместного вхождения)

Что я сделал:

Я могу сделать это легко с помощью для л oop. Но мне нужно закончить операцию tenorflow. И я не смог найти ничего похожего на эту проблему. Я также думал, что использовать команду collect, чтобы каждый раз получать указанные строки и объединять их. Но этот путь не является динамическим c, и мои строки и столбцы больше, чем это, поэтому это решение не будет осуществимо

1 Ответ

1 голос
/ 27 апреля 2020

Вот способ сделать это:

import tensorflow as tf

tf_docs = tf.constant([[0, 2, 1],
                       [1, 2, 2],
                       [2, 1, 3],
                       [5, 2, 2]], dtype=tf.int32)

# Non-diagonal elements
nondiag = tf.matmul(tf_docs, tf_docs, transpose_b=True)
# Compute diagonal
r = tf.range(tf.shape(tf_docs, out_type=tf_docs.dtype)[0])
# Compare each index against each value
cmp = tf.equal(tf.expand_dims(tf_docs, axis=-1), r)
# Count appearances of each index in each column
count = tf.math.count_nonzero(cmp, axis=0, dtype=tf_docs.dtype)
# Sum number of appearances over one
diag = tf.reduce_sum(tf.maximum(count - 1, 0), axis=0)
# Set diagonal elements
result_tf = tf.linalg.set_diag(nondiag, diag)
print(result_tf.numpy())
# [[ 0  6  5  6]
#  [ 6  0 10 13]
#  [ 5 10  3 18]
#  [ 6 13 18  0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...