Как использовать PyTorch для softmax только верхних треугольных элементов матрицы?

#python #matrix #pytorch #tensor #softmax

Вопрос:

Учитывая входные данные, такие как:

 tensor([[[1.9392, -1.9266,  0.9664],
         [0.0000, -1.9266,  0.9664],
         [0.0000, -0.0000,  0.9664]]])
 

Мой желаемый результат таков:

 tensor([[[0.4596,  0.0096, 0.1737],
         [0.0000,  0.0096, 0.1737],
         [0.0000, -0.0000, 0.1737]]])
 

Т. е. просто вычисляем функцию над верхними треугольными элементами.

Ответ №1:

Вы можете получить доступ к верхним треугольным элементам с помощью torch.triu_indices :

 t = tensor([[1.9392, -1.9266, 0.9664], 
            [0.0000, -1.9266, 0.9664], 
            [0.0000, -0.0000, 0.9664]]) 

idx = torch.triu_indices(*t.shape)
soft = F.softmax(t[idx[0], idx[1]], dim=0)
 

Если вы хотите переназначить значения, как в желаемом выводе:

 >>> t[idx[0], idx[1]] = soft
>>> t
 
 tensor([[0.4596,  0.0096, 0.1737],
        [0.0000,  0.0096, 0.1737],
        [0.0000, -0.0000, 0.1737]])
 

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

1. если форма тензора 3D, например, r.shape=torch.tensor([5,3,3]), я думаю, использовать для такого цикла for i in range(r.shape[0]): sub_r = r[i] other code like you правильно?