Умножение матриц по определенным измерениям в тензорном потоке (или numpy) - PullRequest
0 голосов
/ 12 декабря 2018

Я надеюсь, что я не пропускаю ничего очевидного здесь, но я перебрал интер-сети безрезультатно, и, наконец, пришел спросить здесь ...
Вот действительно сухой ипростое описание того, что я хотел бы сделать:
Скажем, у меня есть тензор формы (20, 40, 3, 5) и еще один тензор формы (20, 40, 5, 7).Первые два размерных размера должны быть сохранены как есть и намеренно идентичны для двух тензоров.С другой стороны, last два измерения должны быть (матрично-) умножены в стиле matmul.То есть мой получившийся тензор будет иметь форму (20, 40, 3, 7).Как это можно сделать ??
Я понимаю, что теоретически могу просто зациклить первые два измерения и напрямую использовать tf.matmul(), но это абсолютно не нужно из-за времени выполнения, эффективности, обучения модели и графического процессора во всем мирепротесты, и моя совесть, если это имеет какой-либо вес :-).

Я, к сожалению, проигнорировал как "не то, что мне нужно" следующие параметры:
tf.tensordot дал бы мне вывод формы (20, 40, 3, 20, 40, 7).Ничего хорошего.
tf.scan подходит только для первого измерения, если я правильно его читаю (возможно, подходит для RNN? Не в моем случае).
tf.matmul работает для тензоров ранга> = 2, но работает как @ в последнем и первом измерениях соответственно.Опять не мой случай.

Итак, еще раз - как это можно сделать?
Ответ numpy, который помогает мне двигаться в правильном направлении, также был бы очень полезен, но в конце мне понадобится реализация tfдня.

Заранее спасибо, и извините, если мне не хватает чего-то немого.


Следующее ближе к тому, что мне нужно, но менее понятно и поэтому пишется отдельно:
Первые два измерения являются пространственными измерениями изображения.Последние два на самом деле являются квадратными матрицами, полученными через tf.contrib.distributions.fill_triangular, и умножаются (вместе с соответствующей транспозицией на одну из них) для получения ковариационных матриц, связанных с каждой пространственной координатой.Я не знаю, помогает ли это в любом случае, но это дает некоторый контекст по крайней мере.Кроме того, может быть или не быть размерность пакета, но я предполагаю, что решение случая четырехмерного тензора будет достаточно обобщаемым.

1 Ответ

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

Публикация этого для дальнейшего использования:
From numpy matmul doc:

Если один из аргументов равен ND, N> 2, он обрабатывается как стек матриц, находящихся в последнемдва индекса и передают соответственно.

Для измерений >2 он будет обрабатывать его как стек матриц, пытаясь matmul последние 2 измерения, в результате чего np array в качестве требуемого OP.
Например:

import numpy as np

A = np.ones((1,2,1,2))
B = np.ones((1,2,2,1))

print(A.shape)
print(B.shape)
print(np.matmul(A,B).shape)

с результатом:

(1, 2, 1, 2)
(1, 2, 2, 1)
(1, 2, 1, 1)
...