给定
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 产品,但这并不能概括。
一种选择是使用 torch.repeat_interleave ,如下所示:
torch.repeat_interleave(torch.repeat_interleave(F.max_pool2d(t, 2), 2, dim=-1), 2, dim=-2)
这个 maxpools,然后在每个轴上再次扩展。