#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. Удивительные. Еще раз спасибо.