Как проверить, равны ли два тензора факела или матрицы?

Мне нужна команда Torch, которая проверяет, имеет ли два тензора один и тот же контент, и возвращает TRUE, если у них одинаковый контент.

Например:

local tens_a = torch.Tensor({9,8,7,6});
local tens_b = torch.Tensor({9,8,7,6});

if (tens_a EQUIVALENCE_COMMAND tens_b) then ... end

Что следует использовать в этом script вместо EQUIVALENCE_COMMAND?

Я пробовал просто с ==, но это не сработало.

Ответ 1

https://github.com/torch/torch7/blob/master/doc/maths.md#torcheqa-b

torch.eq(a, b)

Выполняет оператор ==, сравнивающий каждый элемент в с b (если b является числом) или каждый элемент в с соответствующим элементом в b.

- UPDATE

от @deltheil

torch.all(torch.eq(tens_a, tens_b))

или даже проще

torch.all(tens_a:eq(tens_b))

Ответ 2

Это решение ниже работает для меня:

torch.equal(tensorA, tensorB)

Из документации:

True, если два тензора имеют одинаковый размер и элементы, False в противном случае.

Ответ 3

Попробуйте это, если вы хотите игнорировать небольшие различия точности, которые являются общими для плавающих

torch.all(torch.lt(torch.abs(torch.add(tens_a, -tens_b)), 1e-12))

Ответ 4

Для сравнения тензоров вы можете сделать элементно:

torch.eq поэлементно:

torch.eq(torch.tensor([[1., 2.], [3., 4.]]), torch.tensor([[1., 1.], [4., 4.]]))
tensor([[True, False], [False, True]])

Или torch.equal для всего тензора:

torch.equal(torch.tensor([[1., 2.], [3, 4.]]), torch.tensor([[1., 1.], [4., 4.]]))
# False
torch.equal(torch.tensor([[1., 2.], [3., 4.]]), torch.tensor([[1., 2.], [3., 4.]]))
# True

Но тогда вы можете потеряться, потому что в какой-то момент есть небольшие различия, которые вы хотели бы игнорировать. Например, поплавки 1.0 и 1.0000000001 довольно близки, и вы можете считать, что они равны. Для такого сравнения у вас есть torch.allclose.

torch.allclose(torch.tensor([[1., 2.], [3., 4.]]), torch.tensor([[1., 2.000000001], [3., 4.]]))
# True

В какой-то момент может быть важно проверить, сколько элементов равно, по сравнению с полным числом элементов. Если у вас есть два тензора dt1 и dt2, вы получите количество элементов dt1 как dt1.nelement()

И с этой формулой вы получите процент:

print(torch.sum(torch.eq(dt1, dt2)).item()/dt1.nelement())

Ответ 5

Это решение также хорошо работает для меня и кажется более естественным.

torch.all(tensorA == tensorB)

дает вывод как:

если эквивалент дает вывод как tensor(1, device='cuda:0', dtype=torch.uint8) иначе: tensor(0, device='cuda:0', dtype=torch.uint8)