Матрица вычитать как умножение матриц в тензорном потоке - PullRequest
0 голосов
/ 28 декабря 2018

Это мой первый пост. Я обычно нахожу все свои ответы в архивах, но мне тяжело с этим, спасибо за помощь!

У меня есть две матрицы A и B. Выполнение умножения матрицОперация тривиальная с использованием tf.matmult.Но я хочу сделать вычитание матрицы аналогично тому, как работает умножение матриц.Например, если у меня есть.

A = tf.constant([[1, 1, 1, 2, 3, 1],[1,2,3,4,5,6],[4,3,2,1,6,5]])
B = tf.constant([[1,3,1],[2,1,1]])

#B*A
X = tf.matmult(B,A)
>>>X = [[8,10,12,15,24,24],[7,7,7,9,17,13]]

Я хочу сделать аналогичную операцию, например, matmult, но вместо умножения я хочу вычесть и возвести в квадрат.Например ...

для x 11 , где нижний индекс 11 - строка 1, столбец 1 матрицы X.

= (-b 11 + a 11 ) 2 + (-b 12 + a 21 ) 2 + (-b 13 + a 31 ) 2

и

x 12 = (-b 11 + a 12 ) 2 + (-b 12 + a 22 * ​​1045 *) 2 + (-b 13 + a 32 ) 2

и т. д., аналогично умножению матриц.

Таким образом, если мы возьмем матрицы A и B выше и выполним операцию, описанную выше (назовем это matmultsubtract), мы получим,

tf.matmultsubtract (B, A) даст:

[[(- - 1 + 1) 2 + (- 3 + 1) 2 + (- 1 + 4) 2 , (-1+1) 2 + (- 3 + 2) 2 + (- 1 + 3) 2 , ...],

[(-2 + 1) 2 + (- 1 + 1) 2 + (- 1 + 4) 2 , (-2 + 1) 2 + (- 1 + 2) 2 + (- 1 + 3) 2 , ...]]

Это не тактрудно, если вы работаете с массивами numpy (вы можете использовать два вложенных цикла for), выполняя итерацию вручную, а не np.matmult, но тензор потока имеет проблему с циклами for, и я не уверен, как это сделать.за помощь.

1 Ответ

0 голосов
/ 28 декабря 2018

Попытка операции векторизации, которая не может быть принята как вычитание матрицы.

# shape=(2,3,6)
B_new = tf.tile(tf.expand_dims(B,axis=-1),multiples=[1,1,A.shape[1]])
# shape=(2,3,6)
A_new = tf.tile(tf.expand_dims(A,axis=0),multiples=[B.shape[0],1,1])
# shape=(2,6)
result = tf.reduce_sum(tf.square(A_new - B_new),axis=1)
with tf.Session() as sess:
    print(sess.run(result))

[[13  5  1  2 33 25]
 [10  6  6  9 42 42]]
...