如何检查两个Torch张量或矩阵是否相等?

Dav*_*.it 26 lua torch

我需要一个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
Run Code Online (Sandbox Code Playgroud)

我应该在这个脚本中使用什么而不是EQUIVALENCE_COMMAND

我试过简单,==但它不起作用.

YuT*_*Tse 34

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

torch.eq(a, b)
Run Code Online (Sandbox Code Playgroud)

实现==运算符比较a中的每个元素b(如果b是数字)或b中的每个元素与b中的对应元素.

--update

来自@deltheil

torch.all(torch.eq(tens_a, tens_b))
Run Code Online (Sandbox Code Playgroud)

甚至更简单

torch.all(tens_a:eq(tens_b))
Run Code Online (Sandbox Code Playgroud)

  • 在**PyTorch**中,它是`torch.eq(tens_a,tens_b).all()` (12认同)
  • 要获得最终布尔值,您还需要使用[`torch.all`](https://github.com/torch/torch7/blob/28de02639e8e970532f2635d47ba3eabdf50e04f/doc/maths.md#torchalla)进行换行,即`torch.all( torch.eq(tens_a,tens_b))`甚至更简单`torch.all(tens_a:eq(tens_b))`. (9认同)
  • 正如其他答案中提到的,对于当前的火炬,“.eq”返回一个张量,而“.equal”实际上返回一个布尔值。 (7认同)
  • @YuTse我让你用`torch.all`更新你的答案. (3认同)

pro*_*sti 15

要比较张量,您可以明智地执行元素:

torch.eq 是元素明智的:

torch.eq(torch.tensor([[1., 2.], [3., 4.]]), torch.tensor([[1., 1.], [4., 4.]]))
tensor([[True, False], [False, True]])
Run Code Online (Sandbox Code Playgroud)

或者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
Run Code Online (Sandbox Code Playgroud)

但是你可能会迷失方向,因为在某些时候你会想忽略一些小的差异。例如浮动1.0并且1.0000000001非常接近,您可能认为它们是相等的。对于那种比较,你有torch.allclose

torch.allclose(torch.tensor([[1., 2.], [3., 4.]]), torch.tensor([[1., 2.000000001], [3., 4.]]))
# True
Run Code Online (Sandbox Code Playgroud)

在某些时候,与元素的全部数量相比,明智地检查元素有多少元素相等可能很重要。如果你有两个张量dt1并且dt2你得到的元素数量dt1dt1.nelement()

用这个公式你可以得到百分比:

print(torch.sum(torch.eq(dt1, dt2)).item()/dt1.nelement())
Run Code Online (Sandbox Code Playgroud)

  • torch.allclose() 是我一直在寻找的。 (3认同)

小智 14

下面的解决方案为我工作:

torch.equal(tensorA, tensorB)
Run Code Online (Sandbox Code Playgroud)

文档中

True如果两个张量具有相同的大小和元素,False否则。

  • 这个答案应该是唯一用于此问题的答案,因为该函数与 OP 所需的确切行为相匹配+它是最有效的,如果张量形状不同,则不进行计算。 (5认同)

two*_*rec 5

如果要忽略浮点数常见的微小精度差异,请尝试此操作

torch.all(torch.lt(torch.abs(torch.add(tens_a, -tens_b)), 1e-12))
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以使用[`torch.allclose()`](https://pytorch.org/docs/master/torch.html?highlight=allclose#torch.allclose)。 (4认同)