チラ裏備忘録

情報整理

Adaptive_avg_pool2dとavg_pool2dの違い

discuss.pytorch.org

test_input = Image.open('test_image.jpeg') # 1024x768
plt.figure(figsize=(12,4))

# avg_pool2d
outputs1 = F.avg_pool2d(torchvision.transforms.ToTensor()(test_input), kernel_size=(4, 4), stride=2, padding=1)
print(outputs1.shape)
plt.subplot(1,2,1), plt.imshow(outputs1.permute(1,2,0))

# adaptive_avg_pool2d
w, h = test_input.size
outputs2 = F.adaptive_avg_pool2d(torchvision.transforms.ToTensor()(test_input), output_size=(int(h*0.5), int(w*0.5)))
print(outputs2.shape)
plt.subplot(1,2,2), plt.imshow(outputs2.permute(1,2,0))

# torch.Size([3, 384, 512])
# torch.Size([3, 384, 512])

f:id:spookyboogie:20210207074729j:plain

avg_pool2dは,カーネルサイズやストライド,パディングを指定し,畳み込み演算を行います.(恐らくカーネルの各係数は,1/(カーネルの画素数))
一方,adaptive_avg_pool2dは,出力サイズを指定すると,自動的にカーネルサイズ等を決定してくれる模様.

リサイズ

tzmi.hatenablog.com
tzmi.hatenablog.com

上記記事によると,縮小(downsample)はadaptive_avg_pool2d,拡大(upsample)はF.interpolate(レイヤとして使用する場合はnn.Upsample)で良さそう?

レイヤとして使用する場合の意味
関数として利用するか,クラスをインスタンス化して利用するかの違いです.
nn.Upsampleは後者にあたり,init時にパラメータを渡してレイヤをインスタンス化しておき,forward上でレイヤとして利用します.
(必ずしもnn.Upsampleである必要はなく,F.interpolateをforward内で使用することも可能かと思います)

# 関数として利用
x = torch.randn(1,1,4,4)
x_out = F.interpolate(x, (8,8)) # 関数として利用

# クラスをインスタンス化して利用
x = torch.randn(1,1,4,4)
m = nn.Upsample((8,8)) # インスタンス化
x_out = m(x)