Если вы хотите sum()
сверх темного, вы можете «поднять» свою 2D задачу на 3D и суммировать там:
M = ((X[:, None, :] - X_[:, None, :] * Y[None, ...])**2).sum(dim=2)
Как это работает :
X[:, None, :]
и X_[:, None, :]
являются 3D размером (batch_size, 1, dim)
, а Y[None, ...]
имеет размер (1, batch_size, dim)
.
При умножении X_[:, None, :] * Y[None, ...]
pytorch передает измерения размера 1 на соответствующее измерение, чтобы получить результат размера (batch_size, batch_size, dim)
.
Наконец, вы sum()
только надпоследнее измерение (dim=2)
для получения M
размера (batch_size, batch_size)
.
Хитрость здесь заключается в использовании вещания .