Сложное векторное умножение без перебора вектора

#python #pytorch

Вопрос:

Я пытаюсь рассчитать величину потерь в вариации многоклассовой классификации.

У меня есть мой y тензор (значения соответствуют классам):

 y = torch.tensor([ 1,  0,  2])
 

Мой y_pred — это 3x3 матрица вероятностных распределений:

 y_pred = torch.tensor([[0.4937, 0.2657, 0.2986],
        [0.2553, 0.3845, 0.4384],
        [0.2510, 0.3498, 0.2630]])
 

Сложность заключается в том, что у меня также есть матрица расстояний (у каждого класса есть некоторое расстояние до других классов):

 d_mtx = torch.tensor([[0, 0.7256, 0.7433],
        [0.6281, 0, 0.1171],
        [0.7580, 0.2513, 0]])
 

Потеря, которую я пытаюсь подсчитать, это:

 loss = 0
for class_value in range(len(y)):
    dis = torch.dot(d_mtx[y[class_value]], y_pred[class_value])
    loss  = dis
 

Есть ли способ эффективно вычислить его без итерации?

Обновление 1: Попробовал подход @Yahia Zakaria , и он работает, если мой y_pred размер совпадает с моим d_mtx , но в противном случае я получаю ошибку:

 RuntimeError: The size of tensor a (3) must match the size of tensor b (4) at non-singleton dimension 0
 

Например:

 y = torch.tensor([ 1,  0,  2, 1])
y_pred = torch.tensor([[0.4937, 0.2657, 0.2986],
        [0.2553, 0.3845, 0.4384],
        [0.2510, 0.3498, 0.2630],
        [0.2510, 0.3498, 0.2630]])

d_mtx = torch.tensor([[0, 0.7256, 0.7433],
        [0.6281, 0, 0.1171],
        [0.7580, 0.2513, 0]])
 

Комментарии:

1. Здесь есть одна вещь, которая кажется неправильной. Когда вы пишете y_pred[class_value] , и первое, и последнее значение в y будут ссылаться на строку 1 в y_pred , поэтому последняя строка будет проигнорирована. Это намеренно?

2. В нем нет значения y 3, поэтому последняя строка y_pred никогда не будет использоваться при расчете.

3. Да, теперь я понимаю вашу точку зрения, приношу извинения, я не понял, что написал это неправильно, я обновляю свой вопрос. Еще раз извините, теперь в этом больше смысла?

4. ДА. Спасибо.

Ответ №1:

Ты мог бы сделать это вот так:

 loss = (d_mtx[y] * y_pred).sum()
 

Это решение предполагает y , что тип torch.int64 is допустим для примера, который вы показали.

Комментарии:

1. Мило! Мне нравится этот «трюк» distance[y] . Спасибо!

2. Я только что понял, что это почти работает. Пожалуйста, ознакомьтесь с моим обновлением!

3. Обновлено решение для решения вопроса обновление.

4. Удивительные. Еще раз спасибо.