在较大的布尔值 tensors/arrays 中查找二维布尔值模式

Finding 2D boolean patterns in larger boolean tensors/arrays

我正在寻找一种使用 pytorch 或 numpy 在 MxNxR tensor/array 中查找二维图案的方法。 例如,查看布尔模式张量字典(例如 {6x6 : freq})是否存在于更大的布尔张量(例如 3x256x256)中。

然后我想更新我的字典的模式和频率。

我希望有一个 pytorchi 的方式来做它,而不是在它上面循环,或者有一个优化的循环来做它。

据我所知,torch.where 在我们有一个标量值时有效。如果我有一个 6x6 的张量而不是一个值,我不确定我该怎么办。 我调查了 ,但我认为将其用于二维模式是不可行的。

我想也许你可以使用卷积来解决这个问题。假设您有一个由 01 组成的输入。这里我们将举一个最小的例子,其中 u=input 为 3x32x2 模式:

>>> x = torch.tensor([[1., 0., 0.],
                      [0., 1., 0.],
                      [1., 0., 0.]])

模式将是:

>>> pattern = torch.tensor([[1., 0.],
                            [0., 1.]])

这里输入的左上角可以找到图案

我们用 nn.functional.conv2d1 - pattern 作为内核执行卷积。

>>> img, mask = x[None, None], pattern[None, None]
>>> M = F.conv2d(img, 1 - mask)
tensor([[[[0., 1.],
          [2., 0.]]]])

当且仅当结果等于模式中 1 的数量时才有匹配:

>>> M == mask.sum(dim=(2,3)))
tensor([[[[ True, False],
          [False, False]]]])

您可以从这个最终的布尔掩码中推断出频率。您可以通过在卷积中添加内核将此方法扩展到多个模式。