Для вычисления евклидова расстояния между векторами в тензоре факела с несколькими измерениями

#pytorch #tensor

Вопрос:

Существует случайный инициализированный тензор факела формы, как показано ниже.

Входные

 tensor1 = torch.rand((4,2,3,100))
tensor2 = torch.rand((4,2,3,100))
 

tensor1 и tensor2 являются тензорами факела с 24 100-мерными векторами соответственно.

Я хочу получить тензор с формой torch.size([4,2,3]) , получив евклидово расстояние между векторами с одинаковым индексом двух тензоров.

Я привык dist = torch.nn.functional.pairwise_distance(tensor1, tensor2) получать желаемые результаты.

Однако pairwise_distance функция вычисляет евклидово расстояние для второго измерения тензора. Такова dist форма torch.size([4,3,100]) .

Я несколько раз выполнял транспозицию, чтобы решить эти проблемы. Мой код выглядит следующим образом.

 tensor1 = tensor1.transpose(1,3)
tensor2 = tensor2.transpose(1,3)
dist = torch.nn.functional.pairwise_distance(tensor1, tensor2)
dist = dist.transpose(1,2)
 

Есть ли более простой или легкий способ получить желаемый результат?

Ответ №1:

Поехали

 dist = (tensor1 - tensor2).pow(2).sum(3).sqrt()
 

В принципе, это и есть евклидово расстояние.

Вычтите -> мощность на 2 ->> сумма вдоль неудачной оси, которую вы хотите устранить->>> квадратный корень