How to check if two Torch tensors or matrices are equal?
Asked Answered
M

7

96

I need a Torch command that checks if two tensors have the same content, and returns TRUE if they have the same content.

For example:

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

What should I use in this script instead of EQUIVALENCE_COMMAND ?

I tried simply with == but it does not work.

Malita answered 7/10, 2015 at 15:25 Comment(1)
To allow for floating point differences, see Check if PyTorch tensors are equal within epsilon.Cupulate
W
107
torch.eq(a, b)

eq() implements the == operator comparing each element in a with b (if b is a value) or each element in a with its corresponding element in b (if b is a tensor).


Alternative from @deltheil:

torch.all(tens_a.eq(tens_b))
Won answered 8/10, 2015 at 7:4 Comment(2)
As mentioned in other answers, with present torch, .eq returns a tensor whereas .equal actually returns a bool.Fireworks
Is there an approximate version of this? I would like something to compute the norm ||A - B|| and check if that's small (which is not the same as A.allclose(B)).Queridas
A
103

This below solution worked for me:

torch.equal(tensorA, tensorB)

From the documentation:

True if two tensors have the same size and elements, False otherwise.

Annalee answered 14/1, 2019 at 18:50 Comment(1)
This answer should be the only one used for this issue as this function match the exact behaviour wanted by the OP + it is the most effective, if the tensors are not of same shape no computation is made.Prolocutor
L
34

To compare tensors you can do element wise:

torch.eq is element wise:

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

Or torch.equal for the whole tensor exactly:

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

But then you may be lost because at some point there are small differences you would like to ignore. For instance floats 1.0 and 1.0000000001 are pretty close and you may consider these are equal. For that kind of comparison you have torch.allclose.

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

At some point may be important to check element wise how many elements are equal, comparing to the full number of elements. If you have two tensors dt1 and dt2 you get number of elements of dt1 as dt1.nelement()

And with this formula you get the percentage:

print(torch.sum(torch.eq(dt1, dt2)).item()/dt1.nelement())
Laurencelaurene answered 3/9, 2019 at 12:57 Comment(2)
torch.allclose() is the one I was looking for.Rawlings
How to do not equal to?Ambassador
C
11

Try this if you want to ignore small precision differences which are common for floats

torch.all(torch.lt(torch.abs(torch.add(tens_a, -tens_b)), 1e-12))
Cleanup answered 18/10, 2016 at 14:45 Comment(1)
alternatively you may use torch.allclose().Krenn
G
1

This solution also works fine for me and seems more natural.

torch.all(tensorA == tensorB)

gives output as:

if equivalent gives output as tensor(1, device='cuda:0', dtype=torch.uint8) else : tensor(0, device='cuda:0', dtype=torch.uint8)

Gon answered 8/4, 2019 at 16:46 Comment(0)
C
0
orig = torch.randn(1,3,16,16)
doubly = orig.clone()
print((orig==doubly).all()) # will return True if they are same else False
Catechol answered 10/4, 2024 at 16:8 Comment(0)
C
-2

You can convert the two tensors to numpy arrays:

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

a=tens_a.numpy()
b=tens_b.numpy()

and then something like

np.sum(a==b)
4

would give you a fairly good idea of how equals are they.

Campuzano answered 26/11, 2019 at 21:17 Comment(1)
This is inefficient and unnecessary. Just use pytorch functions.Solvable

© 2022 - 2025 — McMap. All rights reserved.