Попарно кросс произведение по pytorch и его проблема точности - PullRequest
1 голос
/ 25 февраля 2020

Я студент, который только начал изучать pytorch.

Я надеюсь создать матрицу попарных кросс-произведений.

Пример ниже.

x=torch.Tensor([[1,0,0],[0,1,0]]) # 2*3
y=torch.Tensor([[2,0,0],[0,2,0],[0,0,2]]) # 3*3

#what I want to get is below using torch.cross

z=torch.Tensor([[[0,0,0],[0,0,2],[0,-2,0]],\
                 [0,0,-2],[0,0,0],[2,0,0]]]) # 2*3*3
#So I write code

tmp_x=0*y+x.unsqueeze(1)# 2*3*3 , horrible coding.. please modify this.
tmp_y=y+0*x.unsqueeze(1)
z=torch.cross(tmp_x,tmp_y,dim=-1)

Мне кажется, мой код нехорош. Можно мне посоветовать более хороший код?

И есть проблема точности, когда я использую его для типа с плавающей точкой. Перекрестное произведение между вектором и самим собой не является нулевым вектором. Когда я печатаю каждую матрицу в приведенном выше коде, как показано ниже, в этом случае x = y,

print x
print y
print '====='
print tmp_x
print tmp_y
print '====='
print z

, тогда я получаю результат.

tensor([[ 0.2957,  1.6024, -0.1010],
        [-1.4755,  0.1937, -0.6091],
        [ 1.3540,  0.7203,  0.4037]])
tensor([[ 0.2957,  1.6024, -0.1010],
        [-1.4755,  0.1937, -0.6091],
        [ 1.3540,  0.7203,  0.4037]])
=======
tensor([[[ 0.2957,  1.6024, -0.1010],
         [ 0.2957,  1.6024, -0.1010],
         [ 0.2957,  1.6024, -0.1010]],

        [[-1.4755,  0.1937, -0.6091],
         [-1.4755,  0.1937, -0.6091],
         [-1.4755,  0.1937, -0.6091]],

        [[ 1.3540,  0.7203,  0.4037],
         [ 1.3540,  0.7203,  0.4037],
         [ 1.3540,  0.7203,  0.4037]]])
tensor([[[ 0.2957,  1.6024, -0.1010],
         [-1.4755,  0.1937, -0.6091],
         [ 1.3540,  0.7203,  0.4037]],

        [[ 0.2957,  1.6024, -0.1010],
         [-1.4755,  0.1937, -0.6091],
         [ 1.3540,  0.7203,  0.4037]],

        [[ 0.2957,  1.6024, -0.1010],
         [-1.4755,  0.1937, -0.6091],
         [ 1.3540,  0.7203,  0.4037]]])
=======
tensor([[[ 5.0209e-09, -2.8436e-10, -1.0191e-08],
         [-9.5639e-01,  3.2915e-01,  2.4217e+00],
         [ 7.1970e-01, -2.5616e-01, -1.9567e+00]],

        [[ 9.5639e-01, -3.2915e-01, -2.4217e+00],
         [ 6.0023e-10, -2.4257e-08,  1.3432e-08],
         [ 5.1692e-01, -2.2897e-01, -1.3251e+00]],

        [[-7.1970e-01,  2.5616e-01,  1.9567e+00],
         [-5.1692e-01,  2.2897e-01,  1.3251e+00],
         [ 9.2649e-09,  5.7705e-09, -4.0787e-09]]])

z [0,0 ,:] must быть нулевым вектором, но это не так. Что я не прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...