Pytorch 从统一数据上的最大池中提取索引

Pytorch 从统一数据上的最大池中提取索引,pytorch,Pytorch,我试图在给定内核大小的2D张量中找到最大点,但在一个特殊情况下,所有值都是一致的,我遇到了问题。例如,给定以下示例,我想将每个点标记为最大点: +---+---+---+---+ | 5 | 5 | 5 | 5 | +---+---+---+---+ | 5 | 5 | 5 | 5 | +---+---+---+---+ | 5 | 5 | 5 | 5 | +---+---+---+---+ | 5 | 5 | 5 | 5 | +---+---+---+---+ 如果运行torch.nn.fu

我试图在给定内核大小的2D张量中找到最大点,但在一个特殊情况下,所有值都是一致的,我遇到了问题。例如,给定以下示例,我想将每个点标记为最大点:

+---+---+---+---+
| 5 | 5 | 5 | 5 |
+---+---+---+---+
| 5 | 5 | 5 | 5 |
+---+---+---+---+
| 5 | 5 | 5 | 5 |
+---+---+---+---+
| 5 | 5 | 5 | 5 |
+---+---+---+---+
如果运行torch.nn.functional.max_pool2d时内核大小为3,跨步为1,填充为1,则会得到以下指示:

+---+---+---+----+
| 0 | 0 | 1 |  2 |
+---+---+---+----+
| 0 | 0 | 1 |  2 |
+---+---+---+----+
| 4 | 4 | 5 |  6 |
+---+---+---+----+
| 8 | 8 | 9 | 10 |
+---+---+---+----+
为了获得以下指标,我需要考虑哪些变化

+----+----+----+----+
| 1  | 2  | 3  |  4 |
+----+----+----+----+
|  5 |  6 |  7 |  8 |
+----+----+----+----+
|  9 | 10 | 11 | 12 |
+----+----+----+----+
| 13 | 14 | 15 | 16 |
+----+----+----+----+

您可以执行以下操作:

a = torch.ones(4,4)
indices = (a == torch.max(a).item()).nonzero()

它的作用是返回一个带有最大值2D坐标的
[16,2]
大小的张量,即
[0,0],[0,1],…,[3,3]
torch.max
部分应该很容易理解,
nonzero()
考虑了
(a==torch.max(a.item())
给出的布尔张量,将
False
设为0,并返回非零索引。希望这有帮助

您可以执行以下操作:

a = torch.ones(4,4)
indices = (a == torch.max(a).item()).nonzero()

它的作用是返回一个带有最大值2D坐标的
[16,2]
大小的张量,即
[0,0],[0,1],…,[3,3]
torch.max
部分应该很容易理解,
nonzero()
考虑了
(a==torch.max(a.item())
给出的布尔张量,将
False
设为0,并返回非零索引。希望这有帮助

如果您想要
2d
shape@ccl中的索引,您已经给出了答案,但是对于
1d
索引,您可以首先使用张量生成
x
1d,然后使用张量获得索引,最后转换为相同的形状

x=torch.one(4,4)*5
(x.flatte()==x.flatte().max()).nonzero().重塑(x.shape)+1
张量([[1,2,3,4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])

如果您想要
2d
shape@ccl中的索引,请给出答案,但对于
1d
索引,您可以首先使用张量生成
x
1d,然后使用张量获取索引,最后转换为相同的形状

x=torch.one(4,4)*5
(x.flatte()==x.flatte().max()).nonzero().重塑(x.shape)+1
张量([[1,2,3,4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])

这是个好问题!多个最佳选择中的standard
MaxPool
返回它首先扫描的结果。最好选择最靠近内核区域中间的区域。这是一个好问题!多个最佳选择中的standard
MaxPool
返回它首先扫描的结果。最好选择最靠近内核区域中间的区域。谢谢,在这种特定情况下,这会给出请求的输出,但在max情况下不会;然而,它能够推动我找到正确的解决方案。知道非零()是有用的。为了推广这一点,您可以在输入上使用max pool,然后从输入中减去激活(即maxpool输出),然后使用此技术,但对于等于0的单元格(与非零()相反)。谢谢,在这种特定情况下,这会给出请求的输出,但在max情况下则不会;然而,它能够推动我找到正确的解决方案。知道非零()是有用的。为了推广这一点,您可以在输入上使用max pool,然后从输入中减去激活(即maxpool输出),然后使用此技术,但对于等于0的单元格(与nonzero()相反)。