У меня есть два вектора 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-тензоров, а затем свожу его обратно к трехмерному тензору. Это может быть очень много памяти. Я думаю, можно избежать этого.