在较大的布尔值 tensors/arrays 中查找二维布尔值模式
Finding 2D boolean patterns in larger boolean tensors/arrays
我正在寻找一种使用 pytorch 或 numpy 在 MxNxR tensor/array 中查找二维图案的方法。
例如,查看布尔模式张量字典(例如 {6x6 : freq})是否存在于更大的布尔张量(例如 3x256x256)中。
然后我想更新我的字典的模式和频率。
我希望有一个 pytorchi 的方式来做它,而不是在它上面循环,或者有一个优化的循环来做它。
据我所知,torch.where 在我们有一个标量值时有效。如果我有一个 6x6 的张量而不是一个值,我不确定我该怎么办。
我调查了 ,但我认为将其用于二维模式是不可行的。
我想也许你可以使用卷积来解决这个问题。假设您有一个由 0
和 1
组成的输入。这里我们将举一个最小的例子,其中 u=input 为 3x3
和 2x2
模式:
>>> x = torch.tensor([[1., 0., 0.],
[0., 1., 0.],
[1., 0., 0.]])
模式将是:
>>> pattern = torch.tensor([[1., 0.],
[0., 1.]])
这里输入的左上角可以找到图案
我们用 nn.functional.conv2d
和 1 - 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]]]])
您可以从这个最终的布尔掩码中推断出频率。您可以通过在卷积中添加内核将此方法扩展到多个模式。
我正在寻找一种使用 pytorch 或 numpy 在 MxNxR tensor/array 中查找二维图案的方法。 例如,查看布尔模式张量字典(例如 {6x6 : freq})是否存在于更大的布尔张量(例如 3x256x256)中。
然后我想更新我的字典的模式和频率。
我希望有一个 pytorchi 的方式来做它,而不是在它上面循环,或者有一个优化的循环来做它。
据我所知,torch.where 在我们有一个标量值时有效。如果我有一个 6x6 的张量而不是一个值,我不确定我该怎么办。
我调查了
我想也许你可以使用卷积来解决这个问题。假设您有一个由 0
和 1
组成的输入。这里我们将举一个最小的例子,其中 u=input 为 3x3
和 2x2
模式:
>>> x = torch.tensor([[1., 0., 0.],
[0., 1., 0.],
[1., 0., 0.]])
模式将是:
>>> pattern = torch.tensor([[1., 0.],
[0., 1.]])
这里输入的左上角可以找到图案
我们用 nn.functional.conv2d
和 1 - 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]]]])
您可以从这个最终的布尔掩码中推断出频率。您可以通过在卷积中添加内核将此方法扩展到多个模式。