前回に引き続き、今度はUpsampleの使い方とモードの比較を行います。
構文
Upsampleのモードは下のようになります。Interpolateにあったareaがなくなっています。4階テンソルで選択できるのは、Interpolate同様※のついたところだろうと思います。
- nearest※
- linear
- bilinear※
- bicubic※
- trilinear
interpolateと違い、インスタンス化して呼び出すことにりますので、もしかしたらこっちのほうが使い勝手がいいかもしれません。(前回と比較すると分かりますが、結果そのものはinterpolateとUpsampleとで差異はありません)
- size: 出力データサイズ(タプル)
- scale_factor: データの拡大(縮小)率
- mode: 補間モード
- align_corners: 入出力データの端っこのピクセルの位置を合わせる (default: False)
- recompute_scale_factor: scale_factorを再計算するかどうか(default: False)
torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
動作確認
まずはリサイズ用のテンソルを作成します。これは前回と同じです。
x = torch.arange(0, 16, dtype=torch.float32).view(-1, 1, 4, 4) # tensor([[[[ 0., 1., 2., 3.], # [ 4., 5., 6., 7.], # [ 8., 9., 10., 11.], # [12., 13., 14., 15.]]]])
アップサンプリング
- nearest
import torch.nn as nn upsample = nn.Upsample(scale_factor=2, mode='nearest') scaled_x = upsample(x) # tensor([[[[ 0., 0., 1., 1., 2., 2., 3., 3.], # [ 0., 0., 1., 1., 2., 2., 3., 3.], # [ 4., 4., 5., 5., 6., 6., 7., 7.], # [ 4., 4., 5., 5., 6., 6., 7., 7.], # [ 8., 8., 9., 9., 10., 10., 11., 11.], # [ 8., 8., 9., 9., 10., 10., 11., 11.], # [12., 12., 13., 13., 14., 14., 15., 15.], # [12., 12., 13., 13., 14., 14., 15., 15.]]]])
- bilinear
upsample = nn.Upsample(scale_factor=2, mode='bilinear') scaled_x = upsample(x) # tensor([[[[ 0.0000, 0.2500, 0.7500, 1.2500, 1.7500, 2.2500, 2.7500, # 3.0000], # [ 1.0000, 1.2500, 1.7500, 2.2500, 2.7500, 3.2500, 3.7500, # 4.0000], # [ 3.0000, 3.2500, 3.7500, 4.2500, 4.7500, 5.2500, 5.7500, # 6.0000], # [ 5.0000, 5.2500, 5.7500, 6.2500, 6.7500, 7.2500, 7.7500, # 8.0000], # [ 7.0000, 7.2500, 7.7500, 8.2500, 8.7500, 9.2500, 9.7500, # 10.0000], # [ 9.0000, 9.2500, 9.7500, 10.2500, 10.7500, 11.2500, 11.7500, # 12.0000], # [11.0000, 11.2500, 11.7500, 12.2500, 12.7500, 13.2500, 13.7500, # 14.0000], # [12.0000, 12.2500, 12.7500, 13.2500, 13.7500, 14.2500, 14.7500, # 15.0000]]]])
- bicubic
upsample = nn.Upsample(scale_factor=2, mode='bicubic') scaled_x = upsample(x) # tensor([[[[-0.5273, -0.2305, 0.2461, 0.8750, 1.2812, 1.9102, 2.3867, # 2.6836], # [ 0.6602, 0.9570, 1.4336, 2.0625, 2.4688, 3.0977, 3.5742, # 3.8711], # [ 2.5664, 2.8633, 3.3398, 3.9688, 4.3750, 5.0039, 5.4805, # 5.7773], # [ 5.0820, 5.3789, 5.8555, 6.4844, 6.8906, 7.5195, 7.9961, # 8.2930], # [ 6.7070, 7.0039, 7.4805, 8.1094, 8.5156, 9.1445, 9.6211, # 9.9180], # [ 9.2227, 9.5195, 9.9961, 10.6250, 11.0312, 11.6602, 12.1367, # 12.4336], # [11.1289, 11.4258, 11.9023, 12.5312, 12.9375, 13.5664, 14.0430, # 14.3398], # [12.3164, 12.6133, 13.0898, 13.7188, 14.1250, 14.7539, 15.2305, # 15.5273]]]])
ダウンサンプリング
- nearest
upsample = nn.Upsample(scale_factor=1/2, mode='nearest') scaled_x = upsample(x) # tensor([[[[ 0., 2.], # [ 8., 10.]]]])
- bilinear
upsample = nn.Upsample(scale_factor=1/2, mode='bilinear') scaled_x = upsample(x) # tensor([[[[ 2.5000, 4.5000], # [10.5000, 12.5000]]]])
- bicubic
upsample = nn.Upsample(scale_factor=1/2, mode='bicubic') scaled_x = upsample(x) # tensor([[[[ 2.0312, 4.2188], # [10.7812, 12.9688]]]])