Adaptive_avg_pool2dとavg_pool2dの違い
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])
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)