torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0)
Maxpool2d
的逆过程,不过并不是完全的逆过程,因为在maxpool2d的过程中,一些最大值的已经丢失。 MaxUnpool2d
的输入是MaxPool2d
的输出,包括最大值的索引,并计算所有maxpool2d
过程中非最大值被设置为零的部分的反向。
注意:MaxPool2d
可以将多个输入大小映射到相同的输出大小。因此,反演过程可能会变得模棱两可。 为了适应这一点,可以在调用中将输出大小(output_size
)作为额外的参数传入。具体用法,请参阅下面示例
参数:
- kernel_size(
int
ortuple
) - max pooling的窗口大小 - stride(
int
ortuple
,optional
) - max pooling的窗口移动的步长。默认值是kernel_size
- padding(
int
ortuple
,optional
) - 输入的每一条边补充0的层数
输入:input
:需要转换的tensor
indices
:Maxpool1d的索引号output_size
:一个指定输出大小的torch.Size
大小:input
: (N,C,H_in,W_in)output
:(N,C,H_out,W_out)
也可以使用output_size
指定输出的大小
import torch
import torch.nn as nn
import torch.autograd as autograd
# # pool of square window of size=3, stride=2
# m = nn.MaxPool2d(3, stride=2)
# # pool of non-square window
# m = nn.MaxPool2d((3, 2), stride=(2, 1))
# input = autograd.Variable(torch.randn(20, 16, 50, 32))
# print(input.shape)
# output = m(input)
# print(output.shape)
pool = nn.MaxPool2d(2, stride=2, return_indices=True)
unpool = nn.MaxUnpool2d(2, stride=2)
input = torch.tensor([[[[1., 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]]])
print(input.shape)
output, indices = pool(input)
print(output)
print(output.shape)
result = unpool(output, indices)
print(result.shape)
print(result)
# # 也可以unpool的结果的size和input不同
# result = unpool(output, indices, output_size=torch.Size([1, 1, 5, 5]))
# print(result.shape)
# print(result)
torch.Size([1, 1, 4, 4])
tensor([[[[ 6., 8.],
[14., 16.]]]])
torch.Size([1, 1, 2, 2])
torch.Size([1, 1, 4, 4])
tensor([[[[ 0., 0., 0., 0.],
[ 0., 6., 0., 8.],
[ 0., 0., 0., 0.],
[ 0., 14., 0., 16.]]]])