【问题标题】:Finding 2D boolean patterns in larger boolean tensors/arrays在较大的布尔张量/数组中查找 2D 布尔模式
【发布时间】:2021-11-06 22:32:10
【问题描述】:

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

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

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

据我所知,当我们有一个标量值时,torch.where 有效。如果我有一个 6x6 的张量而不是一个值,我不知道该怎么做。 我查看了 Finding Patterns in a Numpy Array ,但我认为将其用于 2D 模式是不可行的。

【问题讨论】:

  • 你试过什么?发布一个最小的例子
  • 我尝试过 torch.where 和 equals,但它们只适用于标量值。

标签: python numpy pytorch


【解决方案1】:

我在想也许你可以使用卷积来解决这个问题。假设您有一个由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.]]]])

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

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

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

【讨论】:

  • 谢谢伊万。我会检查它,并让你知道。
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 2019-03-20
  • 2016-05-05
  • 2016-03-11
  • 2012-11-04
  • 1970-01-01
  • 2021-11-23
  • 2012-02-02
相关资源
最近更新 更多