Трансформировать список в Tensor более аккуратный - PullRequest
0 голосов
/ 16 мая 2019

Я хочу вернуть в Dataloader список. Но чтобы вернуть его, нужно быть тензорным, верно? Я преобразую его, но в этом процессе информация теряется, есть ли другой способ сделать это?

pt_tensor_from_list = torch.tensor(pose_transform)
pt_tensor_from_list = torch.FloatTensor(pose_transform)

Я ожидаю вывода:

([[- 0.0003000000142492354, -0.0008999999845400453, 0.00039999998989515007, 0], [0.0010000000474974513, -0.00019999999494757503, 0.0003000000142492354, 0], [0.00019999999494757503, -0.0005000000237487257, -0.0008999999845400453, 0], [5.484399795532227, -24.28619956970215, 117.5000991821289, 1])

Но это:

([[-0,0003, -0,0009, 0,0004, 0,0000], [0,0010, -0,0002, 0,0003, 0,0000], [0,0002, -0,0005, -0,0009, 0,0000], [5.4844, -24.2862, 117.5001, 1.0000]])

1 Ответ

0 голосов
/ 16 мая 2019

Вы не теряете никакой информации во время такой конверсии. Причина, по которой это выглядит более компактно, заключается в том, что когда вы печатаете тензор, он вызывает методы __str__() или __repr__() и делает ваш тензор более привлекательным. Как вы можете найти здесь torch.Tensor использует своего рода внутренний тензорный форматер, называемый _tensor_str. Если вы заглянете внутрь кода ссылка , то обнаружите, что по умолчанию для параметра precision установлено значение 4:

precision: количество знаков точности для вывода с плавающей запятой (по умолчанию = 4).

Вот почему у вас есть только 4 цифры для значений тензора при печати тензора. Но на самом деле значения, хранящиеся в тензоре, такие же, как в исходном списке.

Вот небольшой пример, чтобы понять:

Код:

import torch

test_list = ([[-0.0003000000142492354, -0.0008999999845400453, 0.00039999998989515007, 0],
              [0.0010000000474974513, -0.00019999999494757503, 0.0003000000142492354, 0],
              [0.00019999999494757503, -0.0005000000237487257, -0.0008999999845400453, 0],
              [5.484399795532227, -24.28619956970215, 117.5000991821289, 1]])

print('Original values:')
for i in test_list:
    for j in i:
        print(j)

pt_tensor_from_list = torch.FloatTensor(test_list)

print('When printing FloatTensor:')
print(pt_tensor_from_list.dtype, pt_tensor_from_list, sep='\n')

print('When printing each value separately:')
for i in pt_tensor_from_list:
    for j in i:
        print(j.item())

Выход:

Original values:
-0.0003000000142492354
-0.0008999999845400453
0.00039999998989515007
0
0.0010000000474974513
-0.00019999999494757503
0.0003000000142492354
0
0.00019999999494757503
-0.0005000000237487257
-0.0008999999845400453
0
5.484399795532227
-24.28619956970215
117.5000991821289
1
When printing FloatTensor:
torch.float32
tensor([[-3.0000e-04, -9.0000e-04,  4.0000e-04,  0.0000e+00],
        [ 1.0000e-03, -2.0000e-04,  3.0000e-04,  0.0000e+00],
        [ 2.0000e-04, -5.0000e-04, -9.0000e-04,  0.0000e+00],
        [ 5.4844e+00, -2.4286e+01,  1.1750e+02,  1.0000e+00]])
When printing each value separately:
-0.0003000000142492354
-0.0008999999845400453
0.00039999998989515007
0.0
0.0010000000474974513
-0.00019999999494757503
0.0003000000142492354
0.0
0.00019999999494757503
-0.0005000000237487257
-0.0008999999845400453
0.0
5.484399795532227
-24.28619956970215
117.5000991821289
1.0

Как видите, мы получаем одинаковые значения при печати каждого значения отдельно.

НО Вы можете потерять некоторую информацию, если выберете неправильные типы тензоров, например HalfTensor вместо FloatTensor. Вот пример:

Код:

pt_tensor_from_list = torch.HalfTensor(test_list)

print('When printing HalfTensor:')
print(pt_tensor_from_list.dtype, pt_tensor_from_list, sep='\n')

print('When printing each value separately:')
for i in pt_tensor_from_list:
    for j in i:
        print(j.item())

Выход:

When printing HalfTensor:
torch.float16
tensor([[-2.9993e-04, -8.9979e-04,  4.0007e-04,  0.0000e+00],
        [ 1.0004e-03, -2.0003e-04,  2.9993e-04,  0.0000e+00],
        [ 2.0003e-04, -5.0020e-04, -8.9979e-04,  0.0000e+00],
        [ 5.4844e+00, -2.4281e+01,  1.1750e+02,  1.0000e+00]],
       dtype=torch.float16)
When printing each value separately:
-0.0002999305725097656
-0.0008997917175292969
0.0004000663757324219
0.0
0.0010004043579101562
-0.00020003318786621094
0.0002999305725097656
0.0
0.00020003318786621094
-0.0005002021789550781
-0.0008997917175292969
0.0
5.484375
-24.28125
117.5
1.0

Как вы можете заметить, теперь значения (немного) отличаются. Посетите документацию по тенорсу pytorch , чтобы узнать больше о различных типах torch.tensor.

...