Я пишу нейронный net с нуля, и мне нужно выполнить следующую операцию: Для каждого ряда матрицы dY возьмите с собой внешнее произведение того же ряда другой матрицы S (той же формы, что и Y), и умножьте эту строку dY на эту внешнюю матрицу (S [i ,:], S [i ,:]). Также умножьте dY * S поэлементно и добавьте это к нему.
Код ниже делает это, но он не векторизован. Можете ли вы помочь мне ускорить это?
out = dY.copy()
for i in range(dY.shape[0]):
out[i, :] = dY[i, :] * S[i, :] - dY[i, :].dot(np.outer(S[i, :], S[i, :]))
Обновление: следующее берет (n, m) матрицу S
и возвращает матрицу формы (n, m, m), где для каждой строки, мы берем внешний продукт с собой.
np.einsum("ab,ad->abd", S, S)
Обновление 2: окончательно решил его, используя два приложения np.einsum.
S_outer = np.einsum("ab,ad->abd", S, S)
return dY * S - np.einsum("ab,abc->ac", dY, S_outer)