【pytorch】max_pool2dしてmax_unpool2dする意味ってなんだろう?


背景

encoderとdecoderのネットワークでmax_poolしてからmax_unpoolしてるのを見て、これは一体なんの意味があるのか気になったので実験してみた

実験

test code

x_4, indices_4 = F.max_pool2d(x_42, kernel_size=2, stride=2, return_indices=True)
x_4d = F.max_unpool2d(x_4, indices_4, kernel_size=2, stride=2, output_size=dim_4)
print("x_4d.shape=",x_4d.shape)
print("x_42.shape=",x_42.shape)

save_image(x_4d[0,0,:,:],"x_4d.png")
save_image(x_42[0,0,:,:],"x_42.png")

output

x_4d.shape= (8, 512, 14, 14)
x_42.shape= (8, 512, 14, 14)

結果

x_4d[0,0,:,:]

x_42[0,0,:,:]

数字で表すとこんな感じ

結論

max poolしてmax unpoolすると、windowの中の最大値以外が0になる。
機能的には強い特徴が強調されるという事だろうか。

参考文献