У меня есть два вектора v
и w
, и я хочу сделать из них матрицу m
так, что:
m[i, j] = v[i] * w[j]
Другими словами, я хочу рассчитать внешний продукт. Я могу сделать это либо с помощью theano.tensor.outer
, либо путем добавления новых индексов к v
и v
и использования продукта dot
.
m = T.dot(v[:,numpy.newaxis], w[numpy.newaxis,:])
Теперь я пытаюсь решить более общую проблему. Вместо двух векторов v
и w
у меня есть две матрицы (я их снова называю v
и w
), и я хотел бы вычислить внешнее произведение каждой строки из матрицы v
с соответствующей строкой матрица w
(i-я строка в первой матрице должна быть умножена на i-я строка второй матрицы). Итак, я хотел бы сделать что-то вроде этого:
m1 = T.tensordot(v[:,:, numpy.newaxis], w[:,:,numpy.newaxis], axes = [[2],[2]])
m[i, j, k] = m1[i, k, j, k]
Другими словами, m[:,:,k]
- это матрица, соответствующая внешнему произведению строки k_th
из строки матрицы v
и k_th
матрицы w
.
Я вижу две проблемы с вышеупомянутым "решением". Во-первых, это не решение, так как вторая строка кода не является правильным аналоговым кодом. Итак, мой первый вопрос заключается в том, как сделать эту "расширенную резку", заставив некоторые индексы быть равными. Например m[i, k] = a[i, k, i, i, k]
. Во-вторых, мне не нравится тот факт, что я сначала создаю 4D tesnor (m1
) из двух 2D-тензоров, а затем свожу его обратно к трехмерному тензору. Это может быть очень много памяти. Я думаю, можно избежать этого.