所有值都替换为 pytorch 中的 pool max

问题描述 投票:0回答:1

给定

z
等于

tensor([[[[0.0908, 0.1286, 0.6942, 0.5161],
          [0.4227, 0.2154, 0.5990, 0.8666],
          [0.3009, 0.2399, 0.1818, 0.7551],
          [0.2396, 0.4485, 0.4027, 0.5303]],
         [[0.8251, 0.7457, 0.2091, 0.7313],
          [0.3823, 0.7351, 0.3823, 0.2072],
          [0.0863, 0.5489, 0.6515, 0.3855],
          [0.5247, 0.8685, 0.6078, 0.6181]]]])

我们有这个

torch.nn.MaxUnpool2d(2)(*torch.nn.MaxPool2d(2, return_indices=True)(z))
tensor([[[[0.0000, 0.0000, 0.0000, 0.0000],
          [0.4227, 0.0000, 0.0000, 0.8666],
          [0.0000, 0.0000, 0.0000, 0.7551],
          [0.0000, 0.4485, 0.0000, 0.0000]],
         [[0.8251, 0.0000, 0.0000, 0.7313],
          [0.0000, 0.0000, 0.0000, 0.0000],
          [0.0000, 0.0000, 0.6515, 0.0000],
          [0.0000, 0.8685, 0.0000, 0.0000]]]])

我怎样才能惯用地计算一个类似的逆,而不是所有非最大值都为零,而是全部等于最大值?在这种情况下我想要:

tensor([[[[0.4227, 0.4227, 0.8666, 0.8666],
          [0.4227, 0.4227, 0.8666, 0.8666],
          [0.4485, 0.4485, 0.7551, 0.7551],
          [0.4485, 0.4485, 0.7551, 0.7551]],
         [[0.8251, 0.8251, 0.7313, 0.7313],
          [0.8251, 0.8251, 0.7313, 0.7313],
          [0.8685, 0.8685, 0.6515, 0.6515],
          [0.8685, 0.8685, 0.6515, 0.6515]]]])

该解决方案应该适用于所有内核大小、填充和膨胀,并且速度快。例如,在这个简单的情况下,我可以轻松地用

torch.nn.MaxPool2d(2)(z)
计算出我想要的 Kroeneker 产品,但这并不能概括。

deep-learning computer-vision pytorch max-pooling
1个回答
0
投票

一种选择是使用 torch.repeat_interleave ,如下所示:

torch.repeat_interleave(torch.repeat_interleave(F.max_pool2d(t, 2), 2, dim=-1), 2, dim=-2)

这个 maxpools,然后在每个轴上再次扩展。

© www.soinside.com 2019 - 2024. All rights reserved.